Branded meeting invitation and update letters for calendar guests
Adds calendar.meeting_invite and calendar.meeting_updated canonical templates and MeetingInviteEmail, the variable builder EmailService fills them from.
One mapping engine for lead imports, with team-member assignment
Manual imports, automated (intake) imports and the backlog each carried their own copy of the mapping code, and they disagreed: date, regex and split transforma...
MEETING_COMPLETED run trigger, for a conversation meeting's follow-up (SP92 calls)
A meeting an AI member took part in as a conversation partner wakes it once it ends, with its transcript note, the way a phone call's CALL_COMPLETED does. STRIN...
The charter model for the ORG layer, PERSONALITY and DocsTION — the vocabulary, the twelve item columns, the org charter item, org archetypes and their repositories; validation still refuses the new sections (KamoCollab CP03 T7)
CharterLevel appends ORG after CP01's TEAM; CharterRule appends TRAIT and COLLAB; CharterSection appends PERSONALITY (TRAIT, 160) and DocsTION (COLLAB, 60), bot...
Tendency links — integer derive, the minimal-move inverse with the two-term carry, and the two gates (KamoCollab CP03 T5)
Weakness tendencies are "own controls, linked and option to be fully independent" (owner decision 6). TendencyLinks.LINKS holds the seven links of CP03 spec §5....
The 60-key trait registry, the group defaults and the Docstion vocabulary (KamoCollab CP03 T4)
PersonalityTraitKey carries a TraitSpec per key (family, type, range, default, choices, linked keys, UI group, unit, adaptability, label keys), REGISTRY_VERSION...
Drop findMemberAndManagerIds — its only caller, SecurityService's hosted-computer manager pairs, now reads the org graph (KamoCollab CP02 T15)
git grep of every repo's origin/main (and every unpushed worktree) finds no other caller. Push only AFTER SecurityService's CP02 T15 commit is deployed: until t...
Chat member facts come only from the org graph; the legacy facts repository and its constructor are gone (KamoCollab CP02 T18)
ChatPolicySnapshotLoader loses its ChatPolicyFactsRepository constructor, the facts field, loadFacts, ancestry, managerChain, workLocationName and the str, lng ...
Build member facts from the org graph, next to the old query path (KamoCollab CP02 T5)
ChatPolicySnapshotLoader gains a constructor taking LongFunction<OrgGraph>. With it, load() maps the organization's graph to MemberFacts through the new MemberF...
Bounded recalculation by member id, and role edits that reach team members (KamoCollab CP01 T7)
**************** recalculates exactly these members: read by id in chunks of 500 (never the organization's members), each chunk through recalcChunk (the TEAM le...
The loader, its eight org-bounded queries, the 60 s cache, the change event, the wire codec and the department head mapping (KamoCollab CP02 T4)
- OrgGraphFactsRepository (donotmodify.dao.repos): eight native queries, each bounded by org_id through an index; users and CP01's team tables are pinned onto...
The TEAM level of the rights and session-timeout waterfalls (KamoCollab CP01 T6)
TeamLevels (pure, not a bean) reads a set of members' teams in four queries whatever their number (one when none is in a team): memberships, the teams, their ro...
CharterLevel.TEAM, between the job title and the member (KamoCollab CP01 T5)
Appends TEAM to CharterLevel (after DEFAULT; ORG from CP03 comes next, R1-11) and states in its Javadoc that resolution order is CharterLayer.rank, never the de...
The pure org graph core: OrgGraph, its builder, nodes and relationships (KamoCollab CP02 T3)
Package com.kamo.z.shared.org.graph (pure, no beans), per KamoCollab master §6.2 and CP02 spec §5.2-§5.3: - enums OrgRelationship, CounterpartKind, OrgGraphChan...
The team entities, repositories and limits (KamoCollab CP01 T4)
Team (org_teams), TeamMembership (org_team_members, @IdClass Key), TeamRole, TeamRight (type through RoleRightTypeIdConverter) and TeamCharterItem (team_charter...
Capture the rights and session-timeout waterfall goldens on unchanged main (CP01 T1)
RightsWaterfallGoldenTest (933 lines: cascade 588, templates 324, closure 18, AI 3) a94381d6 and checked in both fixture modes (lazy collections, bulk repositor...
MediaObjSource and MediaObj.source, createMessage with a source, findTwoPersonChatSession, and the impersonation/Enter-As access-log events (KamoCollab CP00 T4)
- MediaObjSource {MEMBER, SYSTEM, SERVICE}; MediaObj.source (STRING, column SOURCE, length 16, nullable, no default) and sourceOrMember(), which reads NULL as...
Phonetic spellings of the org's name and short name, for the AI's speech (SP94 T3)
Organization.titlePhonetic / titleShortPhonetic (TITLE_PHONETIC, TITLE_SHORT_PHONETIC, VARCHAR(255), nullable), on patchOrganization's allow-list beside title/t...
Per-phone-server outbound policy and OutboundCallPolicy (SP93 T3)
SP93 Task 3 (spec §5.2, D1, D4-D6): - AiVoiceInstanceSettings gains **************** BLOCK_INTERNATIONAL, BLOCK_PREMIUM_RATE, BLOCK_HIGH_RISK_AREA_CODES (bool...
The computer-use check writes the contract a model passed (SP98 T25A)
COMPUTER_USE is earned through Kamo's own computer_* tools by any provider, so toolVersion is probe-filled: the check records which contract the model passed, a...
SP96 retire the charter's VOICE TTS pin
A VOICE item is style only: validation refuses voiceModelId/voiceId (FIELD_NOT_ALLOWED), the resolver has no TTS key and EffectiveCharter no Tts, and CharterVie...
PLACE_INTERNAL_CALL, member consent, the spoken company name, the team line, ON_REQUEST approvals
SP95 Task 4 (spec §5.2, D1, D4, D10, D15, D24): - AiActionClass gains PLACE_INTERNAL_CALL (AUTONOMOUS), appended last. CharterResolver resolves an unnamed PLA...
SP96 MemberSex, Member.sex and a gender on the voice record
members.sex is a nullable STRING column (FEMALE | MALE, null = not specified), so an AI member can speak with a matching voice. The TTS and REALTIME_AUDIO voice...
The platform API host is api.kamouniverse.com
The platform's OAuth apps now hold api.kamouniverse.com redirect URIs. The owner added them to every console (Google, Microsoft Entra, Zoho, RingCentral) and ke...
A quote's letterhead falls back to the primary platform apex
QuoteMapper kept its own "kamocrm.com" literal as the theme host of last resort, so a quote for an organization with no live domain still named the old brand's ...
Kamouniverse.com is the platform's primary apex
The brand moved from kamocrm.com to kamouniverse.com, but nothing the platform generates could follow it. Every "which of this org's domains" rule ranked by few...
A lead that was ever assigned or opened can be deleted
LeadService.deleteLead cleared only lead_custom_form_data before deleting the row, and six other tables carry a foreign key onto leads(uid). Every assignment wr...
A team member is equal to another only when their ids are (SP10)
SP10 T47, live: MediaService answered "one or more memberIds not found" to a group chat of the owner and two AI members. Lombok's @EqualsAndHashCode(callSuper =...
Publish routes another stream's subject instead of pinning ours; lead notes reach the feed after commit
**************** asserted expectedStream(<own stream>) on every subject, so a subject another stream captures was refused with "expected stream does not match [...
Organizations and plans belong to a KamoUniverse universe
KamoUniverse sells the platform to four audiences - Business, Family, Community, Personal - each on its own plan ladder with packages that fit it (a family gets...
Meeting calls in AI_CALL telemetry — kind, meeting id, REMOVED, meeting events
AiCallKind {PHONE, MEETING} and AI_CALL.KIND / MEETING_ID (SP14 DDL **************** AiCallOutcome.REMOVED, the four meeting event types, and the member+meeting...
Keep the meeting transcript's ciphertext columns out of JSON
**************** has failed on main since f92765b1 added MeetingTranscript: transcriptTextCipher, transcriptVttCipher and summaryCipher had neither @JsonIgnore ...
Transcription runs on Kamo Speech, and PHI audio is routed only to in-cluster services
An AI workstation's take-over and MCP token are written only by their own UPDATEs
control_member_id/_started_at and **************** are now updatable = false, and HostedComputerRepository gains the only writes they get: recordControl, clearC...
AI call telemetry entities
AI_CALL and AI_CALL_EVENT (spec §4.2/§4.3): direction, status, outcome and event-type enums (STRING), the two entities and their repositories. AiCallStatus.LIVE...
Meeting minutes contract — prompt, JSON parse, markdown and HTML rendering
Mirrors kamoai-voice's minutes.py exactly: caps and chunks count code points (no split emoji), Unicode white space is stripped, only JSON arrays are lists, text...
AI voice line and per-server AI voice settings entities; outbound flag on extensions
Number-level AI voice consent ledger with append-only history
The gate also counts the number's newest REVOKED event, so a revocation survives its record moving to another number, a backdated re-grant and a stale whole-row...
Numeric participant member ids, AI participant fields, meeting title and dial-in PIN
Role, department and job-title charter write paths; legacy requirements keep other sections
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.
