Changelog
What's new.
Every improvement to the platform, as it ships.
· SecurityService
A report scoped by the reporting line gets the caller's line, whatever their rights
Owner, 2026-11-02: a generic right opens a report about people's activity and never widens its rows. For a definition marked scopedByReportingLine(), the resolver now answers from ReportingLine over the cached org graph: the org owner (the graph's owner flag) sees the organization; anyone else gets TEAM over everyone below them, however deep (SELF when nobody is), and never a peer or anyone above. A graph that can't be read leaves SELF. Break-glass still widens, as for every report. Every other report is unchanged.
· kamo-shared-library
One org SI record, and drafts take their voice from an SI, never a typed profile
The org's SI is si_floor_settings.si_member_id alone: automation_outreach_settings no longer maps its own copy, so the Automation Streams page and SI settings can't disagree. The typed triage voice profile is retired. A member instead chooses whose voice their drafts are in (draft_voice: the org's SI, or their own SI Assistant). Both tables were empty, so nothing a person wrote is lost.
· kamo-shared-library
Floor Activity, each person's calls on their reporting line
A Report Studio report over the dial ledger, counted by DialTally so it can't disagree with the scoreboard: dials, conversations, confirmed conversations, connect rate, appointments, voicemails, no answers, talk minutes, first texts and minutes to first text, and the last dial, one row per person. Work the Call Floor or Manage the Call Floor opens it; scopedByReportingLine() has ReportScopeResolver decide the rows: your own calls and everyone's below you through the member profile's manager field, however deep; never a peer or anyone above you; the organization owner sees everyone. The member picker can only narrow inside that. A narrowed read finds its members' attempts by the member index, then reads those attempts' rows; only the owner's read is the org's range. Both are capped and say so. Automation stream outcomes are not in it: runs and steps carry no member.
· kamo-shared-library
The reporting line decides whose calls a screen shows
Owner, 2026-11-02: a generic right such as Manage the Call Floor opens a screen and never widens its rows. Adds the pieces both Report Studio and the floor panes read: - ReportingLine: a member's own id plus reports(member, true) of the org graph, however deep; the org owner (the graph's owner flag) is the root and sees everyone; an unknown member sees only themselves. - **************** a report whose rights only open it, so ReportScopeResolver hands it the caller's line. - **************** TEAM over the line, with a note that names it. - DialTally.forMembers(): the same counts over only those members, so totals can't count anyone outside the line either.
· SecurityService
A new role on a deal is a Sales Floor notice
The deal-role bell card goes out as SALES_FLOOR (kamo-shared-library 3ea204a5) instead of GENERAL, so a member who mutes the floor mutes it too, and one who mutes GENERAL still hears about their deals.
· EmailService
Sales Floor notices are gated on the Leads right
SALES_FLOOR (kamo-shared-library 3ea204a5) is gated on VIEW_LEADS: every owner, floor worker and deal-role holder holds it today, where a floor right would silence owners and lead owners with drafts in the send queue. It lists just before the lead callback and has its own spoken line.
· kamo-shared-library
The sales floor gets its own notification kind
SALES_FLOOR, appended last, so a member can silence the floor (review items, stopped runs, the send queue, a stream's Notify step, deal roles, briefings and captures) without silencing everything else that arrives as GENERAL. Stored as a string; member_notifications.kind and the channels table carry no CHECK constraint, so no DDL. Gated on VIEW_LEADS in both gating maps.
· kamo-internal
Start leads in a stream, stream settings, state rules and people not to start
Start In Stream on the lead grid and on an import, stream settings on the canvas, the new step fields, State Rules and People Not To Start in Contact Rules, the match card in the review queue, Sends As in the send queue, and Current Rate on the lead. Help for each. The proxy takes DELETE where the new lists need it.
· EmailService
Stream emails print the sender's and the org's NMLS and the equal housing mark
Saved and written stream emails alike, above the address and unsubscribe. Only for an org with an NMLS number.
· SecurityService
Select leads by view or import, state rules, and a stream sets a lead field
An import records the leads it made. A read gives the ids a saved view, source or import stands for, under the grid's own floor, capped and timed. Contact rules take state rules.
· kamo-shared-library
A line for bulk starts, stream settings, state rules and a list of people not to start
New tables for the line, per-stream settings, state contact rules and the people list, a record of the leads an import made, a current rate on the lead, and new merge fields. OutreachCheck reads state rules, which only narrow an org's hours. An entry behind inbound leads reads last, so a long bulk line can't push a new lead past the list's cap. All dark.
· kamo-internal
Spoken words and notes for the caller look nothing alike, on every surface
ScriptBlockView is the one rendering: Say This is large in a solid frame, For You Only is small and set in, in a dashed tinted panel, with its own icon and words. The teleprompter steps through speech with notes set apart, a blank in a spoken part is flagged before it is read, and the composer requires a kind on every part with a live preview. Saving keeps a part's heading now.
· KBService
Carry a block's kind
Builds on the shared library's new column.
· kamo-shared-library
Every script block says whether it is spoken or for the caller alone
The kind column was added by hand first. Only an explicit SAY is speech; anything unset reads as agent only, so a block nobody classified can never pass for words to read aloud.
· kamo-internal
The fix pass, one Media socket, and help that matches
A card drags by touch and lands under the pointer. Every MediaService hook shares one socket. A cockpit org starts each member on a short set for their role. A stream trigger can name stages and carry a stop rule. Bulk switches leave SI loan access alone, saved views keep their market by id, the palette opens only what a member can use, and the settings landing has cards for the floor's tabs. Build assets leave the per-address limit, and the socket key retries a rollout's race.
· SecurityService
Stage events, per-loan money on the own-loans rule, and deal role notices
A stage move writes its own stream event, so a stream can tell stages that share a status. Loan money, its rollups, goals and report reach only a member's own deals without View Mortgage Pipeline. A newly assigned person hears about a deal role, and a person's stream Start or Stop reaches lead history.
· EmailService
Stream emails reach the lead's timeline
· VOIPService
Forward a provider voice agent's finished call
· MediaService
Webinar and demo leads start their streams
· kamo-shared-library
Stream outbox for claims, status frames, and a report's own-records rule
A credit claim writes LEAD_ASSIGNED, a status change reaches floor panes, a run can be asked about by lead and stream, and a report can name a second right that it needs to read past a member's own records. Loan Revenue & Cost uses it.
· kamo-internal
Kamo Help lives in the article browser, and articles open in the page
The separate help shelf is gone. Kamo's articles sit at the bottom of the left tree on a tinted panel, drawn by the same rows and read only. The console and an article being read share one browser in the layout, so moving between articles keeps the tree in place on an ordinary, shareable route. On a phone the tree folds behind a Browse Articles button. Search finds both, labelled, and none of Kamo's articles enter the organization's counts.
· EmailService
Fill the one merge field list, so a saved email reads the same in a drip
· kamo-internal
Sales scripts on the canvas, the call floor and the Interaction Center
A call step picks a script and variants, shown on the card with a link to edit. The call floor and the Interaction Center open that script, stay in step, and a teleprompter takes over during a call. One merge field list and an Insert Field picker across scripts, steps, saved emails and a new Saved Texts tab. Duplicate a script, preview a step on a real lead, and see calls by script on the Scoreboard. A booking link and digital card are two more profile links. Help articles follow.
· KBService
Duplicate a sales script
· kamo-shared-library
One merge field list, a script on the call list and dial ledger, and duplicate
MergeFields is the one list a script, stream step or saved template fills from, with older spellings kept as aliases. script_id on call_list_entries and dial_ledger was added by hand first. DialTally counts calls by script by the board's own rules.
· kamo-internal
A help popup on every sales floor page, switch and feature
HelpArticleLink opens one popup in place: a short summary first, then the full article from the knowledge base, with search, related articles, Back, deep links, a phone sheet and a graceful state when an article isn't open to the reader. Text comes from the KB. Only a short summary lives in the dictionary. Each floor page, settings tab, card and home pane carries it. /kb shows the platform's help on a labelled, read-only shelf outside the org's counts. The Automation tab gains two groups, Leads and pipeline and Your other loan system. That group has no Turn all on, so one press can't read as approving other-system work. Labels only: no switch or stored key changes. SI settings links to the SI loan access switch. Adds 41 articles under Sales Floor, audience Members.
· kamo-shared-library
Group the Automation tab's lead and other-system switches
Two new groups: Leads and pipeline, and Your other loan system. Labels only. A switch is stored and checked by its own name, so what it does is unchanged. The refusal for an SI text uses the switch's new name.
· KBService
Any organization may read the platform's published help
KbReaderScope gets one exception to its organization rule: a reader in any other organization may read a platform article that is active, published and open to Public or Members. Nothing else crosses. A customer's maintainers and authors get no rights over it, and a customer's team member is not the platform's team, so a team-only platform article stays with the platform. Versions, suggestions and every write stay on the reader's own organization. /api/kb/help serves the tree, search and articles from a projection held for a minute, so a list loads no bodies. It needs a session and no other right.
· kamo-internal
The board fills its width, and the lead and loan cards follow the org's colours
· kamo-internal
The floor's settings tabs as full-width card grids

Your universe is waiting.
Start free in minutes. Add products whenever you are ready — no migration, no new logins.
Free forever — no credit card required