Changelog
What's new.
Every improvement to the platform, as it ships.
· kamo-shared-library
An org's SI call languages, clear speech and relay support on its voice notices row (SIE8)
Declares the columns **************** (kamoai-service) added, so KamoInitializer can recreate them.
· kamo-internal
Customer Handoffs — the customers an SI handed to a person, with everything they already said (SIE7)
Waiting / Mine / Taken / Done with counts; each handoff shows what the customer needs, what the SI did, the next step, the best time, how to reach them (PhoneNumber / EmailAddress) and, opened, their whole thread across phone, email, text, chat and meetings. I'll Take It (first come, first served), Put Back, Mark Done with a note. Org brand colours, corner ribbons, shared avatars, animated with reduced motion honoured; live on handoff cards and every 20 s. Under the SI menu for people who see or supervise SIs; the alert's link opens any one. Help topic + help center article.
· MCPGatewayService
Handoff_to_person — an SI hands the conversation to a person (SIE7)
A call back (also 'as soon as someone is free') or a place in line for the next free person, on any channel, so the customer never repeats themselves. kamoai-service keeps it (who the customer is comes from the run and its CP07 audience; the people are the colleague asked for or the SI's own). SEND_INTERNAL_MESSAGE, so open on unproven channels; CP07 plans it as a disclosure to the organization. New prefix handoff_; guards, phrases, ArgRefs and the golden files carry the one tool.
· kamo-internal
Websites and social profiles on a lead
The Contact card and the New Lead form take any number of websites (a + adds another) and a field each for LinkedIn, Facebook, Instagram, X, TikTok, YouTube, WhatsApp, Messenger and Telegram. A handle, a number or a pasted link all work; the lead view shows each as a link that opens in a new tab. Hidden from viewers who only see masked contact info, and a masked save never clears them.
· kamo-shared-library
Websites and social profiles on a lead
Two text columns on leads (WEBSITES one per line, SOCIAL_PROFILES JSON) exposed as a list and a map on LeadDTO, CreateLeadRequest and UpdateLeadRequest; null leaves them alone, empty clears. LeadWebPresence trims, de-duplicates and bounds them and keeps only the known networks. Masked with the other contact info; recorded in lead history. DDL (additive) already applied by hand.
· kamo-internal
Configurable tracking links, member links and a tracking script for other sites
- Marketing → Tracking Codes → Link settings (new page, MANAGE_REFERRAL_CODES): switch standard pages off, add the org's own links, and name the marketing site every link points at (so an org whose public site is not www.<console apex>, such as Kamo Universe, copies the right links). The tracking parameter is never typed anywhere; it is appended when a link is copied or previewed. - The Get links picker merges standard + org + the member's own links, and members can add or remove their own (a pasted URL on the site is stored as its path). - The same page generates a copy-paste script for sites Kamo does not host: same cookies, same self-exclusion, same payload, sent to the public beacon with the org's key. Tested by running it against a fake browser. - The catch-all marketing-tracking proxy now relays PUT (it only knew GET/POST/PATCH/DELETE). - API keys can be given the Marketing Tracking scope in Settings → Security. - The code strip, drawer and preview link honour the org's named site. Needs MediaService da07f59 (links endpoints; table already created) and the dictionary strings (12346cb5), both on origin.
· kamo-asterisk-support
Record each side of a channel beside its mix
Owner 2026-11-06: "any time you have separate audio channels, make sure the transcripts leverage that so it can additionally say who is speaking." Every recorded channel was one mono MixMonitor mix of both sides, so no recording held one party alone (measured: every track of a multi-track call transcribes to the same words). [kamo-record] now also writes MixMonitor's r() and t() files, {stem}.rx.wav (what the channel said: that leg's own party) and {stem}.tx.wav (what it heard), beside the unchanged {stem}.wav. The grouper keeps them in their call and leg, and the manifest tags them "direction":"rx"|"tx". ConversionService (3ff1cc4) transcribes each side on its own, names it (our member by extension, else the other party), merges the turns in time order, and keeps the files as extra tracks; it never mixes them into the master.
· kamo-internal
Version History, Test Before Saving and Role Templates for job descriptions (SIE6)
- Version History drawer on every job description editor (SI, organization, role, department, job title, team, persona): timeline with who/when/how, per-section change pills, plain-language diff, compare any two, Personality and Voice filter, Test This Version (CP15 rehearsal on the version), one-click restore with a note; brand colours via ApprovalBrandScope, corner ribbon on the current version, reduced motion honoured. - Test Before Saving: the editor's unsaved changes through the practice conversations (PersonalityRehearseDialog gains a draftOnly mode). - Role Templates gallery (built-in + your organization's) on an SI's job description card and on the hire summary: one step gives job description, tool rules, personality, rights and voice; Save as Role Template. - BFF routes, help article and help links.
· kamo-shared-library
Customer thread and handoff entities (SIE7)
ai_customer_touch (one line of a customer's conversation thread across channels, keyed by a hash of each CP07 identity) and ai_handoff (an SI's conversation handed to a person: callback, queue, warm transfer), declared so KamoInitializer can recreate them. Hand-applied DDL: kamoai-service **************** (applied; kamoai-service writes them over JDBC, no repository).
· kamo-internal
The SI Command Center and the one searchable Activity Trail
SIE4. The Workforce hub opens on the Command Center: four live figures (working now, waiting on people, problems today, spend this week) and a card per SI with its status, what it is doing, approvals / messages / identity checks waiting, problems, spend, quality, health, pause (with a plain confirm) and resume, and View Activity. The table view is the W1 roster grid. The new Activity Trail tab reads /api/kamoai/trail: every log of what an SI did in one timeline grouped by day, search, SI / kind / period filters, routine check-ins hidden by default, Show More, CSV export, and a detail drawer (how it was decided from the decision record, approval history, open the work session). First-time help on both screens and in the hub's help tips; plain words, org brand colors, corner ribbons, shared avatars, motion that honors reduced motion. @kamo/kamoai-core 0.3.0.
· kamo-internal
Transcripts as timed turns that say who spoke and play from that moment
Owner report 2026-11-06. One shared view, CallTranscriptTurns, for every place that reads a recording's transcript: the Call Log's transcript panel, the Media Player, the softphone's History and Voicemail rows, and a lead's call history (which showed no call transcript before). Each turn shows its speaker (our member with photo and the shared profile card, the other party by the linked lead's name or the phone number, or Speaker 1/2 when the voices were told apart but not named) and a time that plays the recording from there. Playing from a turn uses the shared Media Player window: an open player showing that recording takes a media-player:seek request and jumps there; otherwise a new window opens at that point **************** The player marks the turn being played as it goes. A transcript older than timed turns still reads as before, without times. Help: The Call Log article explains speakers and play-from-a-moment. Needs kamo-translation-dictionary 3aac0ff8 and voipservice bf3d2b0.
· SecurityService
Version history for job descriptions and personalities, one-click restore, SI Role Templates (SIE6)
- charter_revisions: every save of an org, role, department, job title, team or member charter is a version (who, when, how, per-section counts), recorded by ONE CharterHistory after the write commits; a layer's first change keeps a BASELINE, and a change through an unrecorded path is caught up as OUTSIDE. - CONSOLIDATED: the **************** editor saves go through one CharterLayerWriter (validate, write, record, announce); always-allow add/remove, generated personalities, hire seeding, briefing duties, the layer dialogs and team saves record through the same recorder. - /api/security/charter/history: list, one version, compare any two (plain-language diff), restore (same right as editing the layer; leaves out what can no longer apply; floor duties kept; audited AI_CONFIGURATION_APPLIED; recorded as a RESTORE version). - **************** built-in (9: + Sales Assistant, Trainer, each with suggested rights) and org-own templates (from an SI's setup; archive), applied in one step: job description, tool rules, personality and style (TEMPLATE version, restorable), rights (org role, only rights the applier holds, never the SI floor's), voice handed back.
· kamo-internal
SI Status — every SI path's health, incidents with Acknowledge, and who is on call (SIE1)
/settings/ai?tab=si-status: a hero that answers "is everything working?" in the status's colour (animated, reduced motion honoured), a card per SI path (phone calls, meetings, chat, website chat, email, texts, work queue, tools, recaps, approvals, identity checks, password vault, SI providers) with a plain-words reason, a 24-hour quarter-hour strip and, on a click, 14 days and the counts. Incidents: open and recent, Acknowledge and Mark Fixed, Kamo Platform notices, and a timeline drawer of who was told how (shared avatar). On Call: three tiers with per-person App & Phone / Text for Outages / Email, escalation timing, a 'who hears when' preview, the fallback people when nobody is on call, and Send Me a Test Page. Org brand colours for chrome, semantic colours for status, corner ribbons, first-time welcome card, help tips and a help center article **************** menu entry and landing card. Data: kamoai-service /api/kamoai/si-status through the /api/kamoai BFF.
· kamo-internal
My Profile email signature card (UPDATE_OWN_SIGNATURE)
A member chooses which details their own signature prints, or returns to the company default. Read-only without the right; the server (EmailService /api/email/member-signature) decides and enforces.
· EmailService
Members choose which details their signature prints (UPDATE_OWN_SIGNATURE)
/api/email/member-signature GET/PUT/DELETE; the composer narrows the org's USER-scope toggles with the sender's own choices (never the settings editor's explicit-scope preview). Write needs UPDATE_OWN_SIGNATURE; a member can only switch off what the company prints. Table **************** applied 2026-11-06.
· kamo-shared-library
CharterRevision and SiRoleTemplate entities for job description history and SI Role Templates (SIE6)
Declared so KamoInitializer can recreate charter_revisions (append-only version history of every charter layer) and si_role_templates (an organization's own SI Role Templates). SecurityService reads and writes both with JDBC; the DDL is applied (securityservice ****************
· SecurityService
Administrator templates grant UPDATE_OWN_SIGNATURE
Team Members get it from TEAM_MEMBER_ROLE_DEFAULT_GRANTS (shared library); grant-all Administrator roles get it on the rights sync, and the Administrator template seeds it.
· kamo-shared-library
UPDATE_OWN_SIGNATURE (696), on for Team Members by default
A member's own say over which details their email signature prints. Standalone root; Team Members role default via **************** Taxonomy counts move (441 / 150 roots / 101 standalone).
· VOIPService
Serve a recording's transcript as timed turns
The recording metadata the Media Player and the Call Log read now carries transcriptTurns (each turn's start, end, text and speaker: one of our members by id, the other party, or a diarized label) and transcriptSource, from RECORDINGS.TRANSCRIPT_TURNS written by ConversionService. The plain transcript is unchanged for older readers, and the read is audited as a transcript read exactly as before. Owner report 2026-11-06. Needs kamo-shared-library e1a4a4ee.
· kamo-shared-library
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 plain TRANSCRIPT stays for every older reader. RecordingMetadata carries the turns, and **************** lets ConversionService name a channel's speaker before the recording is stored. Owner report 2026-11-06: transcripts did not cover whole calls and could not say who was speaking.
· MediaService
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_REFERRAL_CODES) save them. The org and member come from the session only. Every document is rebuilt field by field: destinations must be a site path or an http(s) URL, and the auto-managed discount / mrt_self parameters are stripped so the tracking parameter is never member-typed. The table is created by hand: **************** (already applied to the cluster as the owner).
· KlusterServices
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 kamoai-service; jicofo's metrics (video bridge count); and PrometheusRule si-infrastructure: voice workers, PBX, Meet, no video bridge, meeting ear, Tool Plane, provider gateway, EmailService, VOIPService, MediaService, unhealthy components and the website chat's entry point. Every rule carries namespace=kamo and si_path, so kamoai-service's AlertmanagerConfig si-alerts mails SysAdmin and opens a PLATFORM incident paged to the platform organization's on-call people. livekit/60-monitoring.yaml (TPLKLEAK's): every LiveKit alert is si_path=calls and livekit-alerts also calls the on-call webhook (bearer secret: a copy of kamo/kamoai-internal-auth in namespace livekit, SECRETS.md). No LiveKit roll: only the monitoring file changed.
· MCPGatewayService
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 and on-behalf chain of command, meeting speaker authority, conditional rights, charter FORBIDDEN and outcome (CharterPolicy.explain names the rule, incl. 'Approve and always allow' standing permissions), the identity guard and what lifts it, approvals. Each call's audit row carries one kamo.si.decision/v1 record (decision_record / decision_outcome / decided_by), readable through the existing I2 audit read and /audit/decisions/{id}. Meeting lines are read once per call (identity guard, order, on-behalf shared one read). Behavior unchanged: the golden files from b64fb8a (charter matrix, catalogue, 360 scenarios) all match.
· kamo-internal
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 /changelog.
· kamo-shared-library
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. Hand-applied DDL: kamoai-service **************** (already applied; kamoai-service writes them over JDBC, no repository).
· kamo-internal
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 with a burst. Pushes still travelling ride in a lane above the list. - Widget (changelog.live): on every launchpad by default and removable; All / Features / Fixes, the shipping lane, a details drawer with the change's journey and what shipped with it. - /changelog: totals, shipping now, the last 24 hours, then the whole history — search, product, status, kind and date filters, grouped by the member's day, loaded as they scroll, with a 'new changes' pill for arrivals a filtered list cannot place. - Fed by /topic/platform/changelog; re-reads on reconnect and when the tab comes back. - Help: the Live Changes article (getting-started/live-changes) and both help marks.
· MediaService
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, through the platform relay.
· SecurityService
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.changelog after the transaction commits. - ChangelogDeploymentTracker follows each in-flight push through Forgejo's CI statuses (build, then deploy) every 10s under a singleton lease, publishes every move, and marks earlier pushes of the same project LIVE when a later one lands. Read-only token from changelog-forgejo-token. - **************** the public changelog's entries with their deployments, searchable and filterable, never a COUNT. Gated on VIEW_LIVE_CHANGES, read from member_rights_applied when the session predates the right. - VIEW_LIVE_CHANGES and the widget's rights except REQUIRED are on for every role by default.
· kamo-shared-library
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 at the push that delivered it. Schema landed by KamoInitializer 2026-11-06. VIEW_LIVE_CHANGES (690) is a root with no ServiceType that gates the feed; the standard five widget rights (691-695) hang off it. RoleRightHierarchyTest counts move with them.
· KlusterServices
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 YugabyteDB, NATS and MinIO on the node, so every request timed out.

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