Allow-list countries alongside geo blocks
The geo section only ever denied: a country was blocked or it was absent. Orgs that want to serve one country had to enumerate every other one, which is unmaint...
Move System Debug under Platform Administration
**************** diagnostics are operator tooling, not an access rule, so the tab now sits at **************** behind the platform-admin guard instead of MANAGE...
PHI access audit tab layout + its missing menu entry
The tab rendered its content flush against the card border: SettingsView's tab panel supplies no padding of its own, and this tab was the one manager that never...
Read quality on adjustments and guideline versions
An assembled price is a base cell PLUS the adjustments stacked onto it, so judging only the cell judges half the number: a cleanly-read 99.875 with a misread -1...
Browsers kept serving a stale app bundle after every deploy
index.html shipped a hardcoded `libs/app.bundle.min.js?v=139` that no build ever changed, the bundle filenames are stable, and nginx sent no Cache-Control at al...
Open links back into this app in the tab the member is already in
Mail in the reading pane opens every link in a new tab, which is right for the whole internet and wrong for us. Our notification emails are almost entirely link...
The avatar fallback URL could never resolve
Both avatar-lookup catch blocks built **************** Avatars moved to the fixed, domain-independent `platform/` prefix (SecurityService AvatarObjectPaths) whe...
Colibri-ws proxying always 502'd — nginx had no resolver
The /colibri-ws/<jvb-id>/ location builds its upstream from a capture group. nginx resolves such names at request time and only when a resolver is configured, s...
Fall back through every number the agent holds
An extension with no org line to hang it off is undialable, so the resolver falls back to a number the member actually has rather than publishing nothing.
Publish the agent's cell when it is the only number they have
An agent's number can live in any of three columns and commonly sits in only one: e_phone_number on the team member, m_phone_number and m_cell_number on the mem...
Cleaner invite mark in the chat message
The chat invite led with the video-camera emoji, which the message renderer scales to 1.4em — so it landed as an oversized colour sticker rather than an icon. R...
A dead avatar URL rendered a permanent broken image instead of initials
A participant whose photo is missing from storage showed a broken-image icon to everyone else in the call, forever — it never degraded to initials. Upstream ca...
Per-cell extraction confidence + eligibility-matrix provenance
Two gaps in the confidence model, both on the money path. PER-CELL. A sheet-wide floor is the wrong grain for judging one price: a single badly-read coupon dra...
STUN answered on the wrong node, so kamocrm.com:3478 was dead
coturn is hostNetwork with no nodeSelector, so it was scheduled on k3m1 (public 47.181.8.87). Its own --external-ip, and every client's `stun:kamocrm.com:3478`,...
Stop classifying a multipart/related HTML root as an attachment
Every transactional email we send with an inlined org logo arrived in our own /messages viewer with a correct subject and a completely empty body. isAttachment...
Bridge advertised only private ICE candidates — no meet had media for 35 days
The bridge never completed a single ICE connection in the 35 days this pod has been up (0 successes, 18 terminations). Every conference joined over XMPP fine an...
Show the agent's phone, toll-free and email on the customer's copy
Show the agent's phone, toll-free and email on the preview
Each on its own line: a run-on of two numbers and an address reads as one string and gets dialled wrongly.
Resolve the agent's published contact details
Email comes from the member's primary mailbox rather than TeamMember.emailWork — that column is free text predating mailbox provisioning and routinely disagrees...
Publish every way to reach the agent, not just a name
Name and title alone tell a customer who owns the quote but not how to ask about it. The block now carries email and phone, resolved by the caller — the primary...
Extraction confidence on the catalog spine + auto sign-off basis
A price is only as trustworthy as the sheet it was assembled from, and nothing on the pricing path carried that signal: confidence existed ONLY on pre-promotion...
Send the company line as text, not markup
Pairs with the template fix in kamo-shared-library. Per-org template rows are insert-only, so the rows seeded before the markup change still wrap this variable ...
The opportunity templates own their own markup again
The company line was changed to arrive as a complete <p> element from the sender, so an absent company would not leave an empty paragraph. That was the wrong tr...
An approver who files a request still gets the approver email
The actor was stripped from every audience, so an approver who raised a request was cut from their own notification about it — and in an organization with a sin...
Quotes tab — every quote across the account's leads
A server-paged DataGrid beside Leads, with search over number and title, status, total range and created-date range. Filters share one debounce and collapse in...
GET /quotes/account/{uid} — paged, filtered, sorted
Dates arrive as ISO strings and parse leniently: a filter the client sends badly should narrow nothing rather than 400 the whole grid. A date-only "to" bound co...
Page and filter an account's quotes in the database
An account view needs every quote across all its leads. Loading them to render a page degrades every month the account is in use, and any total shown would only...
Show the assigned agent on the customer's copy
Matches the staff preview: the letterhead names the org, this names the person to ask.
Show the assigned agent on the preview
A "Your contact" panel above the footer — name, title, phone and email — so the customer knows who to ask about the price. Absent entirely when the lead is unas...
Resolve the agent alongside the customer, from one lead lookup
Both blocks come off the same lead, so the controllers fetch it once and derive each from it rather than hitting the service twice per render. Still org-scoped ...
Name the lead's assigned agent on the document
The letterhead identifies the org, but a customer with a question about a price needs the person who owns the relationship. The quote now carries the lead's ass...
Liveness probe could never pass — cause of 920 restarts in 35 days
Root cause: the liveness probe was `tcpSocket: port 10000`, but Scylla's REST API binds to api_address 127.0.0.1 (its default) while a tcpSocket probe dials the...
Reassign the agent holding an opportunity
The approver's dialog gains an agent picker, drawn from the same pool the backend validates against. The grid's Agent column now shows who HOLDS the opportunity...
Reassign the holding agent, and email everyone it affects
An approver can now hand an opportunity to a different agent. The requester is never rewritten — applyPrimaryAgent records the move as its own history row with ...
Preview samples for the nine opportunity notifications
Without an arm here the admin Email Templates editor renders every placeholder blank, so anyone customising these nine would be editing an empty skeleton. One ...
Reassignable primary agent on a reserved opportunity
PRIMARY_AGENT_MEMBER_ID is who holds the opportunity now; REQUESTED_BY_MEMBER_ID is left untouched forever. Nullable with no backfill on purpose — null means "n...
Reassignable primary agent, and nine notification templates
An approver can hand an opportunity — and the commission with it — to a different agent. PRIMARY_AGENT_MEMBER_ID is who holds it now; REQUESTED_BY_MEMBER_ID is ...
Stop rounding the lead id through a JS number
Number("1189175700550025222") is 1189175700550025200 — lead ids are unique_rowid() values above Number.MAX_SAFE_INTEGER. The quotes pane converted the route par...
Overall commission, market defaults, and no pre-picked units
Three changes to how commission is captured. Nothing is pre-selected any more. Percent/Amount and One-time/Recurring both start unset on every commission split...
Agree an overall commission at approval, seeded from the market
The approver now records what the organization pays on the sale to the requesting agent and their group. Omit it on approve and the lead's market default applie...
Commission columns for reserved opportunities and market defaults
Six nullable columns: the overall commission agreed on a reserved opportunity, and the market default that pre-fills it at approval. NUMERIC(19,4) to match the ...
The overall commission on a sale, and market defaults for it
A reserved opportunity now records what the organization pays out of the sale to the requesting agent and the group they share with — the pot the per-colleague ...
Carry lead ids as strings — a JS number silently corrupts them
Lead ids are CockroachDB unique_rowid() values above Number.MAX_SAFE_INTEGER: 1189175700550025222 becomes 1189175700550025200 the moment it touches a JS number....
Manage ScyllaDB through deploy-services instead of by hand
scylladb/ held complete manifests but had no deploy step — the comment said it was "deployed MANUALLY after the 16TB drive swap" because the data dir /mnt/backu...
Resync drifted manifests with live before enabling full reconciles
Auditing what a full reconcile would apply turned up two manifests that had drifted far enough from the cluster that re-applying them would have caused an outag...
Rename cluster ratestack-scylla -> kamo-scylla, correct ownership docs
This instance is kamo's: it backs the `kamouniverse` keyspace (read/written by **************** through the scylladb-direct ExternalName) and the `audit` keyspa...
Render the client's details on the preview, from the lead
Removing the quote's own addressee fields left "Prepared for" blank, because customerName only ever came from a linked Account and lead-raised quotes have none....
Show the client's details on the customer's copy
Company heads the block when there is one — a quote to a business is addressed to the business, with the contact named beneath it. Matches the staff preview exa...
Resolve the addressee lead for both the staff and customer views
Org-scoped in both places. On the public page the scope comes from the share link's own organization, so a token can never surface a lead belonging to another t...
Put the client's details on the document, read off the lead
Dropping the quote's own addressee fields left the document with nothing to say about the client: customerName only ever came from a linked Account, which lead-...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.