Redact when the document is served, not only when it is signed
The redaction was applied at flatten time, which is after signing. Everything before that — the whole signing session — was served the raw source: fetchDocument...
Open a workspace on its OWN domain, not the host the sign-in was served from
A member who signed in on login.kamocrm.com, picked a workspace from the chooser, and landed inside it — on internal.kamocrm.com, wearing the platform's hostnam...
An em-dash in a comment, not its escape
— is processed by javac before the file is even tokenised, so it compiled to the same character it renders as here — but the source read as the escape.
Fill a rectangle, honour a highlight's opacity, and redact
Three things about the way a prepared document renders the designer's marks. A rectangle was drawn as an outline, so the fill a member now picks to cover somet...
Put the designer's annotations into the signed document
flatten() applied blank pages, rotations, modifiers, field values, page order and certificates. It never drew the annotations. A rectangle, a highlight or an ar...
OrgBranding gained a sixth component and this stub kept passing five
Broken on main since e9faf11. The image build runs mvn package -DskipTests, so nothing has been compiling the test tree and no red build ever said so — but it m...
Draw a rectangle's fill in the signer's view
The designer can now give a rectangle a fill and an opacity, which is how a member covers something up. This renderer drew fill="none", so the signer saw an emp...
Make the rectangle tool something you can hide things with
The rectangle tool has been in the annotation toolbar all along, but it drew an outline: fill="none" in every renderer. There was nothing to hide anything with,...
PdfRedactor, so a covered word is actually gone
A filled rectangle drawn over an account number hides it from the eye and from nothing else: the glyphs stay in the page's content stream, and a copy-paste or a...
Report a failed association at WARN, not at DEBUG
Lead association swallows its failures on purpose — a problem attaching a message must never break the sweep that was reading the mailbox — so the log line is t...
Flush the link, so a refused write reaches the catch that reports it
link() is @Transactional(REQUIRES_NEW), so its transaction commits in the proxy after the method body returns. A plain save() of an entity whose id is generated...
Print the whole quote, not just its first page
The print stylesheet reset the Dialog's container and its Paper to static flow but left the Dialog ROOT alone — the element this component labels quote-print-po...
Keep an option card and its lines off a page break
The per-option line table was added without the page-break rules its sibling table has, so a long option could be cut across pages mid-row.
Link the articles a draft names
The authoring convention is to name a sibling article by putting its title in italics — "Read *Security Roles Explained* before building them". 181 spans across...
Rebuild against kamo-shared-library HEAD
Ships the lead contact location fix, which lives in the shared library: LeadDTO now returns the lead's own country, subdivision and timezone, so the three Prima...
Save the Primary Contact country, state and time zone
The Primary Contact card's country, state and time zone are top-level Lead fields — neither members of primaryContact nor of addressMailing — and the two wire b...
Return the contact's country, state and time zone
LeadDTO carried neither Lead.country, Lead.subdivision nor Lead.timezone, so the three fields were write-only: UpdateLeadRequest accepted them and LeadService w...
Hold withTermsUnchanged to carrying every field
The method rebuilds UpdateQuoteRequest positionally, so a field added to that record and forgotten here is dropped from every save by a member without EDIT_QUOT...
Stop dropping setupFee on save, and unbreak the build
withTermsUnchanged rebuilds UpdateQuoteRequest positionally for a member who may not rewrite the terms. setupFee was added to that record and not added here, so...
Read either address shape so the block cannot go blank
Reading only the new addressLines makes the address disappear when the API has not been rebuilt yet and is still sending addressLine plus addressDetails. A blan...
Read either address shape so the block cannot go blank
Reading only the new addressLines made the address disappear from the printed quote outright, because this shipped ahead of the API that sends it and a server s...
Rebuild against kamo-shared-library HEAD
Ships the quote document work, all of which lives in the shared library: - a one-off setup fee on a single-price quote (commerce_quotes.setup_fee, which is a...
Print the address as the lines it is written on
Splitting the suite into its own field left the street and the city still sharing a line, with the unit printed beneath them. The address now arrives already sp...
An address is several lines, so send it as several lines
Splitting the suite out of addressLine was not enough — it left the street and the city sharing a line with the unit printed beneath them, which is worse than t...
Print the address as the lines it is written on
The address arrived as one string, so a real one came out as '4300 West Tropicana Ave Building A Main Floor Suites 110-132, Las Vegas, NV 89103' — not something...
A setup fee on a single-price quote, and the suite on its own line
The setup fee existed only on multi-option quotes, so 'One price' had no box for one — on the form or on the printed page. It now sits beside Shipping, appears ...
Commerce_quotes.setup_fee
A one-off setup fee on a quote that presents a single price. The fee already existed on QuoteOption, where each alternative carries its own; a flat sheet had no...
A setup fee on a single-price quote, and the suite on its own line
Two things a quote could not state. A one-off setup fee lived only on QuoteOption, where each alternative carries its own. A flat sheet has no option to hang o...
The suite on its own line, and a setup fee on a single-price quote
Two things the printed page could not say. An address arrived as one comma-joined string, so 'Suite 400' ran into the street and the city — not how an address ...
Reprice stored quote totals through the pricing engine
Quote money columns are written, not computed on read, so the two corrections that landed on 2026-09-02 — a unit price is a per-month rate the term multiplies, ...
Expose repricing as a static so a backfill can reuse it
Quote money columns are written, not computed on read, so an engine correction leaves existing rows carrying the old arithmetic until something saves them. A mi...
Print the full line on the customer's quote
Each line showed a name and an amount. That asks the customer to take the quantity, the unit, the rate and any reduction on trust, and leaves them nothing to ch...
Print the full line on the quote, and stop losing work at the mode switch
Two things a quote could not do. The printed line items inside an option card showed a name and an amount, nothing else — no quantity, no unit label, no rate, ...
Re-issue a share link from its row, and stop losing the one-time URL
The Share links list offered no way to view or copy a link, and nothing explained why. Nothing can reveal an existing one — only the token's SHA-256 is stored, ...
A share link's email was dropped twice before it could be sent
"I created a link and got no email." Two independent silent drops, both of which return a swallowed false that the panel rendered as plain success. 1. kamo.ema...
Pin the quote letter's dotted templateKey, as the HR family already is
The constant is not the templateKey. CanonicalTemplateLoader.load derives only the FILENAME from the constant (QUOTE_SENT -> quote-sent.json) and reads template...
Restore the timestamp that every lead association depends on
A method was inserted between @CreationTimestamp and the dateCreated field it annotates, so the annotation bound to subject() instead. These entities are read b...
Re-derive the rail's hover-peek instead of trusting two events
The collapsed rail's peek state was written by exactly two things, pointerenter and pointerleave on the rail itself, and nothing ever re-derived it from where t...
Send MUI's styles with the markup that needs them
internal.kamocrm.com was serving a 1.34 MB document containing 123 `css-xxxx` class names — `MuiBox-root css-e26q24` among them — and not one rule for any of th...
A reopened conversation is the one you were having
A member started a chat about KB articles, minimized it to its hexhead, went to their mail and brought the window back to a blank conversation — "having to star...
Read a new lead's phone number against the country it is in
The New Lead form asks which country the lead is in, then ignored the answer when reading their phone number. Both PhoneField instances and the validator fell t...
Do not follow a protocol-relative link in-app
"//example.com" starts with a slash but is another origin. The in-app branch matched it and would have handed router.push an off-site destination; it belongs in...
Drop a @Transactional that never applied
loadCatalogue is reached from catalogue() on the same bean, and self-invocation does not pass through the proxy, so the annotation was decoration. The query is ...
Rebuild against kamo-shared-library HEAD
Ships the quote pricing fix: a unit price is a per-month rate, so a term multiplies it rather than the engine dividing down to it. An annual option quoted one m...
Mirror the monthly-rate reading in the editor preview
previewOption divided the line-item sum down to a monthly figure the same way the server did, so the card and the print preview showed one month of any term. A ...
A unit price is a MONTHLY rate, so the term multiplies it
The engine treated an option's line-item sum as the price for the whole billing period and divided down to reach a monthly figure. It is the other way round. P...
Follow a link without losing the conversation
Reported alongside the KB links all pointing at one article: "when it is fixed and they will work, please let the AI chat still hover on top so you don't have t...
Resolve the articles a passage names into link targets
A hub article — "Setting Up Your Organization — A Checklist" is one — exists to send the reader to a dozen others, and names every one of them in plain text. Th...
A KB link goes to the article its text names
A member asked how to set their org up and got the setup checklist back, each step naming the article that explains it. All three links pointed at the same arti...
Keep the words typed after an inserted photo
The same reported message had a sign-off underneath its photo. That did not arrive either — the reading pane showed an empty body above the attachment. There i...
Je, unaona nini kuhusu usafiri?
Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.