An approved action that met a "try again" answer keeps its approval
An approved re-execution on its original key that answered a notice (WORKSTATION_WAKING) or a definitive UNAVAILABLE/RATE_LIMITED released the key and its :appr...
Documents, translation and OCR packs
docs_search, docs_read, translate_text and ocr_document (spec 4.20). A document is routed by DocsService's description before any byte is fetched: text is decod...
The AI's workstation — computer_* tools with auto-wake and lease, workstation pack
Approvals pack — decision-only approvals and approval status
approvals_request asks the AI's approver through kamoai-service K3 with toolName null (nothing is re-executed on APPROVE); a class the charter forbids is refuse...
Phone and SMS packs — consent-checked calls, call history, texting
phone_call posts K6 with the caller's run and key; a reason-less 404 is not deployed, a reasoned one (NOT_ENROLLED) is the endpoint's answer. sms_send opens the...
Knowledge base, sales scripts, RAG, directory and notifications packs
Contacts, leads and accounts packs — search, read, create, update, notes, status, claim, history
The 12 CRM tools of spec §4.20 against EmailService and SecurityService as they are on main (SP05-T27): a status without a sub-status clears the old one; a cont...
Calendar and meetings packs — events, availability, scheduled work, dial-in, invites
Beyond the brief (spec SP05-T26-build): no guessed zone (EmailService applies the member's effective zone); reminders only when asked on a create and never re-s...
Tasks pack — lists, create, update, status, assignment, comments, links
Beyond the brief (SP05-T25): an assignee is read as the member id KBService reads (beyond a long is INVALID_ARGUMENTS), an update that changes nothing or both s...
Notes pack — search, read, create, update, journal, links, master note
What KBService really answers shapes three choices (SP05-T24). notes_search matches the query over the title, body, category and tags as the Notes wall does, be...
Chat pack — conversations, unread, read, send, direct chats, mentions
Beyond the brief (SP05-T23): a mention into a support conversation is a web chat message like chat_send; only a team chat or a support conversation takes a post...
Mail pack — read, search, threads, send, reply, forward, drafts, move, flags
Text helpers, id-safe projections and the fake Kamo services harness for packs
HtmlText lays mail HTML out the way a browser shows it (one jsoup walk: collapsed source whitespace, br, block and paragraph breaks, cells, pre); ThreadIds repr...
Remove the execute-as-org tool endpoints now that AIService uses /mcp
/api/mcp/tools/list and /api/mcp/tools/execute answered for a whole org, which the Tool Plane forbids (D28). No deployed client could reach them (AIService call...
Org MCP servers as ext_* tools over Streamable HTTP and legacy SSE; STDIO retired
A server's own words reach a caller only inside the untrusted wrap; nothing sent is definitive (D45); the URL guard runs on every use; one session and one tool ...
MCP 2025-06-18 server at /mcp (stateless streamable HTTP, JSON responses)
One JSON-RPC message per POST: initialize, ping, tools/list, tools/call; notifications and responses answer 202; GET and DELETE answer 405. The body is read aft...
The tools/call pipeline — policy, approvals, limits, idempotency, dry run, taint, audit
A stored idempotency entry is answered before the planner reads again (SP05-T11-order); an approved call in a tainted run still answers to the capability and ch...
Tool call audit, 180-day retention purge and internal audit read
The insert's transaction is the repository's save (REQUIRES_NEW), begun and committed inside the writer's catch, so no audit failure reaches a tool call. Rows a...
Tool visibility by rights, apps, PHI, risk ceiling, taint, capability and charter
The capability gate caches the router's answer per member (SP04 filter 10 narrows candidates by the member's access policies), keeps a failure to get one for 30...
Charter policy, approvals, outreach gate and external recipients
The charter policy compiles SP03's resolved approvals and limits (fail closed when unreachable, refused or without a resolved block); approvals are created and ...
Downstream calls with the caller's session, internal client, live refresh
Kamo services are called through the BFF's own door per service (*** or a single-use OTK), with the org's workspace host, the actor/run/key headers and spec 4.1...
Idempotency, limits, run taint, rate limit and OTK minting on Redis
Tool descriptors, schema builder and validator, registry
A pattern in a tool's schema is untrusted input: ext_* tools carry their org MCP server's own schema. One Java cannot compile is left to the upstream (and refus...
The service template — Boot 3.3.4, secured internal surfaces, no scheduling
No live credentials in application.yml defaults
The local-development defaults carried the database OWNER's password (${DB_PASSWORD:<literal>}), and apiservice/securityservice also the live changelog webhook ...
Refuse to spawn STDIO for an unlisted config, and refuse to connect an SSE/HTTP one to the cluster network
Defense in depth alongside the AIService commit that closes AiMcpController's missing right checks and STDIO refusal at the source: this service is the one that...
Liveness probe on /actuator/health/liveness, not the DB-aware aggregate
The aggregate /actuator/health includes the DataSource indicator, so restarting the database failed liveness on every pod at once and restarted the whole platfo...
Release idle Hikari connections now that YSQL pooling is shared
The connection manager no longer pins sessions **************** so idle app connections no longer each hold a database backend. Keep the pool maximum, but stop ...
Accept OCI image indexes when resolving the built digest [skip ci]
The images are pushed as OCI image indexes, so asking the registry for a single image manifest only answered 404, the digest came back empty and the check faile...
Restart when a same-commit rebuild leaves pods on the old digest [skip ci]
The rollout step tried to detect a same-commit rebuild by comparing the Deployment's image reference before and after `set image`. "Apply manifests" has already...
Prove the deploy by digest, not by tag
The preceding commit stops `set image` being a silent no-op. This asserts the outcome: after the rollout, the tag is resolved to a digest at the registry and th...
A rebuild of the same commit deployed nothing and reported success
The image is tagged with the commit SHA, so rebuilding the same commit produces an identical image reference. `kubectl set image` then changes nothing, the Depl...
Say why this one cannot be scaled yet
McpServerManager runs each MCP server as a child process of THIS pod and tracks them in in-memory maps; McpHealthMonitor writes what it finds there into a SHARE...
Let a rollout finish what the old pod was doing
Deploys replaced the only pod of each service with nothing to catch the requests in flight. Three settings, applied across the fleet: - preStop sleeps 10s befo...
Pin kamo-shared-library 1.6.0
The library moved to 1.6.0 while every consumer stayed on 1.5.0. Consumer CI builds the library from a fresh clone into a cold ~/.m2 and ci-settings.xml mirrors...
Refuse MCP tool execution for a tenant that handles PHI
executeTool forwards operator-supplied arguments to an operator-typed URL and can spawn a stdio process, with no allowlist, no SSRF guard and no destination aud...
Size the pod above its own JVM heap ceiling [skip ci]
The image starts the JVM with -XX:MaxRAMPercentage=70 -XX:+AlwaysPreTouch, so the heap alone may take 70% of the container limit and pre-touch keeps every commi...
Declare the object-storage secret the ConfigMap no longer carries
The MinIO key was moved out of the ConfigMap into the minio-app-credentials secret, but the envFrom that supplies it was only ever applied to the live deploymen...
Stop shipping a shared credential as a config default
The platform's shared password was baked in as the fallback for DB_PASSWORD and MINIO_ROOT_PASSWORD, so it lived in this repo and in the built image as well as ...
Rebuild against shared-library @Lob LONGVARCHAR fix
Hibernate's PostgreSQL dialect read @Lob String columns as OIDs via getLong(). Affects notes, contacts, calendar, OAuth tokens, IMAP passwords, email campaign b...
Point at YugabyteDB and use PostgreSQLDialect
CockroachDB has been replaced by YugabyteDB. Connection strings move from cockroachdb-public:26257 to yb-tserver-service:5433, and the Hibernate dialect from **...
Retry the shared-library build, which the LAN uplink keeps corrupting
Three builds died today on "Tag mismatch" pulling a jar — and the mirror added an hour ago did not help, because kbservice, mcpgatewayservice and ragservice hit...
Mirror Maven Central through the Google GCS copy
Every Docker stage starts from a cold ~/.m2 and refetches the whole dependency tree, so Central sees the full weight of every concurrent service build. It answe...
Harden the kubectl download against flaky egress [skip ci]
dl.k8s.io over the runner's egress intermittently drops mid-transfer: curl: (56) OpenSSL SSL_read: decryption failed or bad record mac which fails the deploy ...
Constant-time internal-auth secret compare (timing oracle)
Replace String.equals with MessageDigest.isEqual so response latency cannot leak the X-Internal-Auth shared secret byte-by-byte. Fleet-wide sweep of the copy-pa...
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.
