docs: reconcile every doc with what the code actually does - #212
Merged
Conversation
The docs were last touched around 9f59cfc. Everything since then landed without a doc pass, so the guides now describe a repo that doesn't exist. The failures are not cosmetic — each of these sends a reader down a path that cannot work: - CONTRIBUTING said Node >= 18. `@capacitor/cli` needs >= 22, so a contributor following the doc cannot install the dependency tree at all. - `npm run test:integration` is documented as needing "local Postgres + Redis". It also needs INTEGRATION_DATABASE_URL, and without it the runner prints `[integration] skipped` and exits 0 — a green that means nothing. - MOBILE_IOS told you to run `pod install`. There is no Podfile; the project moved to SPM. It also told you to uncomment a `server.url` that isn't there. - gke.md put AGENT_POD_ADMISSION_MAX's default at 200. It is 40 — the doc invites a 5x over-provision. - wif-setup.md claimed a `v*` tag auto-rolls the backend. deploy.yml is workflow_dispatch only; that has never been true for this workflow file. - benchmarks/README priced daily all-four runs at $240-400/month against its own table, which works out to $1,740-3,030. $240-400 is the *weekly* figure. Also corrected: the push dispatch path (948016a split it in two, and the doc still described the single-path bug that commit fixed), the BYOA daemon flag list and --stop-vs---doctor semantics (3d1ddf1), the email CLI transport (secure mode has no Bash tool, so "shelled through the engine's bash tool" describes a tool that isn't there), the auto-updater feed and 30-minute interval, the CLI bundle size, README/SECURITY's claim that .env.example is the complete variable list, and a "waitlist" env group that has no env vars. Documented the npm publish path for the `cumora` CLI, which RELEASE.md never mentioned despite BYOA.md telling users to `npx cumora@latest`. Fixed the stale comments in the same class: release.yml and build.yml both still described a tag-triggered deploy, publish.yml called the server deploy automatic, and the idx_conversations_members_gin comment still called it the hottest read path after membership moved to conversation_members. Removed docs/decisions/ and its seven ADRs as requested. Facts that were only recorded there and still load-bearing are inlined at their point of use: the seven-key ANTHROPIC_* bootstrap allowlist and the api.anthropic.com first-party carve-out into BYOA.md, the credential boundary into COORDINATION.md. Dangling "see ADR NNNN" pointers are gone from README, BYOA.md, COORDINATION.md, and migrate.ts — including the one in a runtime error message operators actually read. Gitignore .codex/ alongside .claude/. No behaviour change: Markdown, comments, one error string, one ignore rule.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The docs were last touched around
9f59cfc. Everything since then landed without a doc pass, so the guides describe a repo that doesn't exist. Each fix below is a path a reader can currently walk down and fail on — not a wording preference.The ones that actively break people
CONTRIBUTING.md:12@capacitor/cli@8.3.3requiresnode >= 22,@aws-sdk/client-s3requires>= 20. Node 18 cannot install the dependency tree.CONTRIBUTING.md/README.mdtest:integration"needs local Postgres + Redis"INTEGRATION_DATABASE_URL. Without itserver/run-integration-tests.mjs:33-38prints[integration] skippedand exits 0 — a green that means nothing.MOBILE_IOS.md:5,175cd ios/App && pod installios/App/CapApp-SPM/Package.swift).pod installjust fails.MOBILE_IOS.md:49server.url"server.url. The config's own header says it's "intentionally NOT set". Changed to add.server/k8s/gke.md:181AGENT_POD_ADMISSION_MAXdefault20040(env.ts:236). The doc invites a 5× over-provision. Same stale figure ingeneric-device-plugin.note:31..github/wif-setup.md:70git tag v0.1.0 && git push→ auto-rolls that version"deploy.yml:12isworkflow_dispatchonly. Av*tag firesrelease.yml(Electron) and never touches GKE.benchmarks/README.md:89Behaviour that changed under the docs
PUSH_NOTIFICATIONS.md:27— described dispatch as living insidePOST /conversations/:id/messages.948016aextracteddispatchMessagePush()and added thecmdReplycaller; the doc was still describing the single-path bug that commit fixed.PUSH_NOTIFICATIONS.md:160-163— an "Open item" claiming thenotify.pushtoggle unregisters immediately and needs a relaunch to re-enable. Neither half holds: the toggle only writes a pref, and both the Re-register button andinstallVisibilityHook()recover in-session. Replaced with a truthful troubleshooting row.BYOA.md:544-551— listed 2 of 9 daemon flags and never mentioned that3d1ddf1made--stop/--restart/--pairskip one-shot invocations, so a running--doctorsurvives a--stop.email.md:5— "shelled through the engine's bash tool". Secure mode runs Claude with--tools ''; there is no Bash tool. The CLI arrives over thecli(argv)MCP bridge.RELEASE.md:26,135,167— auto-updater feed isupdates.cumora.ai(thegenericprovider is first in thebuild.publisharray), GitHub is fallback;build.mac.notarizeis a baretruewith noteamIdkey; the poll interval is 30 min (hardcoded inautoUpdater.cjs:175), not 10.BYOA.md:540—~140KB→ a freshnode agent-cli/build.mjsproduces 337,785 bytes.README.md:74/SECURITY.md:81— both claimed.env.exampleis the complete annotated variable list. It omitsAGENT_RUNTIME_SECRET(the very var SECURITY.md tells self-hosters to set),APNS_*,FCM_*,SUB2API_*,METRICS_BEARER_TOKEN. Reworded to point atserver/src/env.tsas authoritative. Also dropped a "waitlist" env group that has no env vars — it's DB/admin-driven.CONTRIBUTING.md— "Two architecture invariants" while CI runs three guards;guard:engine-registrywas missing from both the invariants list and the pre-PR command block. Test layout was wrong on both halves (a frontend test exists attests/message-markdown-links.test.ts; worker tests are not underserver/src).RELEASE.md— added the missing npm publish path.publish.ymlships thecumoraCLI on any push tomaintouchingagent-cli/**, and the Release Manual never mentioned it even thoughBYOA.mdtells users tonpx cumora@latest.gke.md:37-84— the primary path pushed toquay.io. CI and prod use Artifact Registry exclusively (build.yml:250,deploy.yml:83). Also corrected cluster/zone to the realcumora-prod-z/us-west2-aand noted zonal clusters take--location, not--region.agent-cli/README.md—--servershown as required; it defaults tohttps://api.cumora.ai.workers/email-gate/README.md:13,15— payload list omittedautoSubmittedandattachments[]; "tempfail" describes a path the code does not have.Stale comments in the same class
release.yml:7andbuild.yml:11both still described a tag-triggered deploy;publish.yml:6called the server deploy automatic;migrate-bin.ts:18showed aghcr.ioimage and amigrate-bin.cjscommand that don't exist;migrate.ts:2540still calledidx_conversations_members_gin"the hottest read path" afterloadInboxmoved toconversation_members.ADR removal
Removed
docs/decisions/and its seven ADRs as requested. Facts recorded only there and still load-bearing were inlined at their point of use before deletion:ANTHROPIC_*bootstrap allowlist and theapi.anthropic.comfirst-party carve-out (3f85a11) →BYOA.mdCOORDINATION.mdAll dangling
see ADR NNNNpointers are gone fromREADME.md,BYOA.md,COORDINATION.md, andmigrate.ts— including one embedded in a runtime error message operators read during a failed migration.git grep ADRnow matches only thePADRpadding constants inObservabilityPage.tsx.Also gitignores
.codex/next to.claude/.Three code/config defects found while verifying — deliberately NOT fixed here
This PR is docs-only, so these are reported rather than changed. Each looks worth its own PR:
server/k8s/cumora-server.gke.yaml:164pointslivenessProbeat/api/health, which runsSELECT 1.deploy.yml:228-249patches it to/api/livezon every rollout, with a comment attributing the 2026-05-27 connection-exhaustion outage to exactly this DB-backed liveness probe. A manualkubectl apply -fof the checked-in manifest re-introduces the outage config./api/livezalready exists (router.ts:658). I documented the required post-apply patch ingke.mdas a stopgap.workers/email-gate/src/index.ts:238permanently rejects on 5xx. The comment says "tempfail so the sender's MTA retries", butmessage.setReject()is a permanent rejection — one upstream blip loses the mail for good. Cloudflare issues a temporary failure when the handler throws, so the fix is to throw on 5xx and keepsetRejectfor 4xx. I marked itKNOWN GAPin place since changing it flips real delivery behaviour.The cluster-wide FUSE admission ceiling is inert.
getClusterFuseUtilization()(orchestrator.ts:512) shells out tokubectl get nodesand fails open toInfinity(:515-519), but both manifests grant only a namespacedRoleoverpods/pods/log/persistentvolumeclaims— no node read anywhere. Needs aClusterRole+ClusterRoleBindingfornodes: [get, list]. Until then onlyAGENT_POD_ADMISSION_MAXbounds admission; documented as such.Verification
The single
npm testfailure isagents-observability-turns.test.ts— "the aggregate counts zero-turn messages — against a real Postgres" — failingECONNREFUSEDon my machine, which has no local Postgres. CI's service containers cover it.Every numeric claim was re-derived from source rather than trusted:
AGENT_POD_ADMISSION_MAXfromenv.ts:236, the 30-minute interval fromautoUpdater.cjs:175, the bundle size from an actualnode agent-cli/build.mjs, the seven env keys fromCLAUDE_CORE_ENV_KEYS, the publish feed order frompackage.json.No behaviour change: Markdown, comments, one error string, one ignore rule.