Recordings keep their transcript as timed turns with speakers
RECORDINGS.TRANSCRIPT_TURNS (TEXT, nullable; DDL applied by hand 2026-11-06) holds the transcript as timed turns, each naming who spoke when it is known. The pl...
Back-to-home button on Email, Analytics, Support, Reports, Meetings, Changelog, Shared Devices, Supervised Chats
Org and member landing links for tracking codes
GET **************** returns the org's link configuration and the caller's own extra links; PUT /links/org (MANAGE_REFERRAL_CODES) and PUT /links/me (VIEW_REFER...
The reading-pane subject no longer collapses to one letter per line
The action buttons were flex-shrink-0 beside a min-w-0 title, so in a narrow pane they took the whole row and the subject got zero width. The header now wraps a...
SI infrastructure alerts, and LiveKit alerts page the SI on-call people (SIE1)
**************** (applied by hand, restarts nothing): a blackbox Probe of jicofo, prosody, the meeting ear, FreePBX's console, the Tool Plane, aiservice and kam...
One policy decision point for every SI channel, with one explainable decision record (SIE2)
PolicyDecisionPoint answers every authorization question the Tool Plane pipeline asks, in the same order: visibility + rights floor, No Insubordination order an...
The Live Changes pane shows the newest ten
Still loads thirty, so the Features and Fixes tabs have ten of their own to show; a live arrival pushes the oldest off the pane. Everything older is on /changel...
SI incidents, on-call roster and settings, health samples entities (SIE1)
The five SIE1 tables (si_incidents, si_incident_events, si_oncall_members, si_oncall_settings, si_health_samples) declared so KamoInitializer can recreate them....
Golden files over every existing SI authorization decision, before the policy decision point (SIE2)
Charter outcome matrix (1376 cases), every catalogue tool's static decisions (identity open/reply, on-behalf, order call scope, visibility for SI/floor/person s...
Live Changes — the launchpad widget and the /changelog page
Every change the platform ships, live: new entries slide in the second they are sent, each badge fills as CI reports the build and the deploy, and a push lands ...
No client may SEND to /topic/platform/changelog
Live Changes is broadcast to every session; a forged frame would put a change that never happened on every launchpad at once. SecurityService is the only writer...
Live Changes — deployment tracking, live frames and the members' feed
- The push webhook records each push to main as a CommitDeployment and stamps its commits with it, then publishes the new entries on security.platform.changel...
Live Changes — commit deployments and the VIEW_LIVE_CHANGES widget rights (690-695)
CommitDeployment (COMMIT_DEPLOYMENTS) is one push to main, keyed by its head commit, and how far CI has carried it. CommitLog.deploymentHash points each entry a...
Let SecurityService read Forgejo's CI statuses for Live Changes
The Live Changes deployment tracker asks Forgejo (a host process on k1m1, port 3000) where each push is in its pipeline. avatar-resolver-egress allowed only Yug...
The phone's session header signs in a READ, so KamoMobile can open help, scripts and tasks
KamoMobile calls api.<org> with X-***-Token and cannot mint an OTK, so every KBService read it made (the Password Vault's help article, sales scripts, task list...
Read the address bar's text.content, and pass a shell secret in run_shell's env map (TPVAULT phase 2, live)
Live on a test SI's workstation the address bar's text sat 372 characters after its name; read the node's own content first so a longer states list can't push i...
The Activity shows each person's own avatar and a plain device name, never a raw user agent
A proper 32-byte key for saved provider API keys, no default, no plaintext fallback (TPVAULT side fix)
AI_PROVIDER_KEY (Secret ai-provider-key, 32 random bytes) or the service will not start; new values are v2: + AES-256-GCM with associated data. The old padded-s...
Allow This Site on an SI's refused fill, in the vault's Activity (TPVAULT phase 2)
Call Log recordings play in the shared Media Player window
The Listen button opens the existing media-player tool window instead of a second inline player. The tool gains a callLogId source for recordings the phone prov...
Vault_list, vault_fill and vault_run_shell, fill-only by reference (TPVAULT phase 2)
The SI names an item; the Tool Plane reads the focused window and the browser's address bar from the machine itself, asks VaultService (which checks the site bi...
VaultItem.allowedHosts, the sites a supervisor approved for an SI's fills (TPVAULT phase 2)
Password Vault under Organizer (TPVAULT phase 1, with phase 3 screens)
/vault: your own vault and the vaults of SIs you supervise; items by type (sign-ins, API and SSH keys, recovery codes, authenticator keys, Wi-Fi, computer sign-...
Password Vault relay and 5-minute re-confirm; attempt limit on the hosted-computer password confirm (TPVAULT)
/api/security/vault/** resolves the session, refuses impersonation, computes the re-confirm freshness on every request (the KREAUTH password marker within 5 min...
VAULT_RECONFIRM_CODE canonical email for members without a password (TPVAULT)
The Call Log shows each member's photo and their profile card on hover
Rows wrap the member in the shared MemberHoverCard and warm the member-card cache, so faces are photos rather than initials; the team-member picker warms the sa...
Password Vault entities and VAULT_* access-log events (TPVAULT)
Seven tables for the Password Vault (vaults, items, encrypted fields, an append-only access log, shares, emergency requests, known devices), declared here so Ka...
Send the message catalogue by reference, not inside every document
The root layout handed the whole catalogue to the client provider as a prop, so React inlined it into the RSC payload of every document: on /leads/calling 2.96 ...
Pick up the shared library's status follow-ups and lead key lookups (5b273d8e)
Pick up the shared library's status follow-ups and lead key lookups (5b273d8e)
Pick up the shared library's status follow-ups and lead key lookups (5b273d8e)
Pick up the shared library's status follow-ups and lead key lookups (5b273d8e)
Pick up the shared library's status follow-ups and lead key lookups (5b273d8e)
Read a drip's lead by its primary key
DripContacts.lead/stateOfLead wrote "l.uid = ? AND l.org_id = ?", which YugabyteDB's heuristic planner serves from ix_leads_org_id, walking the whole organizati...
Answer an outcome's status write before its follow-ups
Declares LeadStatusFollowUps (shared-lib 5b273d8e): the lead's last contact and pipeline stage after a status write now run on two background threads (bounded q...
Answer a status write before its follow-ups, and read lead rows by their own key
Call Floor outcome press, profiled with JFR on a SecurityService pod (lab org, 40 presses): the /stage write took 160-360 ms, median ~220 ms. About 90 ms of it ...
The Call Log's provider audio door refuses a line whose provider keeps no recordings
The list only offers Listen for a recording the platform stores or JustCall keeps; the door now asks the same rule before it asks any provider, so a FreePBX cal...
A Call Log page under Call / Text
Every call the member made or took and the calls of everyone below them on the reporting line (VOIPService GET /api/voip/calls/log decides the rows). Rows show ...
The platform owner's seed password is no longer a literal in source
The value here was also a cluster and Forgejo password. The seed now reads KAMO_SEED_OWNER_PASSWORD, or uses a random one that is never logged. History still ho...
View Floor Reports opens the scoreboard and the manager panes
Mirrors VIEW_FLOOR_REPORTS (675) and lets it open the Leads > Scoreboard row and page and the Floor Pulse, Speed-to-Lead Report, Funnel by Lead Source and Coach...
Never link to an article kept out of the help center on purpose
Ten articles were in the manifest but not in the live knowledge base. One, SI Goals, Watches and Signals, had simply never been imported; it is now published. T...
Keep idle connections open longer than Traefik, so a POST is never sent down a closing one
Node closed an idle keep-alive connection after 5 s; Traefik keeps its idle connections to a pod for 90 s and reuses them. A request sent as Node closed the soc...
Seed View Floor Reports to administrators and floor managers
VIEW_FLOOR_REPORTS (675) now opens Floor Activity. On the boot that introduces it, RoleRightsSyncService grants it wherever CONFIGURE_SYSTEM (an organization's ...
A Call Log for the member and their reporting line
GET /api/voip/calls/log reads PHONE_CALL_LOG by the indexed time range of the members in view (self + everyone below on the manager field, the owner sees all, t...
View Floor Reports (675) opens Floor Activity
Floor reports are their own security right (owner, 2026-11-06). VIEW_FLOOR_REPORTS is a standalone CRM root taken from the calling workspace's reservation (676-...
Paint the next lead first, read ahead during a call, and save the outcome behind the next lead
First paint: the list is asked for at once, beside the member's rights, and its top (limit=6) comes first so the next lead paints before the rest of the list; a...
Check a page of leads in one read, and read a lead's loans by index seeks
OutreachCheck.checkPage answers a person's check for a page of leads with the same rules and the same decision code as check(): the leads' rows and open points,...
Every loan has a column on the board, and the list streams through
Sold / Boarded sat on neither lane of the board, so those loans never showed. It now follows Funded, and any status neither lane names gets a column of its own ...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
