SP96 hire options to leave out the phone extension and the workstation
An AI hire's create body takes aiPhoneExtension and aiWorkstation (JSON booleans, true when absent). A step left out is created SKIPPED with NOT_REQUESTED_AT_HI...
SP98 Task 9 fix round 1 — SP98-T9-2 and master §11 row SP98-T9: the deferred notice has its own source
SP98 Task 2 rulings SP98-T2-1..4 and master §11 row SP98-T2 — outreach gate and copilot tool keys
A rejected guessed recipient tells the model to look the person up
EmailService now refuses a send whose recipient names one of the organization's own mail domains but matches no mailbox, alias or member (RECIPIENTS_UNKNOWN, a ...
Refuse a guessed recipient at the org's own domain before it reaches the mail server
Luna (AI member) asked to email the owner and guessed **************** instead of looking up the real address (sage@kamocrm.com). kamouniverse.com is one of the...
A contact never touched before is held to quiet hours, in the organization's zone
SP98-A-11. The outreach gate returned right after consent when the contact had no state row, so a cold first touch skipped quiet hours (and the touch budget): a...
A copilot tool call's idempotency key carries its turn
SP98-A-12. Member chat keyed a Tool Plane call chat:<session guid>:<tool call id>. A call id is unique only within its turn: HuggingFaceAdapter numbers id-less ...
Record-sent and record-failed answer 400 like evaluate when the call names no sender
SP98-A-10. With neither agentId nor memberId, the two record calls fell into the persona branch with a null agent: an unattributed touch was written, and a send...
A widget turn is not one transaction, so a swallowed read no longer fails the send at commit
SP98-A-9. PublicAiChatService.sendMessage ran the whole visitor turn in one @Transactional. The hand-off tool's escalation titles (the persona's version or agen...
SP95 AI member go-live fixes — spec, plan, ledger, PROGRESS row, master §11 row
SP96 Task 7 ruling SP96-T7-1 — a voice's gender is the vendor's word, read by one parser
A voice's gender, from its record, a curated table or its style, and vendors' genders kept by the probe
SP96 Task 7. VoiceGender {FEMALE, MALE, NEUTRAL, UNKNOWN} with a lenient parse, and VoiceGenders.of(type, model, record) applying spec 5.3 in order: the convent...
SP96 sex on the member profile and at creation, gated as personal data
GET /api/security/members/{id} names sex (FEMALE, MALE or null) only to a caller who may read it (MemberSexAccess, spec D3); the key is absent for anyone else. ...
SP98 Task 12 rulings SP98-T12-1..6 — Tool Plane run cap, free/busy, refresh, self-assign
The Tool Plane needs per-member sticky routing before a second replica
The replicas comment said scaling needed only a PodDisruptionBudget. Since SP05 Task 31 each pod pools its own clients, and an AI workstation's bridge runs one ...
An AI's task without an assignee is its own
tasks_create without an assignee left an AI's task unassigned in its Inbox. SP02's TASK_HANDOFF moves only tasks assigned to the retiring AI, so self-planned wo...
An approved action runs past its run's call cap; a dry run names read-all
SP98-K-1 (SP05 final review M1): SP10 re-executes an approved action under the run id that asked for it. A run that worked on to its maxToolCallsPerRun answered...
Calendar_free_busy answers who is busy when, never what the block is called
A busy block's title (and its event id) can come from an outside invitation, and calendar_free_busy is not an untrusted tool (SP13's voice bookings call it, and...
An MCP server's refresh no longer closes the client calls are using
The 10-minute refresh (I3) and an admin's test evicted the pooled client before listing, which dropped a legacy SSE stream or DELETEd a Streamable HTTP session ...
An AI workstation sleeps with its desktop stopped, and wakes to a fresh one
Measured on a throwaway -ai4 workstation (SP98 Task 16), the wake stalled because Xorg does not survive a resume: with no KMS driver it drives the console throu...
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...
SP98 Task 1 rulings SP98-T1-1..8, master §11 row SP98-T1, plan A-6 error code
The missed-message sweep reads the recipient's link hosts before its transaction
SP98-D-9. prepareSend read the recipient organization's domain rows lazily, as a late statement of the sweep's transaction, to choose the letter's console host;...
A turn-only fan-out reads no roster, ticket id or conversation title
SP98-D-6. ChatFanoutService.prepare resolved the roster, the support ticket's id and the conversation's title for every request, including the turn-only ones (a...
Chat cards queue boundedly, give up on a hung EmailService in seconds, and never double a mention
SP98-D-7: ChatNoticeDispatcher ran on two threads with an unbounded queue while MemberNotificationClient waited up to 5 s + 30 s (the letter client's chat.email...
A send looks up its AI turn limit and its sender's photo before its transaction opens
SP98-D-5 and D-9. A chat send asked SecurityService for an AI member's charter limit (up to 1 s + 2 s) inside the open send transaction, and read the sender org...
The ai_member_voices table and the charter voice-pin migration, as hand-applied SQL
SP96 Task 2. The table remembers an AI member's voice per TTS model (spec 5.1); the migration moves every charter VOICE pin to a CHOSEN, MIGRATED, preferred row...
An access policy and its lists are one write, and tenants never see a Kamo service's in-cluster address
SP98 Task 1 A-7 and A-8. - A-7: AccessPolicyWriter saves the policy and replaces its lists in one transaction, retried whole on a Yugabyte conflict (@RetryOnD...
One verification run per provider across both pods
SP98 Task 1 A-6. A provider's verification (up to 200 probes on the tenant's key) holds a Redis lease, SET NX with a 10-minute TTL renewed before every probe an...
Feedback only under its own conversation, no folder cycles, logged and key-free failures, and a visitor's conversation searches the public knowledge base
SP98 Task 1 (A-1 to A-5, and the controller's knowledge-audience addition): - A-1: rating a message answers 404 unless the message belongs to the {guid} conve...
SP96 DDL for members.sex, pinned by a contract test
A member's sex is a nullable VARCHAR(16) (FEMALE | MALE, NULL = not specified), hand-applied in SP96 Task 3. The contract test keeps the file re-runnable, with ...
SP96 member sex and stable AI voices — spec, plan, ledger, PROGRESS row, master §11 row
LUNA GPT-6 fix rulings — reasoning_effort none, tool-bearing chat turns require TOOL_CALLING
A reworded GPT-6 tool refusal is warned once, and a full effort memory forgets the oldest
Review follow-ups for the reasoning_effort none fix: - A 400/422 that names reasoning_effort and tools but is not the refusal ToolEffortFallback reads logs on...
SP98-T18 ship rulings — /notes keys beside a chat box, and the live look
SP14 Task 31 verification — rulings SP14-T31a–c and fix1–12, master §11 SP14-T31, §9 item 13 evidence
Media_timeout back to livekit-sip's default
957fc4f re-applied a 20-minute media timeout for a quiet meeting's AI leg. With the fail2ban ban on 47.181.8.84 lifted and FreePBX sending RTP straight over the...
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.
