@bongos/core 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1142) hide show
  1. package/.bongos-core.json +5727 -0
  2. package/.claude/skills/blocker-review/SKILL.md +91 -0
  3. package/.claude/skills/blocker-solve/SKILL.md +96 -0
  4. package/.claude/skills/builder-backup/SKILL.md +54 -0
  5. package/.claude/skills/builder-box/SKILL.md +45 -0
  6. package/.claude/skills/builder-claim/SKILL.md +76 -0
  7. package/.claude/skills/builder-connect/SKILL.md +59 -0
  8. package/.claude/skills/builder-cost/SKILL.md +47 -0
  9. package/.claude/skills/builder-end/SKILL.md +81 -0
  10. package/.claude/skills/builder-exit/SKILL.md +88 -0
  11. package/.claude/skills/builder-key/SKILL.md +40 -0
  12. package/.claude/skills/builder-reauth/SKILL.md +50 -0
  13. package/.claude/skills/builder-redteam/SKILL.md +109 -0
  14. package/.claude/skills/builder-release/SKILL.md +41 -0
  15. package/.claude/skills/builder-setup/SKILL.md +62 -0
  16. package/.claude/skills/builder-ship/SKILL.md +79 -0
  17. package/.claude/skills/builder-stage/SKILL.md +51 -0
  18. package/.claude/skills/builder-start/SKILL.md +46 -0
  19. package/.claude/skills/close-box/SKILL.md +43 -0
  20. package/.claude/skills/design-sync/SKILL.md +69 -0
  21. package/.claude/skills/dev/SKILL.md +49 -0
  22. package/.claude/skills/feedback/SKILL.md +32 -0
  23. package/.claude/skills/figma-design-sync/SKILL.md +74 -0
  24. package/.claude/skills/goal-review/SKILL.md +89 -0
  25. package/.claude/skills/idea-triage/SKILL.md +144 -0
  26. package/.claude/skills/ideate/SKILL.md +82 -0
  27. package/.claude/skills/merge-mode/SKILL.md +169 -0
  28. package/.claude/skills/new-project/SKILL.md +108 -0
  29. package/.claude/skills/otb-character-review/SKILL.md +71 -0
  30. package/.claude/skills/otb-design-review/SKILL.md +47 -0
  31. package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
  32. package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
  33. package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
  34. package/.claude/skills/paint/SKILL.md +70 -0
  35. package/.claude/skills/planning-session/SKILL.md +299 -0
  36. package/.claude/skills/priority-session/SKILL.md +134 -0
  37. package/.claude/skills/read-session-export/SKILL.md +58 -0
  38. package/.claude/skills/recall/SKILL.md +52 -0
  39. package/.claude/skills/session-handoff/SKILL.md +46 -0
  40. package/.claude/skills/status/SKILL.md +33 -0
  41. package/.devcontainer/Dockerfile +69 -0
  42. package/.devcontainer/README.md +73 -0
  43. package/.devcontainer/devcontainer-lock.json +19 -0
  44. package/.devcontainer/devcontainer.json +93 -0
  45. package/.devcontainer/healthcheck.sh +84 -0
  46. package/.devcontainer/init-firewall.sh +198 -0
  47. package/.devcontainer/post-create.sh +153 -0
  48. package/.dockerignore +36 -0
  49. package/.env.local.example +32 -0
  50. package/.gitattributes +83 -0
  51. package/.gitignore +91 -0
  52. package/CLAUDE.md +242 -0
  53. package/CODE_OF_CONDUCT.md +46 -0
  54. package/CONTRIBUTING.md +51 -0
  55. package/Dockerfile +46 -0
  56. package/GOVERNANCE.md +44 -0
  57. package/LICENSE +661 -0
  58. package/README.md +88 -0
  59. package/bin/bongos.js +222 -0
  60. package/clients/bongos-client/README.md +48 -0
  61. package/clients/bongos-client/bongos-client.global.js +617 -0
  62. package/clients/bongos-client/examples/hello-world.mjs +62 -0
  63. package/clients/bongos-client/index.cjs +619 -0
  64. package/clients/bongos-client/index.d.ts +793 -0
  65. package/clients/bongos-client/index.mjs +614 -0
  66. package/clients/bongos-client/package.json +32 -0
  67. package/config/branding.neutral.json +60 -0
  68. package/config/design-tokens.neutral.json +51 -0
  69. package/config/design-tokens.schema.json +96 -0
  70. package/config/modules.neutral.json +9 -0
  71. package/docker-compose.yml +52 -0
  72. package/docker-entrypoint.sh +30 -0
  73. package/docs/adr/0001-stack-choice-single-vps.md +45 -0
  74. package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
  75. package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
  76. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
  77. package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
  78. package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
  79. package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
  80. package/docs/adr/0008-family-based-tile-generation.md +86 -0
  81. package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
  82. package/docs/adr/0009-autotile-architecture.md +181 -0
  83. package/docs/adr/0010-pms-architecture.md +70 -0
  84. package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
  85. package/docs/adr/0012-ground-object-cell-split.md +208 -0
  86. package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
  87. package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
  88. package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
  89. package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
  90. package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
  91. package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
  92. package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
  93. package/docs/adr/0020-security-model-public-stub.md +70 -0
  94. package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
  95. package/docs/adr/0022-secrets-policy.md +124 -0
  96. package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
  97. package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
  98. package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
  99. package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
  100. package/docs/adr/0025-structured-criterion-task-link.md +44 -0
  101. package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
  102. package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
  103. package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
  104. package/docs/adr/0029-status-page-outage-resilience.md +59 -0
  105. package/docs/adr/0030-builders-hall-live-updates.md +59 -0
  106. package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
  107. package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
  108. package/docs/adr/0033-discord-bot-service-principal.md +82 -0
  109. package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
  110. package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
  111. package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
  112. package/docs/adr/0037-discord-channel-management.md +51 -0
  113. package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
  114. package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
  115. package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
  116. package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
  117. package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
  118. package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
  119. package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
  120. package/docs/adr/0044-per-box-live-game-preview.md +57 -0
  121. package/docs/adr/0045-devbox-desktop-app.md +133 -0
  122. package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
  123. package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
  124. package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
  125. package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
  126. package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
  127. package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
  128. package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
  129. package/docs/adr/0053-scoped-dev-box-session.md +55 -0
  130. package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
  131. package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
  132. package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
  133. package/docs/adr/0057-container-cost-ledger.md +28 -0
  134. package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
  135. package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
  136. package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
  137. package/docs/adr/0060-gds-retrieval-layer.md +97 -0
  138. package/docs/adr/0061-context-layer-decomposition.md +61 -0
  139. package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
  140. package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
  141. package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
  142. package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
  143. package/docs/adr/0066-generated-file-map-sections.md +51 -0
  144. package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
  145. package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
  146. package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
  147. package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
  148. package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
  149. package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
  150. package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
  151. package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
  152. package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
  153. package/docs/adr/0074-memory-map-stays-light.md +32 -0
  154. package/docs/adr/0075-per-system-cost-attribution.md +37 -0
  155. package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
  156. package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
  157. package/docs/adr/0078-deterministic-first-cron.md +48 -0
  158. package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
  159. package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
  160. package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
  161. package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
  162. package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
  163. package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
  164. package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
  165. package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
  166. package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
  167. package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
  168. package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
  169. package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
  170. package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
  171. package/docs/adr/0090-metic-task-authoring.md +73 -0
  172. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
  173. package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
  174. package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
  175. package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
  176. package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
  177. package/docs/adr/0095-cross-agent-context-management.md +58 -0
  178. package/docs/adr/0096-require-reward-before-workable.md +209 -0
  179. package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
  180. package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
  181. package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
  182. package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
  183. package/docs/adr/0100-two-repo-instance-model.md +60 -0
  184. package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
  185. package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
  186. package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
  187. package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
  188. package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
  189. package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
  190. package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
  191. package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
  192. package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
  193. package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
  194. package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
  195. package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
  196. package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
  197. package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
  198. package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
  199. package/docs/adr/0115-scheduled-routines-portability.md +31 -0
  200. package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
  201. package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
  202. package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
  203. package/docs/adr/0119-api-pagination-contract.md +34 -0
  204. package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
  205. package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
  206. package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
  207. package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
  208. package/docs/adr/0124-typed-api-response-bodies.md +37 -0
  209. package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
  210. package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
  211. package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
  212. package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
  213. package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
  214. package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
  215. package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
  216. package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
  217. package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
  218. package/docs/adr/0134-private-first-npm-distribution.md +38 -0
  219. package/docs/adr/README.md +208 -0
  220. package/docs/api/openapi.json +13720 -0
  221. package/docs/api-reference.md +437 -0
  222. package/docs/architecture.md +244 -0
  223. package/docs/branding-contract.md +66 -0
  224. package/docs/branding-fill-prompt.md +25 -0
  225. package/docs/canonical-permissions.md +241 -0
  226. package/docs/design/container-exterior-tiles.md +49 -0
  227. package/docs/design/container-exterior.md +81 -0
  228. package/docs/design/container-interior.md +77 -0
  229. package/docs/design/modular-architecture/00-research-report.md +107 -0
  230. package/docs/design/modular-architecture/01-architecture.md +125 -0
  231. package/docs/design/modular-architecture/02-module-map.md +116 -0
  232. package/docs/design/modular-architecture/03-builder-flows.md +104 -0
  233. package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
  234. package/docs/design/modular-architecture/README.md +27 -0
  235. package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
  236. package/docs/design/world-map-scroll.md +41 -0
  237. package/docs/design-contract.md +320 -0
  238. package/docs/file-map.md +418 -0
  239. package/docs/handoff-template.md +92 -0
  240. package/docs/modules-contract.md +293 -0
  241. package/docs/onboarding/browser-terminal-guide.md +73 -0
  242. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
  243. package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
  244. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
  245. package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
  246. package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
  247. package/docs/onboarding/diagrams/README.md +94 -0
  248. package/docs/onboarding/diagrams/assertions.json +170 -0
  249. package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
  250. package/docs/onboarding/diagrams/render-config.json +9 -0
  251. package/docs/onboarding/drachmae-and-karma.md +178 -0
  252. package/docs/onboarding/primer.md +202 -0
  253. package/docs/project-context.template.md +67 -0
  254. package/docs/recipes/README.md +35 -0
  255. package/docs/recipes/audit-replay.md +100 -0
  256. package/docs/recipes/bongos-cli-release.md +66 -0
  257. package/docs/recipes/builder-box-lifecycle.md +152 -0
  258. package/docs/recipes/claude-design-loop.md +143 -0
  259. package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
  260. package/docs/recipes/cloudbongos-staging-gate.md +139 -0
  261. package/docs/recipes/cloudbongos-standup.md +111 -0
  262. package/docs/recipes/devbox-app-release.md +93 -0
  263. package/docs/recipes/devbox-app-windows-test.md +128 -0
  264. package/docs/recipes/failed-ship-recovery-proof.md +102 -0
  265. package/docs/recipes/figma-design-loop.md +129 -0
  266. package/docs/recipes/gds-db-backup.md +255 -0
  267. package/docs/recipes/instance-deploy.md +37 -0
  268. package/docs/recipes/managed-settings-remote-control.md +416 -0
  269. package/docs/recipes/memory-backup.md +71 -0
  270. package/docs/recipes/memory-sync-conflicts.md +98 -0
  271. package/docs/recipes/multi-builder-merge.md +78 -0
  272. package/docs/recipes/ops-gotchas.md +212 -0
  273. package/docs/recipes/overnight-builder.md +53 -0
  274. package/docs/recipes/packaging-the-core.md +49 -0
  275. package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
  276. package/docs/recipes/parallel-load-test.md +32 -0
  277. package/docs/recipes/pixel-art-pipeline.md +411 -0
  278. package/docs/recipes/private-npm-distribution.md +79 -0
  279. package/docs/recipes/search-index-ingestion.md +67 -0
  280. package/docs/recipes/self-host.md +60 -0
  281. package/docs/recipes/ship-and-regrade.md +72 -0
  282. package/docs/recipes/staging-data.md +50 -0
  283. package/docs/recipes/staging-environment.md +215 -0
  284. package/docs/recipes/upgrading-the-core.md +58 -0
  285. package/docs/research/cursor-competitive-analysis.md +255 -0
  286. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
  287. package/migrations/003_pms.sql +284 -0
  288. package/migrations/004_pms_cost_idempotency.sql +13 -0
  289. package/migrations/005_pms_smoke_filter.sql +44 -0
  290. package/migrations/006_pms_v2.sql +378 -0
  291. package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
  292. package/migrations/008_pms_v2_migration_allocator.sql +27 -0
  293. package/migrations/009_pms_v2_blockers_table.sql +68 -0
  294. package/migrations/010_uptime.sql +29 -0
  295. package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
  296. package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
  297. package/migrations/013_claim_locking.sql +22 -0
  298. package/migrations/014_pms_task_discipline.sql +86 -0
  299. package/migrations/015_pms_estimation_calibration.sql +140 -0
  300. package/migrations/016_pms_task_grades.sql +60 -0
  301. package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
  302. package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
  303. package/migrations/020_task_dependencies.sql +99 -0
  304. package/migrations/021_v3_renumber_and_deps.sql +224 -0
  305. package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
  306. package/migrations/023_pms_rank.sql +30 -0
  307. package/migrations/025_builder_exit_status.sql +15 -0
  308. package/migrations/027_builders_preferred_disciplines.sql +46 -0
  309. package/migrations/028_tasks_parallel_safe.sql +71 -0
  310. package/migrations/029_rank_three_live.sql +32 -0
  311. package/migrations/030_vulnerability_reports.sql +61 -0
  312. package/migrations/031_reward_simplification.sql +57 -0
  313. package/migrations/032_repo_health_snapshots.sql +56 -0
  314. package/migrations/033_audit_log.sql +64 -0
  315. package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
  316. package/migrations/035_auth_token_hygiene.sql +66 -0
  317. package/migrations/037_builder_skill_model_prefs.sql +44 -0
  318. package/migrations/038_task_override_requests.sql +51 -0
  319. package/migrations/039_newcomer_friendly_column.sql +124 -0
  320. package/migrations/040_builder_karma.sql +58 -0
  321. package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
  322. package/migrations/042_criterion_proposal_workflow.sql +78 -0
  323. package/migrations/043_builder_onboarding_observability.sql +66 -0
  324. package/migrations/044_tasks_requires_rank.sql +97 -0
  325. package/migrations/045_builder_onboarding_state.sql +147 -0
  326. package/migrations/046_cost_log_builder_attribution.sql +42 -0
  327. package/migrations/054_builder_memory.sql +108 -0
  328. package/migrations/055_task_criteria.sql +90 -0
  329. package/migrations/058_peer_votes.sql +41 -0
  330. package/migrations/059_onboarding_pick_disciplines.sql +59 -0
  331. package/migrations/060_access_requests.sql +46 -0
  332. package/migrations/061_backfill_override_ship_attribution.sql +29 -0
  333. package/migrations/062_session_records.sql +34 -0
  334. package/migrations/063_session_records_tool_errors_idx.sql +11 -0
  335. package/migrations/064_grade_attempts.sql +18 -0
  336. package/migrations/065_bfg_principal.sql +58 -0
  337. package/migrations/066_live_notify_triggers.sql +69 -0
  338. package/migrations/067_builder_boxes.sql +117 -0
  339. package/migrations/067_discord_bot_foundation.sql +69 -0
  340. package/migrations/068_thetes_requires_rank.sql +27 -0
  341. package/migrations/069_builder_ssh_keys.sql +66 -0
  342. package/migrations/070_box_intents.sql +101 -0
  343. package/migrations/071_box_first_provision_approval.sql +46 -0
  344. package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
  345. package/migrations/073_box_terminal_access.sql +46 -0
  346. package/migrations/075_builder_sound_prefs.sql +28 -0
  347. package/migrations/078_box_claude_active.sql +22 -0
  348. package/migrations/079_box_first_connected_at.sql +20 -0
  349. package/migrations/081_tasks_needs_migration.sql +34 -0
  350. package/migrations/084_tasks_security_sensitive.sql +24 -0
  351. package/migrations/085_security_engagement_docs.sql +34 -0
  352. package/migrations/086_rename_disciplines.sql +125 -0
  353. package/migrations/088_builders_anthropic_link.sql +28 -0
  354. package/migrations/089_builders_monthly_budget.sql +19 -0
  355. package/migrations/090_box_scoped_sessions.sql +38 -0
  356. package/migrations/091_session_token_reward.sql +44 -0
  357. package/migrations/093_tasks_sandbox_review.sql +22 -0
  358. package/migrations/102_remove_box_first_provision_approval.sql +58 -0
  359. package/migrations/103_search_chunks.sql +90 -0
  360. package/migrations/104_builder_box_blocked.sql +34 -0
  361. package/migrations/105_box_host_keys.sql +35 -0
  362. package/migrations/111_medusa_customer0_framing.sql +35 -0
  363. package/migrations/112_drop_track_check.sql +25 -0
  364. package/migrations/113_merge_lease.sql +16 -0
  365. package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
  366. package/migrations/118_currency_label_decoupling.sql +23 -0
  367. package/migrations/119_builder_behavior_prefs.sql +31 -0
  368. package/migrations/121_box_code_version.sql +37 -0
  369. package/migrations/122_builder_gemini_key.sql +30 -0
  370. package/migrations/123_cost_log_tiers.sql +33 -0
  371. package/migrations/124_cost_baseline.sql +45 -0
  372. package/migrations/125_llm_cache.sql +54 -0
  373. package/migrations/126_autonomy_runs.sql +33 -0
  374. package/migrations/143_cost_calibration.sql +63 -0
  375. package/migrations/145_backfill_task_requires_rank.sql +84 -0
  376. package/migrations/160_goal_tier.sql +88 -0
  377. package/migrations/163_polymorphic_dependencies.sql +187 -0
  378. package/migrations/164_event_sound_prefs.sql +20 -0
  379. package/migrations/165_task_module_key.sql +15 -0
  380. package/migrations/171_claims_published_head_sha.sql +24 -0
  381. package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
  382. package/migrations/175_task_grades_diff_hash.sql +9 -0
  383. package/migrations/176_promotion_respects_open_blockers.sql +58 -0
  384. package/migrations/176_ui_discipline.sql +40 -0
  385. package/migrations/177_require_reward_before_workable.sql +76 -0
  386. package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
  387. package/migrations/179_search_chunk_usefulness.sql +33 -0
  388. package/migrations/180_one_active_claim_per_session.sql +54 -0
  389. package/migrations/181_cost_log_skill_name.sql +33 -0
  390. package/migrations/184_claim_release_requested.sql +25 -0
  391. package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
  392. package/migrations/187_goal_sort_order.sql +30 -0
  393. package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
  394. package/migrations/README.md +88 -0
  395. package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
  396. package/migrations/core_189_core_upgrades_ledger.sql +37 -0
  397. package/migrations/core_189_credit_log_task_id_index.sql +19 -0
  398. package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
  399. package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
  400. package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
  401. package/migrations/instance/110_medusa_planning_seed.sql +70 -0
  402. package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
  403. package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
  404. package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
  405. package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
  406. package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
  407. package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
  408. package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
  409. package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
  410. package/modules/autonomy/CLAUDE.md +49 -0
  411. package/modules/autonomy/db.js +50 -0
  412. package/modules/autonomy/module.json +13 -0
  413. package/modules/autonomy/pollers/routine-timers.js +146 -0
  414. package/modules/autonomy/routes/autonomy.js +37 -0
  415. package/modules/builder-settings/CLAUDE.md +58 -0
  416. package/modules/builder-settings/builder-needs.js +115 -0
  417. package/modules/builder-settings/db.js +168 -0
  418. package/modules/builder-settings/display-name.js +84 -0
  419. package/modules/builder-settings/event-sound-prefs.js +169 -0
  420. package/modules/builder-settings/interaction-prefs.js +201 -0
  421. package/modules/builder-settings/model-alloc-prefs.js +147 -0
  422. package/modules/builder-settings/module.json +10 -0
  423. package/modules/builder-settings/render-prefs.js +103 -0
  424. package/modules/builder-settings/routes/settings.js +417 -0
  425. package/modules/builder-settings/settings.js +52 -0
  426. package/modules/builder-settings/skill-prefs.js +196 -0
  427. package/modules/builder-settings/sound-prefs.js +178 -0
  428. package/modules/builder-settings/wandering-prefs.js +282 -0
  429. package/modules/dev-box/CLAUDE.md +38 -0
  430. package/modules/dev-box/box-access.js +275 -0
  431. package/modules/dev-box/box-credential.js +94 -0
  432. package/modules/dev-box/box-onboard.js +486 -0
  433. package/modules/dev-box/boxes.js +842 -0
  434. package/modules/dev-box/db.js +39 -0
  435. package/modules/dev-box/module.json +14 -0
  436. package/modules/dev-box/routes/box.js +977 -0
  437. package/modules/discord/CLAUDE.md +50 -0
  438. package/modules/discord/auth.js +54 -0
  439. package/modules/discord/bug-attachments.js +210 -0
  440. package/modules/discord/db.js +96 -0
  441. package/modules/discord/discord-approvals.js +145 -0
  442. package/modules/discord/discord-audit.js +29 -0
  443. package/modules/discord/discord-bot.js +545 -0
  444. package/modules/discord/discord-bugs.js +257 -0
  445. package/modules/discord/discord-channels.js +412 -0
  446. package/modules/discord/discord-inbound.js +147 -0
  447. package/modules/discord/discord-message-buffer.js +54 -0
  448. package/modules/discord/discord-reaction.js +186 -0
  449. package/modules/discord/discord-role-sync.js +318 -0
  450. package/modules/discord/module.json +14 -0
  451. package/modules/discord/pollers/discord-bot.js +19 -0
  452. package/modules/discord/routes/bug-attachments.js +44 -0
  453. package/modules/discord/routes/discord.js +102 -0
  454. package/modules/discord/ship-broadcast.js +78 -0
  455. package/modules/discord/webhook.js +74 -0
  456. package/modules/economy/CLAUDE.md +48 -0
  457. package/modules/economy/achievements.js +594 -0
  458. package/modules/economy/cost-classify.js +331 -0
  459. package/modules/economy/cost-summary-shape.js +90 -0
  460. package/modules/economy/cost.js +438 -0
  461. package/modules/economy/credits.js +430 -0
  462. package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
  463. package/modules/economy/module.json +10 -0
  464. package/modules/economy/reward.js +61 -0
  465. package/modules/economy/routes/cost.js +97 -0
  466. package/modules/economy/routes/leaderboard.js +26 -0
  467. package/modules/economy/routes/reward.js +42 -0
  468. package/modules/economy/streak.js +285 -0
  469. package/modules/grading/CLAUDE.md +42 -0
  470. package/modules/grading/db.js +39 -0
  471. package/modules/grading/grader-rubric.json +151 -0
  472. package/modules/grading/grader-workers/efficiency.js +213 -0
  473. package/modules/grading/grader-workers/extract-json.js +80 -0
  474. package/modules/grading/grader-workers/fence.js +100 -0
  475. package/modules/grading/grader-workers/hacker.js +239 -0
  476. package/modules/grading/grader-workers/index.js +183 -0
  477. package/modules/grading/grader-workers/narc.js +207 -0
  478. package/modules/grading/grader-workers/quality.js +198 -0
  479. package/modules/grading/grader-workers/rubric.js +20 -0
  480. package/modules/grading/grader-workers/worker-prompt.js +89 -0
  481. package/modules/grading/grader-workers/worker-verdict.js +50 -0
  482. package/modules/grading/grader.js +1790 -0
  483. package/modules/grading/module.json +12 -0
  484. package/modules/grading/routes/grade.js +51 -0
  485. package/modules/hall-ui/CLAUDE.md +61 -0
  486. package/modules/hall-ui/module.json +14 -0
  487. package/modules/hall-ui/public/atlas.html +180 -0
  488. package/modules/hall-ui/public/atlas.js +336 -0
  489. package/modules/hall-ui/public/box-panel.js +423 -0
  490. package/modules/hall-ui/public/brand-apply.js +117 -0
  491. package/modules/hall-ui/public/builders.js +3028 -0
  492. package/modules/hall-ui/public/chime.wav +0 -0
  493. package/modules/hall-ui/public/copy-on-click.js +174 -0
  494. package/modules/hall-ui/public/cursors/arrow.png +0 -0
  495. package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
  496. package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
  497. package/modules/hall-ui/public/cursors/magnifier.png +0 -0
  498. package/modules/hall-ui/public/diagram-viewer.css +125 -0
  499. package/modules/hall-ui/public/diagram-viewer.js +330 -0
  500. package/modules/hall-ui/public/diagrams.html +113 -0
  501. package/modules/hall-ui/public/dom-utils.js +212 -0
  502. package/modules/hall-ui/public/drachmae.html +68 -0
  503. package/modules/hall-ui/public/drachmae.js +136 -0
  504. package/modules/hall-ui/public/gate.html +143 -0
  505. package/modules/hall-ui/public/gate.js +228 -0
  506. package/modules/hall-ui/public/goals-page.js +1297 -0
  507. package/modules/hall-ui/public/goals.html +376 -0
  508. package/modules/hall-ui/public/goals.js +119 -0
  509. package/modules/hall-ui/public/hall-widgets.js +189 -0
  510. package/modules/hall-ui/public/harbor.html +167 -0
  511. package/modules/hall-ui/public/harbor.js +335 -0
  512. package/modules/hall-ui/public/index.html +116 -0
  513. package/modules/hall-ui/public/instances-panel.js +172 -0
  514. package/modules/hall-ui/public/md-reader.js +234 -0
  515. package/modules/hall-ui/public/modules.html +119 -0
  516. package/modules/hall-ui/public/modules.js +154 -0
  517. package/modules/hall-ui/public/new-project-wizard.js +186 -0
  518. package/modules/hall-ui/public/not-ready.html +48 -0
  519. package/modules/hall-ui/public/pair.html +119 -0
  520. package/modules/hall-ui/public/pair.js +132 -0
  521. package/modules/hall-ui/public/primer.css +404 -0
  522. package/modules/hall-ui/public/primer.html +85 -0
  523. package/modules/hall-ui/public/primer.js +641 -0
  524. package/modules/hall-ui/public/profile.html +85 -0
  525. package/modules/hall-ui/public/profile.js +236 -0
  526. package/modules/hall-ui/public/ranks.html +69 -0
  527. package/modules/hall-ui/public/ranks.js +206 -0
  528. package/modules/hall-ui/public/roadmap.html +209 -0
  529. package/modules/hall-ui/public/roadmap.js +375 -0
  530. package/modules/hall-ui/public/sessions.html +92 -0
  531. package/modules/hall-ui/public/sessions.js +222 -0
  532. package/modules/hall-ui/public/settings.html +640 -0
  533. package/modules/hall-ui/public/settings.js +1219 -0
  534. package/modules/hall-ui/public/shell.js +495 -0
  535. package/modules/hall-ui/public/style.css +1748 -0
  536. package/modules/hall-ui/public/task-detail.js +253 -0
  537. package/modules/hall-ui/public/task.html +83 -0
  538. package/modules/hall-ui/public/task.js +326 -0
  539. package/modules/hall-ui/public/watch.html +333 -0
  540. package/modules/hall-ui/public/watch.js +859 -0
  541. package/modules/hall-ui/public/work.html +469 -0
  542. package/modules/hall-ui/public/work.js +1292 -0
  543. package/modules/ideas/CLAUDE.md +37 -0
  544. package/modules/ideas/blockers.js +100 -0
  545. package/modules/ideas/inbox.js +459 -0
  546. package/modules/ideas/module.json +10 -0
  547. package/modules/ideas/routes/blockers.js +120 -0
  548. package/modules/ideas/routes/inbox.js +230 -0
  549. package/modules/lifecycle/CLAUDE.md +63 -0
  550. package/modules/lifecycle/conflict-resolve.js +436 -0
  551. package/modules/lifecycle/db.js +4970 -0
  552. package/modules/lifecycle/done-when.js +355 -0
  553. package/modules/lifecycle/github-push.js +969 -0
  554. package/modules/lifecycle/goal-conflicts.js +133 -0
  555. package/modules/lifecycle/hierarchy.js +104 -0
  556. package/modules/lifecycle/lifecycle.js +58 -0
  557. package/modules/lifecycle/merge-lock.js +261 -0
  558. package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
  559. package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
  560. package/modules/lifecycle/module.json +13 -0
  561. package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
  562. package/modules/lifecycle/publish-reconciler.js +418 -0
  563. package/modules/lifecycle/routes/analytics.js +63 -0
  564. package/modules/lifecycle/routes/claims.js +506 -0
  565. package/modules/lifecycle/routes/dependencies.js +82 -0
  566. package/modules/lifecycle/routes/done-when.js +136 -0
  567. package/modules/lifecycle/routes/gate-approvals.js +197 -0
  568. package/modules/lifecycle/routes/goals.js +1419 -0
  569. package/modules/lifecycle/routes/lifecycle.js +43 -0
  570. package/modules/lifecycle/routes/tasks.js +1703 -0
  571. package/modules/lifecycle/routes/versions.js +128 -0
  572. package/modules/lifecycle/ship-card.js +505 -0
  573. package/modules/lifecycle/ship-preflight.js +225 -0
  574. package/modules/lifecycle/task-classifier.js +512 -0
  575. package/modules/lifecycle/version-close.js +106 -0
  576. package/modules/memory/CLAUDE.md +40 -0
  577. package/modules/memory/learnings.js +275 -0
  578. package/modules/memory/memory.js +572 -0
  579. package/modules/memory/module.json +12 -0
  580. package/modules/memory/routes/learnings.js +90 -0
  581. package/modules/memory/routes/memory.js +916 -0
  582. package/modules/memory/routes/search.js +188 -0
  583. package/modules/memory/search-chunker.js +252 -0
  584. package/modules/memory/search.js +320 -0
  585. package/modules/onboarding/CLAUDE.md +55 -0
  586. package/modules/onboarding/approval-broadcast.js +59 -0
  587. package/modules/onboarding/db.js +54 -0
  588. package/modules/onboarding/module.json +10 -0
  589. package/modules/onboarding/newcomer-restock.js +212 -0
  590. package/modules/onboarding/onboarding-state.js +532 -0
  591. package/modules/onboarding/onboarding.js +508 -0
  592. package/modules/onboarding/port.js +63 -0
  593. package/modules/onboarding/routes/access-requests.js +208 -0
  594. package/modules/onboarding/routes/onboarding.js +54 -0
  595. package/modules/security/CLAUDE.md +44 -0
  596. package/modules/security/module.json +10 -0
  597. package/modules/security/routes/reports.js +251 -0
  598. package/modules/security/secret-scrub.js +201 -0
  599. package/modules/security/security.js +294 -0
  600. package/modules/sessions/CLAUDE.md +39 -0
  601. package/modules/sessions/bfg.js +357 -0
  602. package/modules/sessions/db.js +326 -0
  603. package/modules/sessions/module.json +10 -0
  604. package/modules/sessions/pulse.js +149 -0
  605. package/modules/sessions/routes/sessions.js +331 -0
  606. package/modules/status-ui/CLAUDE.md +47 -0
  607. package/modules/status-ui/module.json +14 -0
  608. package/modules/status-ui/public/README.md +29 -0
  609. package/modules/status-ui/public/cursors/arrow.png +0 -0
  610. package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
  611. package/modules/status-ui/public/index.html +363 -0
  612. package/modules/status-ui/public/snapshots/.gitkeep +0 -0
  613. package/modules/status-ui/public/status.js +1375 -0
  614. package/modules/status-ui/public/style.css +1342 -0
  615. package/package-lock.json +975 -0
  616. package/package.json +28 -0
  617. package/public-docs/index.html +35 -0
  618. package/public-docs/redoc.standalone.js +1838 -0
  619. package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
  620. package/public-landing/buddha.png +0 -0
  621. package/public-landing/create.html +868 -0
  622. package/public-landing/index.html +168 -0
  623. package/scripts/bongos-mcp.js +28 -0
  624. package/scripts/cron/style_guide_audit.sh +134 -0
  625. package/scripts/discord/README.md +52 -0
  626. package/scripts/discord/lib.js +80 -0
  627. package/scripts/discord/post.js +51 -0
  628. package/scripts/gds/CLAUDE.md +144 -0
  629. package/scripts/gds/abandon.js +58 -0
  630. package/scripts/gds/adopt-detect.js +123 -0
  631. package/scripts/gds/adopt-import.js +111 -0
  632. package/scripts/gds/adopt-preflight.js +121 -0
  633. package/scripts/gds/api.js +78 -0
  634. package/scripts/gds/architect-audit.js +288 -0
  635. package/scripts/gds/art-stage.js +152 -0
  636. package/scripts/gds/audit-authorship.sh +243 -0
  637. package/scripts/gds/audit-deps.js +121 -0
  638. package/scripts/gds/audit-exports.js +128 -0
  639. package/scripts/gds/audit-replay.sh +161 -0
  640. package/scripts/gds/audit-ships.js +251 -0
  641. package/scripts/gds/autonomy-gate.js +135 -0
  642. package/scripts/gds/backfill-cost.js +165 -0
  643. package/scripts/gds/backfill-sessions.js +351 -0
  644. package/scripts/gds/backfill-task-rewards.js +408 -0
  645. package/scripts/gds/backup.js +94 -0
  646. package/scripts/gds/bfg-principal-token.js +65 -0
  647. package/scripts/gds/box-auth-check.js +160 -0
  648. package/scripts/gds/box-connect-lib.js +453 -0
  649. package/scripts/gds/box.js +1258 -0
  650. package/scripts/gds/build-bongos.js +94 -0
  651. package/scripts/gds/capture.js +123 -0
  652. package/scripts/gds/cf-tunnel.js +419 -0
  653. package/scripts/gds/ci-grade.js +82 -0
  654. package/scripts/gds/claim-recall.js +112 -0
  655. package/scripts/gds/claim.js +333 -0
  656. package/scripts/gds/classify-discipline.js +153 -0
  657. package/scripts/gds/claude-materialize.js +176 -0
  658. package/scripts/gds/cleanup-orphans.js +74 -0
  659. package/scripts/gds/cli-lib.js +518 -0
  660. package/scripts/gds/code.js +101 -0
  661. package/scripts/gds/codemod-rename-src-gds.js +145 -0
  662. package/scripts/gds/conductor-dispatch.js +426 -0
  663. package/scripts/gds/context-pack.js +228 -0
  664. package/scripts/gds/coreB-carve-proof.sh +716 -0
  665. package/scripts/gds/cost.js +47 -0
  666. package/scripts/gds/db-backup-nightly.sh +160 -0
  667. package/scripts/gds/db-backup-offsite.sh +152 -0
  668. package/scripts/gds/demote.js +40 -0
  669. package/scripts/gds/design-sync.js +62 -0
  670. package/scripts/gds/diagnose-achievements.js +118 -0
  671. package/scripts/gds/diagram-facts.js +319 -0
  672. package/scripts/gds/discipline-modes.json +25 -0
  673. package/scripts/gds/discord-channels.js +66 -0
  674. package/scripts/gds/do-api.js +176 -0
  675. package/scripts/gds/docs-entropy.js +403 -0
  676. package/scripts/gds/doctor.js +389 -0
  677. package/scripts/gds/feedback-latest.js +94 -0
  678. package/scripts/gds/fetch-art-key.js +106 -0
  679. package/scripts/gds/fetch-sound-prefs.js +88 -0
  680. package/scripts/gds/figma-design-sync.js +61 -0
  681. package/scripts/gds/fitness.js +1446 -0
  682. package/scripts/gds/gate-review.js +322 -0
  683. package/scripts/gds/gating.js +325 -0
  684. package/scripts/gds/gds-db-backup.service +24 -0
  685. package/scripts/gds/gds-db-backup.timer +20 -0
  686. package/scripts/gds/gds-db-offsite.service +29 -0
  687. package/scripts/gds/gds-db-offsite.timer +18 -0
  688. package/scripts/gds/gen-api-client.js +508 -0
  689. package/scripts/gds/gen-api-docs.js +1037 -0
  690. package/scripts/gds/gen-atlas.js +366 -0
  691. package/scripts/gds/gen-diagrams.js +608 -0
  692. package/scripts/gds/gen-file-map.js +196 -0
  693. package/scripts/gds/gen-repo-map.js +519 -0
  694. package/scripts/gds/gen-session-index.js +210 -0
  695. package/scripts/gds/git-merge-regen.js +147 -0
  696. package/scripts/gds/grade-smoke.js +205 -0
  697. package/scripts/gds/hooks/pre-push.js +169 -0
  698. package/scripts/gds/http-api-client.js +88 -0
  699. package/scripts/gds/init.js +903 -0
  700. package/scripts/gds/install-git-hooks.js +114 -0
  701. package/scripts/gds/key-card.js +213 -0
  702. package/scripts/gds/key-status.js +126 -0
  703. package/scripts/gds/land-watch.js +168 -0
  704. package/scripts/gds/learning-capture.js +145 -0
  705. package/scripts/gds/lib.sh +44 -0
  706. package/scripts/gds/linkify-refs.js +473 -0
  707. package/scripts/gds/local-preview-lib.js +159 -0
  708. package/scripts/gds/local-preview.js +95 -0
  709. package/scripts/gds/login.js +225 -0
  710. package/scripts/gds/main-audit.js +279 -0
  711. package/scripts/gds/me.js +88 -0
  712. package/scripts/gds/memory-map.js +174 -0
  713. package/scripts/gds/merge-lock.js +71 -0
  714. package/scripts/gds/migration-namespace.js +200 -0
  715. package/scripts/gds/mirror-lineage-check.js +319 -0
  716. package/scripts/gds/mirror-redact.js +305 -0
  717. package/scripts/gds/module.js +482 -0
  718. package/scripts/gds/newcomer-floor.config.json +13 -0
  719. package/scripts/gds/newcomer-floor.js +415 -0
  720. package/scripts/gds/newcomer-floor.templates.json +86 -0
  721. package/scripts/gds/newcomer-floor.test.js +235 -0
  722. package/scripts/gds/next-number.js +163 -0
  723. package/scripts/gds/oauth-secret.js +197 -0
  724. package/scripts/gds/onboard.js +217 -0
  725. package/scripts/gds/onboarding-analyze.js +226 -0
  726. package/scripts/gds/onboarding-config.js +178 -0
  727. package/scripts/gds/onboarding-ship.js +92 -0
  728. package/scripts/gds/package-core.js +684 -0
  729. package/scripts/gds/paste-token.js +131 -0
  730. package/scripts/gds/portability-smoke-art.sh +85 -0
  731. package/scripts/gds/portability-smoke-memory.sh +147 -0
  732. package/scripts/gds/provision.js +1324 -0
  733. package/scripts/gds/publish-manifest.js +307 -0
  734. package/scripts/gds/pulse.js +309 -0
  735. package/scripts/gds/push-main.js +45 -0
  736. package/scripts/gds/read-session-export.js +359 -0
  737. package/scripts/gds/reauth.js +149 -0
  738. package/scripts/gds/recall.js +135 -0
  739. package/scripts/gds/release.js +71 -0
  740. package/scripts/gds/render-ideas.js +173 -0
  741. package/scripts/gds/repo-metrics.js +363 -0
  742. package/scripts/gds/resolve-skill-model.js +57 -0
  743. package/scripts/gds/run-routine.js +197 -0
  744. package/scripts/gds/run-unit-tests.js +178 -0
  745. package/scripts/gds/sandbox-stage.js +653 -0
  746. package/scripts/gds/search-ingest-db.js +209 -0
  747. package/scripts/gds/search-ingest-md.js +225 -0
  748. package/scripts/gds/security-baseline-check.sh +180 -0
  749. package/scripts/gds/seed-adopt-tasks.js +75 -0
  750. package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
  751. package/scripts/gds/seed-bongos-app-tasks.js +294 -0
  752. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
  753. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
  754. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
  755. package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
  756. package/scripts/gds/seed-bongos-tasks.js +214 -0
  757. package/scripts/gds/seed-gds-v4-tasks.js +624 -0
  758. package/scripts/gds/seed-governance-tasks.js +340 -0
  759. package/scripts/gds/seed-medusa-tasks.js +440 -0
  760. package/scripts/gds/seed-module-upstreaming.js +219 -0
  761. package/scripts/gds/seed-productization-tasks.js +235 -0
  762. package/scripts/gds/seed-provisioning-tasks.js +83 -0
  763. package/scripts/gds/seed-staging.sh +104 -0
  764. package/scripts/gds/seed-v2-world-tasks.js +283 -0
  765. package/scripts/gds/seed-v3-tasks.js +1981 -0
  766. package/scripts/gds/session-cost.js +393 -0
  767. package/scripts/gds/session-digest.js +179 -0
  768. package/scripts/gds/session-eval.js +576 -0
  769. package/scripts/gds/session.js +404 -0
  770. package/scripts/gds/setup.js +504 -0
  771. package/scripts/gds/shell.js +100 -0
  772. package/scripts/gds/ship.js +3618 -0
  773. package/scripts/gds/smoke-batch-claim.sh +213 -0
  774. package/scripts/gds/smoke-batch-release.sh +296 -0
  775. package/scripts/gds/smoke-box.sh +150 -0
  776. package/scripts/gds/smoke-claim-consistency.sh +212 -0
  777. package/scripts/gds/smoke-dependencies.sh +84 -0
  778. package/scripts/gds/smoke-gds.js +125 -0
  779. package/scripts/gds/smoke-write.sh +168 -0
  780. package/scripts/gds/start.js +782 -0
  781. package/scripts/gds/status.js +365 -0
  782. package/scripts/gds/triage.js +366 -0
  783. package/scripts/gds/upgrade.js +421 -0
  784. package/scripts/gds/validate-design.js +254 -0
  785. package/scripts/gds/version-close.js +549 -0
  786. package/scripts/migrate.sh +183 -0
  787. package/scripts/migrate_cost_ledger.sh +178 -0
  788. package/scripts/public-mirror-export.js +291 -0
  789. package/scripts/render-diagrams.sh +88 -0
  790. package/scripts/security/dep-audit.js +276 -0
  791. package/scripts/setup-builder.js +274 -0
  792. package/scripts/setup-builder.sh +28 -0
  793. package/scripts/snapshots/backfill-history.mjs +292 -0
  794. package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
  795. package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
  796. package/scripts/snapshots/render-world.mjs +322 -0
  797. package/scripts/status-mirror-sync.js +192 -0
  798. package/scripts/status-probe.mjs +185 -0
  799. package/server.js +212 -0
  800. package/src/asset-version.js +71 -0
  801. package/src/bongos/CLAUDE.md +64 -0
  802. package/src/bongos/api-errors.js +281 -0
  803. package/src/bongos/api-path-404.js +67 -0
  804. package/src/bongos/api-prefix.js +38 -0
  805. package/src/bongos/app-pair.js +172 -0
  806. package/src/bongos/auth.js +979 -0
  807. package/src/bongos/cascade-dispatch.js +123 -0
  808. package/src/bongos/db-kernel.js +252 -0
  809. package/src/bongos/db.js +911 -0
  810. package/src/bongos/goal-scope-check.js +120 -0
  811. package/src/bongos/hierarchy-config.js +189 -0
  812. package/src/bongos/live-channel.js +145 -0
  813. package/src/bongos/llm-cache.js +260 -0
  814. package/src/bongos/llm-pricing.js +220 -0
  815. package/src/bongos/metrics.js +286 -0
  816. package/src/bongos/middleware/audit.js +274 -0
  817. package/src/bongos/middleware/error-envelope.js +93 -0
  818. package/src/bongos/middleware/rate-limit.js +195 -0
  819. package/src/bongos/module-scope-map.js +271 -0
  820. package/src/bongos/optimizer.js +166 -0
  821. package/src/bongos/path-match.js +47 -0
  822. package/src/bongos/permission-path-check.js +248 -0
  823. package/src/bongos/pool.js +55 -0
  824. package/src/bongos/repo-info.js +91 -0
  825. package/src/bongos/route-rank-check.js +420 -0
  826. package/src/bongos/routes/CLAUDE.md +43 -0
  827. package/src/bongos/routes/_helpers.js +369 -0
  828. package/src/bongos/routes/audit-log.js +59 -0
  829. package/src/bongos/routes/auth.js +755 -0
  830. package/src/bongos/routes/backup.js +104 -0
  831. package/src/bongos/routes/builders.js +526 -0
  832. package/src/bongos/routes/healthz.js +16 -0
  833. package/src/bongos/routes/instance.js +129 -0
  834. package/src/bongos/routes/live.js +125 -0
  835. package/src/bongos/routes/llm-cache.js +119 -0
  836. package/src/bongos/routes/me.js +380 -0
  837. package/src/bongos/routes/modules.js +131 -0
  838. package/src/bongos/routes/optimizer.js +54 -0
  839. package/src/bongos/routes/public.js +476 -0
  840. package/src/bongos/routes/security.js +207 -0
  841. package/src/bongos/routes.js +166 -0
  842. package/src/bongos/secret-box.js +177 -0
  843. package/src/bongos/sensitive-surfaces.js +30 -0
  844. package/src/bongos/serve-internal.js +889 -0
  845. package/src/bongos/uptime-poller.js +90 -0
  846. package/src/bongos-downloads.js +70 -0
  847. package/src/branding.js +182 -0
  848. package/src/build-info.js +77 -0
  849. package/src/devbox-downloads.js +67 -0
  850. package/src/instance-config.js +200 -0
  851. package/src/module-api.js +366 -0
  852. package/src/module-loader/loader.js +268 -0
  853. package/src/module-loader/manifest-schema.js +140 -0
  854. package/src/module-loader/provenance.js +28 -0
  855. package/src/module-loader/semver.js +100 -0
  856. package/src/module-seams.js +291 -0
  857. package/src/modules.js +254 -0
  858. package/src/platform-server.js +135 -0
  859. package/src/ui/adapters/claude-design/index.js +333 -0
  860. package/src/ui/adapters/figma/index.js +328 -0
  861. package/tests/abandon_task.mjs +138 -0
  862. package/tests/achievements_reconcile.mjs +167 -0
  863. package/tests/adopt_detect.mjs +141 -0
  864. package/tests/adopt_import.mjs +132 -0
  865. package/tests/adopt_preflight.mjs +105 -0
  866. package/tests/anti_grid.mjs +89 -0
  867. package/tests/api_client.mjs +231 -0
  868. package/tests/api_docs.mjs +283 -0
  869. package/tests/api_error_envelope_buildcheck.mjs +56 -0
  870. package/tests/api_error_envelope_middleware.mjs +99 -0
  871. package/tests/api_error_registry.mjs +108 -0
  872. package/tests/api_pagination_contract.mjs +51 -0
  873. package/tests/api_path_404.mjs +96 -0
  874. package/tests/app_pair.mjs +168 -0
  875. package/tests/architect.mjs +140 -0
  876. package/tests/art_key.mjs +121 -0
  877. package/tests/art_stage.mjs +121 -0
  878. package/tests/asset_version.mjs +94 -0
  879. package/tests/atlas.mjs +69 -0
  880. package/tests/audit_deps.mjs +74 -0
  881. package/tests/audit_middleware.mjs +385 -0
  882. package/tests/auth_admission_gate.mjs +164 -0
  883. package/tests/auth_anthropic_identity.mjs +95 -0
  884. package/tests/auth_duplicate_cookie.mjs +56 -0
  885. package/tests/auth_error_brand.mjs +77 -0
  886. package/tests/auth_flow_slice1.mjs +223 -0
  887. package/tests/auth_inactive_builder.mjs +94 -0
  888. package/tests/auth_page_gate.mjs +92 -0
  889. package/tests/auth_session_ttl.mjs +155 -0
  890. package/tests/autonomous_fit_protected_paths.mjs +115 -0
  891. package/tests/autonomy_gate.mjs +85 -0
  892. package/tests/autotile_variants.mjs +256 -0
  893. package/tests/autotile_xverify.mjs +133 -0
  894. package/tests/backfill_sessions.mjs +101 -0
  895. package/tests/backfill_task_rewards.mjs +152 -0
  896. package/tests/backup_cli.mjs +104 -0
  897. package/tests/bfg.mjs +327 -0
  898. package/tests/bfg_write.mjs +423 -0
  899. package/tests/bongos_box_connect.mjs +89 -0
  900. package/tests/bongos_dispatch.mjs +74 -0
  901. package/tests/bongos_downloads.mjs +118 -0
  902. package/tests/bongos_login.mjs +34 -0
  903. package/tests/box_access.mjs +186 -0
  904. package/tests/box_auth_check.mjs +114 -0
  905. package/tests/box_code_staleness.mjs +116 -0
  906. package/tests/box_connect_e2e.mjs +196 -0
  907. package/tests/box_cost.mjs +70 -0
  908. package/tests/box_dns_repoint.mjs +151 -0
  909. package/tests/box_host_keys.mjs +102 -0
  910. package/tests/box_onboard.mjs +317 -0
  911. package/tests/box_scope_session.mjs +115 -0
  912. package/tests/box_ship_permissions.mjs +71 -0
  913. package/tests/box_terminal_ssrf.mjs +90 -0
  914. package/tests/boxes.mjs +1255 -0
  915. package/tests/branding.mjs +88 -0
  916. package/tests/bug_attachments.mjs +189 -0
  917. package/tests/build_info.mjs +88 -0
  918. package/tests/builder_needs.mjs +99 -0
  919. package/tests/cap_newcomer_tasks.mjs +114 -0
  920. package/tests/cascade-dispatch.mjs +95 -0
  921. package/tests/cf_tunnel.mjs +459 -0
  922. package/tests/claim_recall.mjs +150 -0
  923. package/tests/claims_bind_session.mjs +47 -0
  924. package/tests/claude_materialize.mjs +148 -0
  925. package/tests/cli_box_scope.mjs +52 -0
  926. package/tests/cli_lib_formatters.mjs +87 -0
  927. package/tests/cli_token_reissue.mjs +147 -0
  928. package/tests/client_bundle_route.mjs +47 -0
  929. package/tests/cloud_bongos_pack.mjs +85 -0
  930. package/tests/conductor.mjs +496 -0
  931. package/tests/confirm_attribution.mjs +156 -0
  932. package/tests/conflict_resolve.mjs +462 -0
  933. package/tests/context_pack.mjs +240 -0
  934. package/tests/cost.mjs +94 -0
  935. package/tests/cost_audit.mjs +122 -0
  936. package/tests/cost_budget_status.mjs +78 -0
  937. package/tests/cost_reconcile.mjs +102 -0
  938. package/tests/cost_summary_shape.mjs +94 -0
  939. package/tests/credit_grant.mjs +376 -0
  940. package/tests/criterion_progress.mjs +220 -0
  941. package/tests/criterion_proposal.mjs +109 -0
  942. package/tests/criterion_ref_parse.mjs +53 -0
  943. package/tests/currency_label.mjs +119 -0
  944. package/tests/day_cycle.mjs +197 -0
  945. package/tests/dependencies_migration.mjs +77 -0
  946. package/tests/dependencies_polymorphic.mjs +212 -0
  947. package/tests/deploy_instance.mjs +78 -0
  948. package/tests/devbox_downloads.mjs +122 -0
  949. package/tests/diff_derived_signals.mjs +115 -0
  950. package/tests/discord_approvals.mjs +174 -0
  951. package/tests/discord_autojoin.mjs +158 -0
  952. package/tests/discord_bot.mjs +94 -0
  953. package/tests/discord_bugs.mjs +297 -0
  954. package/tests/discord_channels.mjs +337 -0
  955. package/tests/discord_foundation.mjs +76 -0
  956. package/tests/discord_inbound.mjs +190 -0
  957. package/tests/discord_message_buffer.mjs +87 -0
  958. package/tests/discord_oauth.mjs +55 -0
  959. package/tests/discord_reaction.mjs +170 -0
  960. package/tests/discord_role_sync.mjs +151 -0
  961. package/tests/display_name.mjs +123 -0
  962. package/tests/dns_preflight.mjs +74 -0
  963. package/tests/event_sound_prefs.mjs +194 -0
  964. package/tests/eviction_policy.mjs +279 -0
  965. package/tests/figma_adapter.mjs +199 -0
  966. package/tests/file_map.mjs +91 -0
  967. package/tests/first_admin_bootstrap.mjs +40 -0
  968. package/tests/fitness.mjs +435 -0
  969. package/tests/fitness_two_root.mjs +104 -0
  970. package/tests/fixtures/session-506-digest.json +34 -0
  971. package/tests/gate_approvals.mjs +451 -0
  972. package/tests/gate_review.mjs +152 -0
  973. package/tests/git_merge_regen.mjs +151 -0
  974. package/tests/github_push_ancestry.mjs +119 -0
  975. package/tests/github_push_land_proof.mjs +127 -0
  976. package/tests/github_push_merge_driver.mjs +175 -0
  977. package/tests/goal_abuse_matrix.mjs +187 -0
  978. package/tests/goal_achievement.mjs +146 -0
  979. package/tests/goal_conflicts.mjs +305 -0
  980. package/tests/goal_dependencies_read.mjs +73 -0
  981. package/tests/goal_member_roles.mjs +420 -0
  982. package/tests/goal_membership_requests.mjs +332 -0
  983. package/tests/goal_routes.mjs +203 -0
  984. package/tests/goal_scope_check.mjs +167 -0
  985. package/tests/goal_tier.mjs +312 -0
  986. package/tests/goal_wall_proof.mjs +112 -0
  987. package/tests/grade_attempts.mjs +73 -0
  988. package/tests/grade_attribution.mjs +117 -0
  989. package/tests/grade_diff_hash.mjs +191 -0
  990. package/tests/grade_server_authoritative.mjs +305 -0
  991. package/tests/grade_unavailable_display.mjs +66 -0
  992. package/tests/grader.mjs +1960 -0
  993. package/tests/grader_bypass.mjs +57 -0
  994. package/tests/grader_panel.mjs +252 -0
  995. package/tests/grader_prompt_fencing.mjs +192 -0
  996. package/tests/helpers.mjs +52 -0
  997. package/tests/hierarchy-config.mjs +81 -0
  998. package/tests/init.mjs +463 -0
  999. package/tests/instance_config.mjs +76 -0
  1000. package/tests/instance_manifest.mjs +110 -0
  1001. package/tests/interaction_prefs.mjs +72 -0
  1002. package/tests/key-card.mjs +110 -0
  1003. package/tests/key-status.mjs +45 -0
  1004. package/tests/land_watch.mjs +115 -0
  1005. package/tests/lifecycle-card.mjs +145 -0
  1006. package/tests/lifecycle_breakdown_view.mjs +236 -0
  1007. package/tests/linkify_refs.mjs +264 -0
  1008. package/tests/live_channel.mjs +128 -0
  1009. package/tests/live_sse.mjs +122 -0
  1010. package/tests/llm-cache-route.mjs +110 -0
  1011. package/tests/llm-cache.mjs +140 -0
  1012. package/tests/llm-pricing.mjs +152 -0
  1013. package/tests/local_preview.mjs +136 -0
  1014. package/tests/main_audit.mjs +137 -0
  1015. package/tests/memory_isolation.mjs +431 -0
  1016. package/tests/memory_map.mjs +107 -0
  1017. package/tests/memory_pull.mjs +429 -0
  1018. package/tests/merge_lease.mjs +100 -0
  1019. package/tests/merge_lock.mjs +312 -0
  1020. package/tests/metrics.mjs +147 -0
  1021. package/tests/migration_allocation.mjs +146 -0
  1022. package/tests/migration_namespace.mjs +185 -0
  1023. package/tests/migrations_fresh_replay_guard.mjs +38 -0
  1024. package/tests/mirror_lineage_fulltree.mjs +45 -0
  1025. package/tests/mirror_lineage_proof.mjs +72 -0
  1026. package/tests/mirror_redact.mjs +193 -0
  1027. package/tests/model_alloc_prefs.mjs +63 -0
  1028. package/tests/module-scope-map.mjs +88 -0
  1029. package/tests/module_api.mjs +110 -0
  1030. package/tests/module_cli.mjs +292 -0
  1031. package/tests/module_contributions.mjs +148 -0
  1032. package/tests/module_loader.mjs +286 -0
  1033. package/tests/module_manifest.mjs +194 -0
  1034. package/tests/module_owned_tests.mjs +105 -0
  1035. package/tests/module_provenance.mjs +34 -0
  1036. package/tests/module_route_rank.mjs +147 -0
  1037. package/tests/module_seams.mjs +68 -0
  1038. package/tests/modules.mjs +156 -0
  1039. package/tests/modules_route.mjs +38 -0
  1040. package/tests/newcomer_floor.mjs +17 -0
  1041. package/tests/newcomer_restock.mjs +80 -0
  1042. package/tests/next_number.mjs +154 -0
  1043. package/tests/oauth_secret.mjs +60 -0
  1044. package/tests/onboard.mjs +70 -0
  1045. package/tests/onboarding_gate.mjs +267 -0
  1046. package/tests/onboarding_observability.mjs +344 -0
  1047. package/tests/onboarding_route_signals.mjs +175 -0
  1048. package/tests/onboarding_state.mjs +346 -0
  1049. package/tests/one_active_claim_per_session.mjs +111 -0
  1050. package/tests/orphaned_claim_ship.mjs +135 -0
  1051. package/tests/override_attribution.mjs +142 -0
  1052. package/tests/override_request_ownership.mjs +235 -0
  1053. package/tests/package_core.mjs +435 -0
  1054. package/tests/parallel-load.mjs +402 -0
  1055. package/tests/path_match.mjs +62 -0
  1056. package/tests/permission_path.mjs +151 -0
  1057. package/tests/platform_boot.mjs +167 -0
  1058. package/tests/pre_compact.mjs +60 -0
  1059. package/tests/preview_server.mjs +127 -0
  1060. package/tests/profile_route.mjs +197 -0
  1061. package/tests/provision.mjs +805 -0
  1062. package/tests/provisioning_github_app_routes.mjs +98 -0
  1063. package/tests/public_mirror_export.mjs +124 -0
  1064. package/tests/public_task_resolver.mjs +112 -0
  1065. package/tests/publish_branch_route.mjs +422 -0
  1066. package/tests/publish_manifest.mjs +184 -0
  1067. package/tests/publish_reconciler.mjs +728 -0
  1068. package/tests/rank_gate.mjs +463 -0
  1069. package/tests/rate_limit_public.mjs +217 -0
  1070. package/tests/read_session_export.mjs +89 -0
  1071. package/tests/recall_cli.mjs +82 -0
  1072. package/tests/recall_hints.mjs +119 -0
  1073. package/tests/recent_shipped_window.mjs +80 -0
  1074. package/tests/regrade_eligibility.mjs +202 -0
  1075. package/tests/render_prefs.mjs +122 -0
  1076. package/tests/repo_map.mjs +92 -0
  1077. package/tests/reward_gate.mjs +284 -0
  1078. package/tests/route_rank_check.mjs +243 -0
  1079. package/tests/route_validation.mjs +490 -0
  1080. package/tests/routine_timers.mjs +72 -0
  1081. package/tests/rubric_fixtures.mjs +140 -0
  1082. package/tests/run_routine.mjs +69 -0
  1083. package/tests/sandbox_stage.mjs +582 -0
  1084. package/tests/scrubber_corpus.mjs +257 -0
  1085. package/tests/search_chunker.mjs +209 -0
  1086. package/tests/search_ingest.mjs +96 -0
  1087. package/tests/search_ingest_db.mjs +88 -0
  1088. package/tests/search_isolation.mjs +204 -0
  1089. package/tests/search_route.mjs +95 -0
  1090. package/tests/secret_box.mjs +189 -0
  1091. package/tests/security_docs.mjs +186 -0
  1092. package/tests/security_route.mjs +108 -0
  1093. package/tests/served_paths_shipped.mjs +118 -0
  1094. package/tests/session-cards.mjs +142 -0
  1095. package/tests/session_506_regression.mjs +69 -0
  1096. package/tests/session_caps.mjs +238 -0
  1097. package/tests/session_cost.mjs +133 -0
  1098. package/tests/session_digest.mjs +73 -0
  1099. package/tests/session_eval.mjs +386 -0
  1100. package/tests/session_index.mjs +105 -0
  1101. package/tests/session_records.mjs +369 -0
  1102. package/tests/session_search.mjs +78 -0
  1103. package/tests/session_start_freshness.mjs +123 -0
  1104. package/tests/setup_smoke.mjs +154 -0
  1105. package/tests/ship_autolinkify.mjs +60 -0
  1106. package/tests/ship_automerge_injection.mjs +174 -0
  1107. package/tests/ship_broadcast_routing.mjs +125 -0
  1108. package/tests/ship_broadcast_server.mjs +175 -0
  1109. package/tests/ship_card.mjs +280 -0
  1110. package/tests/ship_ci_deploy.mjs +374 -0
  1111. package/tests/ship_preflight.mjs +368 -0
  1112. package/tests/ship_premerge.mjs +75 -0
  1113. package/tests/ship_resume.mjs +129 -0
  1114. package/tests/ship_upload_skip.mjs +89 -0
  1115. package/tests/ship_zero_commit.mjs +60 -0
  1116. package/tests/single_host_hall.mjs +98 -0
  1117. package/tests/skill_prefs.mjs +150 -0
  1118. package/tests/smoke_preflight.mjs +66 -0
  1119. package/tests/snapshot_picker.mjs +233 -0
  1120. package/tests/sound_prefs.mjs +198 -0
  1121. package/tests/sprite_facing.mjs +35 -0
  1122. package/tests/status-probe.mjs +89 -0
  1123. package/tests/status_backfill.mjs +94 -0
  1124. package/tests/stop_refcheck.mjs +127 -0
  1125. package/tests/streak.mjs +175 -0
  1126. package/tests/subdomain_auth.mjs +58 -0
  1127. package/tests/task_classifier_vocab.mjs +41 -0
  1128. package/tests/task_create_idempotency.mjs +96 -0
  1129. package/tests/task_goal_link.mjs +93 -0
  1130. package/tests/task_ownership_gate.mjs +125 -0
  1131. package/tests/terrain_picker.mjs +298 -0
  1132. package/tests/touches_overlap.mjs +75 -0
  1133. package/tests/triage_development.mjs +140 -0
  1134. package/tests/turn_in_place.mjs +280 -0
  1135. package/tests/upgrade.mjs +357 -0
  1136. package/tests/verify_task_guard.mjs +64 -0
  1137. package/tests/version_close.mjs +76 -0
  1138. package/tests/versions_route.mjs +93 -0
  1139. package/tests/walkability.mjs +188 -0
  1140. package/tests/wandering_prefs.mjs +176 -0
  1141. package/tests/worktree_disambiguation.mjs +105 -0
  1142. package/tests/worktree_guard.mjs +90 -0
@@ -0,0 +1,124 @@
1
+ # ADR 0022 — Secrets policy
2
+
3
+ **Date:** 2026-05-28
4
+ **Context:** Task [#279](https://example.com/builders#/task/279) (V3.R60), GDS-V3 criterion C8. Builds on the pre-commit hook + CI scan shipped by [#257](https://example.com/builders#/task/257) (V3.R36) and pairs with [ADR 0020](<redacted>.md) (security model — public stub) and [ADR 0016](<redacted>.md) (trust boundary). Companion to [`docs/security-baseline.md`](../security-baseline.md) item 6.
5
+ **Status:** Accepted.
6
+
7
+ ## Problem
8
+
9
+ A secret committed to a public repo is a credential someone else can use within minutes — even after a force-push to remove it, the value survives in forks, GitHub's commit cache, and any clone made between the commit and the removal. The right model is **defense in depth**: each layer assumes the next one will fail.
10
+
11
+ We already have parts of this:
12
+
13
+ - Pre-commit hook in `.husky/pre-commit` blocks the obvious shapes locally.
14
+ - `.github/workflows/secrets-scan.yml` re-scans full history in CI on every PR.
15
+ - `.gitignore` lists `.env.local`.
16
+ - Live credentials resolve from `/etc/example/` on the droplet or `~/.config/otb/env` on builder laptops — neither path is tracked.
17
+
18
+ What's missing — and what this ADR adds — is a written **policy** that defines:
19
+
20
+ 1. What counts as a secret (so the scan can be tuned).
21
+ 2. Where secrets are allowed to live (so a builder spinning up a fresh worktree knows the recipe).
22
+ 3. How rotation works (so a leak is recoverable, not catastrophic).
23
+ 4. What to do when a hit is found (so the response is mechanical, not improvised).
24
+
25
+ Without this document, every new builder reinvents the answers. Some answers will be wrong.
26
+
27
+ ## Decision
28
+
29
+ This ADR is **the policy**. The pre-commit hook + the CI workflow are the **enforcement**. The `docs/security-baseline.md` check is the **assertion that both still exist**. Each layer is independently maintained but consistent with this document.
30
+
31
+ ## What counts as a secret
32
+
33
+ A "secret" for the purposes of this policy is any string that, if disclosed, would let an attacker act on behalf of the project or a builder.
34
+
35
+ **In scope** (the scan looks for these shapes; treat any leak as a credential compromise):
36
+
37
+ - GitHub Personal Access Tokens (`ghp_`, `gho_`, `ghu_`, `ghs_`, `ghr_`)
38
+ - GitHub OAuth client secrets (40-char hex)
39
+ - AWS access key IDs (`AKIA…` + the matching secret on the same line or nearby)
40
+ - Google API keys (`AIza…` + 35 chars), Google service-account JSON bodies (look for `"private_key": "<redacted> PRIVATE KEY"`)
41
+ - Slack tokens (`xoxa-`, `xoxb-`, `xoxp-`, `xoxr-`, `xoxs-`)
42
+ - Stripe live + test secret keys (`sk_live_`, `sk_test_`)
43
+ - Any RSA / EC / DSA / Ed25519 private key (`-----BEGIN … PRIVATE KEY-----`)
44
+ - TLS private keys (`-----BEGIN PRIVATE KEY-----`)
45
+ - Cloudflare Origin Certificate private halves (lives on droplet only — see [ADR 0003](<redacted>.md))
46
+ - Postgres passwords (if peer-auth ever gets replaced with password auth — see [`docs/recipes/ops-gotchas.md`](../recipes/ops-gotchas.md) for the current peer-auth setup)
47
+ - GDS session bearer tokens (any value of `gds_session` / `pms_session`)
48
+
49
+ **Out of scope** (these are *config*, not secrets — they may live in the repo):
50
+
51
+ - Public URLs, droplet IP `REDACTED_IP` (it's the A record's target — already published)
52
+ - Cloudflare zone IDs, GitHub OAuth Client *IDs* (the matching *secret* is in scope)
53
+ - Postgres database / user names (`example`, the deploy user), CORS-allowed origins
54
+ - Public Stripe publishable keys (`pk_live_…`, `pk_test_…`) — these are *meant* to ship in client code
55
+
56
+ ## Where secrets are allowed to live
57
+
58
+ Three lanes, each with explicit access controls. **Nothing else** is sanctioned; if a fourth lane appears, this ADR is the bug.
59
+
60
+ | Lane | Path | Tracked? | Permissions | Used by |
61
+ |---|---|---|---|---|
62
+ | Droplet long-lived | `/etc/example/secrets.env` (chmod 600, owned by `lars`) | no — outside the repo | only the `lars` user + root | systemd service file sources it before exec |
63
+ | Droplet rotating | `/etc/example/secrets/<name>` (chmod 600, per-secret file) | no | only the `lars` user + root | individual services that read one file at startup |
64
+ | Builder laptop | `~/.config/otb/env` AND `.env.local` (gitignored, lives at the repo root in the main checkout and copies into worktrees on session start) | no — explicitly gitignored | the builder's macOS user account | `art/pipeline/gen_api.py` reads `~/.config/otb/env`; everything else reads `.env.local` |
65
+
66
+ > **Multi-line secrets (e.g. a GitHub App private key, PEM).** Store in the droplet long-lived lane as a single line with literal `\n` escapes — `GITHUB_APP_PRIVATE_KEY="<redacted>"` — and the reader restores the newlines (`src/bongos/github-push.js normalizePem`). The GitHub App credential for server-mediated publish (`GITHUB_APP_ID` + `GITHUB_APP_INSTALLATION_ID` + `GITHUB_APP_PRIVATE_KEY`, [ADR 0055](<redacted>.md) / task 1028) lives here alongside the `GITHUB_PUSH_TOKEN` PAT it replaces.
67
+
68
+ Notably **not allowed**:
69
+
70
+ - Anywhere under the repo root that is not gitignored.
71
+ - A "convenience" copy on the droplet outside `/etc/example/`.
72
+ - An environment variable exported in a builder's `.zshrc` (it ends up in shell history; it isn't auditable).
73
+ - Cloud "secrets managers" (AWS Secrets Manager, GCP Secret Manager, 1Password Connect, etc.) — out of budget for a $5K/year project and adds a single point of failure that's not worth it at this scale.
74
+
75
+ ## How rotation works
76
+
77
+ When a credential is rotated — either because we found a leak or because the credential is reaching its TTL — the operation is:
78
+
79
+ 1. **Generate the new credential** at the issuing service (GitHub, Google, Stripe, Cloudflare, etc.).
80
+ 2. **Update the droplet** — `ssh lars@REDACTED_IP`, edit `/etc/example/secrets.env` (or the per-secret file), restart the affected service. Time gap: ≤ 5 minutes.
81
+ 3. **Update each builder laptop's local copy** — Lars notifies the team (chat broadcast or in-person); builders update `~/.config/otb/env` or `.env.local`. Builders who don't update can't run pipelines that need the rotated credential; they'll discover this when their next `art/` run fails.
82
+ 4. **Revoke the old credential** at the issuing service. Do this AFTER step 2; the brief overlap is intentional so a slow-rolling service catches both keys.
83
+ 5. **Log the rotation** — a one-line entry to [`docs/recipes/ops-gotchas.md`](../recipes/ops-gotchas.md) (date + which credential + why), so the next builder spinning up knows what changed when.
84
+
85
+ GDS session tokens rotate automatically — they're 30-day-TTL, refresh-on-use, revocable per session or per builder (migration `<redacted>.sql`, ADR-aligned with [ADR 0016](<redacted>.md)). No manual rotation needed for those except in a leak scenario, which falls under "What to do on a hit" below.
86
+
87
+ ## What to do when the scan finds a hit
88
+
89
+ If `.husky/pre-commit` blocks a commit, OR `.github/workflows/secrets-scan.yml` fails on a PR, OR a one-off TruffleHog run finds a hit in history, OR `scripts/gds/security-baseline-check.sh` item 6 flips to FAIL:
90
+
91
+ 1. **Stop**. Do not push, do not merge, do not delete the offending file from the working tree (yet).
92
+ 2. **Identify the credential** — what service, what scope, was it ever active in production.
93
+ 3. **Rotate the credential first** (steps 1-4 above). Treat the leaked value as compromised even if the scan was a pre-commit catch — the same value may have been pasted into a chat or a sibling file.
94
+ 4. **Then** rewrite the offending file (remove the credential) and commit. If the credential was already in pushed history, run `git filter-repo --replace-text <pattern>` to scrub it from every commit. This rewrites SHAs; force-push is required; CI scan re-validates afterward.
95
+ 5. **Document** — add an entry to [`docs/recipes/ops-gotchas.md`](../recipes/ops-gotchas.md) with the date, what happened, and what changed in the response so the next time it goes faster.
96
+ 6. **Forks + clones** — the rewrite doesn't reach existing clones. Anyone with an outdated clone gets a `git fetch` warning about non-fast-forward; they re-clone. Forks that mirror via GitHub's mirror feature need a manual `git push --force` from the upstream-aware operator.
97
+
98
+ The cost of skipping step 3 is "the leaked credential keeps being a leaked credential, just out of sight." The cost of skipping step 5 is "next time, this is a 20-minute incident again."
99
+
100
+ ## Historical sweep
101
+
102
+ A one-time scan of the full git history happened as part of this ADR (V3.R60, 2026-05-28). The repo was scanned for all in-scope secret shapes; **no hits were found**. The scan was performed with built-in tooling (`git rev-list --all --objects` piped through pattern grep) rather than TruffleHog because trufflehog was not yet installed on the builder's laptop at scan time and the CI scan covers the trufflehog-shape case continuously. The all-clear is documented here so a future operator doesn't repeat the sweep without cause.
103
+
104
+ If a future audit *does* find a hit, follow "What to do when the scan finds a hit" above. The all-clear is point-in-time; a credential that lands tomorrow needs the same response.
105
+
106
+ ## Scrubbing secrets OUT of session uploads (the BFG corpus)
107
+
108
+ The enforcement above keeps secrets out of the **repo**. A second egress exists: the BFG session-inefficiency evaluator ([ADR 0027](<redacted>.md)) uploads a digest of each Claude Code session to the GDS `sessions` corpus. A transcript contains every file read, command output, and pasted value — so the upload path is scrubbed by **the same policy, applied client-side at upload time**, in `scrubSecrets()` (`scripts/gds/ship.js`, used by both `ship.js` and `session-digest.js`).
109
+
110
+ This scrubber is **transcript-grade** and **recall-first** (task 1003, which also completed the open token-redaction of task 723): a missed secret is a credential compromise, while over-redacting a non-secret in a BFG digest is merely cosmetic, so when in doubt it redacts. Five layers: (1) literal dynamic values — this run's GDS session token + every secret-shaped **env value** (`collectEnvSecrets()`, e.g. the `MAC_*`/`APPLE_*` signing creds, a baked GDS/DO token); (2) multi-line PEM private-key blocks; (3) the in-scope known shapes from this ADR (provider key prefixes, Stripe `sk_`/`rk_`/`whsec_`, our `gds_`/`pms_` tokens, `Authorization`/`Bearer` headers, JWTs, credentialed DSNs, Apple app-specific passwords); (4) recognised-key `key=value` / JSON-field assignments; (5) a **high-entropy catch-all** (`looksHighEntropySecret()`) over base64url/hex runs ≥20 chars — the net for an *unknown* secret shape. The accepted cost of layer 5 is that high-entropy non-secrets (git SHAs, UUIDs, a 40-hex value shape-identical to a GitHub OAuth client secret) are redacted too; the structured BFG metrics that matter (token/turn counts, tool names, error flags) are separate fields and untouched. The planted-secret corpus in `tests/scrubber_corpus.mjs` is the regression gate — every planted secret must be fully redacted, every benign line must survive — and **gates the full-transcript capture task**: capture must not ship until this passes.
111
+
112
+ This scrubber is now a load-bearing enforcement surface alongside the pre-commit hook + CI scan; a change to the in-scope secret shapes above should update it (and its corpus) too, or the policy and the enforcement will drift.
113
+
114
+ ## Alternatives considered
115
+
116
+ - **Use a cloud secrets manager.** Rejected: cost (~$0.40/secret-month at AWS), latency (an extra network hop on cold start), single point of failure (the manager being down blocks deploys). At ~10 secrets and one operator, the filesystem-permissions model is cheaper and not meaningfully less secure.
117
+ - **Encrypt secrets in the repo (SOPS, git-crypt).** Rejected: shifts the problem from "don't commit the secret" to "don't lose the decryption key." The decryption key has to live somewhere; if it lives in the same repo, we've solved nothing; if it lives outside, we've reinvented the current `/etc/example/` model with extra steps.
118
+ - **Skip the pre-commit hook; rely on CI alone.** Rejected: CI catches the leak after the secret has already been pushed to GitHub (where it's now in their cache, even if the PR closes). The pre-commit hook is the fast feedback that prevents the leak from leaving the laptop.
119
+
120
+ ## Consequences
121
+
122
+ - New builders go through a one-line orientation: "creds live in /etc/example on the droplet, in ~/.config/otb/env or .env.local on your laptop, nowhere else." If they ask "but what if I want to commit one?" — the hook blocks them; if they push past the hook, CI blocks the merge.
123
+ - The pre-commit hook + CI workflow + security-baseline-check item 6 are now load-bearing. A change to any of them needs to update this ADR too, or the policy and the enforcement will drift.
124
+ - Rotation is the operator's responsibility (Lars). The team is informed via the chat broadcast; there is no automatic distribution of new secrets to builder laptops. This is a deliberate accept-the-friction choice — automatic distribution requires a secrets manager.
@@ -0,0 +1,118 @@
1
+ # ADR 0023 — Kind multipliers + staged idea-promotion bonus
2
+
3
+ **Date:** 2026-05-28
4
+ **Context:** GDS-V3, task [#247](https://example.com/builders#/task/247) (V3.R27 — Kind multipliers + staged idea-bonus).
5
+ **Status:** Accepted.
6
+
7
+ ## Problem
8
+
9
+ Every task in the GDS carries a `credits_reward` value (the in-world "drachmae" payout when the task ships). Before this ADR, that value was paid 1:1 regardless of task kind. A 40-credit `cleanup` ship and a 40-credit `bug` ship both landed exactly 40c. That's a problem for two reasons:
10
+
11
+ 1. **It silently disincentivises the work we want more of.** Capturing a learning that prevents a future bug, resolving a blocker that was costing the builder days, or landing a decision/ADR are all *higher leverage* per builder-hour than the average feature. Paying them the same says "we don't care which you do." In practice we care a lot.
12
+ 2. **The idea_inbox economy was unfunded.** Anyone could capture an idea, get it triaged into a task, and the task's eventual shipper got 100% of the reward. The capturer earned 0 — even though the idea was the unblocker. Capturing felt like volunteer work.
13
+
14
+ The fix has to be **small, transparent, and hard to game.** It can't be a sliding rubric the builder can argue with; it can't let a builder reclassify a task to chase 3× payouts; it has to leave a clear audit trail.
15
+
16
+ ## Decision
17
+
18
+ Two coordinated changes, both at credit-grant time inside the existing `applyGrade` / `confirmTask` / `decideOverrideRequest` transactions:
19
+
20
+ ### 1. Per-kind multiplier table (frozen constant in src/bongos/db.js)
21
+
22
+ ```js
23
+ const KIND_MULTIPLIERS = Object.freeze({
24
+ feature: 1.0,
25
+ bug: 1.2,
26
+ 'learning-capture': 1.5,
27
+ 'blocker-resolution':1.5,
28
+ decision: 1.3,
29
+ infra: 1.0,
30
+ refactor: 0.9,
31
+ cleanup: 0.8,
32
+ spike: 1.1,
33
+ unclassified: 1.0,
34
+ });
35
+ ```
36
+
37
+ Applied at the moment a `task.confirmed` credit_log row is written. The `description` column (added in migration 031 for the net-negative bonus) records the math inline:
38
+
39
+ ```
40
+ 40c × 1.5 = 60c (learning-capture)
41
+ ```
42
+
43
+ So an auditor reading credit_log later can reconstruct the payout without re-deriving the multiplier from the task's kind at read time.
44
+
45
+ ### 2. Staged idea-promotion bonus
46
+
47
+ When a task ships and the task was promoted from `idea_inbox` (i.e. there exists a row with `idea_inbox.promoted_to_task_id = task.id`), the original capturer (`idea_inbox.captured_by`) receives **25% of the multiplier-adjusted reward**, rounded to the nearest integer drachma. Paid as a separate `credit_log` row with `reason='idea_promotion_bonus'` and an explanatory description.
48
+
49
+ Guards:
50
+ - **Idempotent** on `(task_id, reason='idea_promotion_bonus')` — a re-grade can't double-pay.
51
+ - **No self-bonus**: if the same builder captured the idea AND shipped the task, no bonus is paid (they already got the full task reward).
52
+ - **Only when capturer is set**: idea_inbox rows where `captured_by IS NULL` (legacy imports) skip the bonus.
53
+
54
+ ## Multiplier values + rationale
55
+
56
+ The values fan out from `feature = 1.0` (the baseline kind) by no more than ±0.5×. Tight clamp on purpose: too narrow to make reclassification a meaningful exploit, wide enough to send a real signal.
57
+
58
+ | Kind | Mult | Why |
59
+ | ------------------- | ----- | ------------------------------------------------------------------------------------------------------ |
60
+ | `feature` | 1.0× | Baseline — every other value is "relative to a feature." |
61
+ | `bug` | 1.2× | Bug fixes prevent compounding failure. Slight bump to surface bug-finding as worthwhile-on-its-own. |
62
+ | `learning-capture` | 1.5× | High leverage: one captured learning saves N future debugging sessions. The most under-incentivised work in V2. |
63
+ | `blocker-resolution`| 1.5× | A resolved blocker unblocks every linked task. Same leverage argument as learnings. |
64
+ | `decision` | 1.3× | ADRs / planning artifacts are durable. Worth more than a single feature; not as compounding as a learning. |
65
+ | `infra` | 1.0× | Infra ships are large and valuable but already typically carry larger `credits_reward` values. No extra mult needed. |
66
+ | `refactor` | 0.9× | Refactors are mostly neutral — useful when they're a precursor to a feature, dead weight when they aren't. Light penalty. |
67
+ | `cleanup` | 0.8× | Cleanup is housekeeping. Necessary but not the work we want more of right now. Bigger penalty than refactor. |
68
+ | `spike` | 1.1× | Spikes produce knowledge (ADRs, follow-up tasks). Small premium to encourage them when uncertainty is real. |
69
+ | `unclassified` | 1.0× | Neutral — auto-classifier fallback. If a task lands here it should be re-kinded, not penalised. |
70
+
71
+ These are policy values. **They will be re-tuned at version close-out** (PMS retros) based on what mix of work we actually want for the next version. The fact that they live in a frozen constant in `db.js` (not a `kind_multipliers` table) is deliberate: changing them should require a code review and commit, not a `psql` UPDATE.
72
+
73
+ ## Idea-bonus rationale: why 25% and why a slice (not a flat fee)
74
+
75
+ **Why a slice (not flat):** The bonus has to scale with the task's value. A 5c throwaway-idea task and a 200c platform-shift task can both come out of the inbox; flat-fee would over-reward trivial captures and under-reward important ones. Slice scales naturally.
76
+
77
+ **Why 25%:** Big enough to be motivating (an idea that becomes a 100c bug-fix earns the capturer 25c — a meaningful chunk), small enough that the shipper still gets the majority share (their work is *executing* the idea, which is harder than capturing it). The shipper is paid 100% of the kind-adjusted reward; the capturer's bonus is *on top*, not deducted. (This is intentional. The marginal credit cost is real but small — most ideas come from the same handful of builders who would otherwise have shipped the work themselves.)
78
+
79
+ **Why "no self-bonus":** Self-paying would degenerate to "every capture is a free 25%." That's not what the bonus is for — it's compensation for the social good of capturing an idea *that someone else then runs with*.
80
+
81
+ ## Consequences
82
+
83
+ ### Direct
84
+ - All future ships pay out multiplier-adjusted credits. Old ships are untouched; their credit_log rows keep their NULL `description`.
85
+ - Learning-capture / blocker-resolution / decision ships become more attractive. Cleanup / refactor become slightly less so. The discipline mix should shift accordingly over the next two weeks of shipping.
86
+ - `idea_inbox.captured_by` becomes economically meaningful. Builders who triage and capture ideas now have a payoff curve. Capturing without expecting anything still works the same; capturing *deliberately* — knowing a bonus may follow — is rewarded.
87
+ - The `Credits awarded:` line in `/builder-ship` output gains two new lines when relevant (kind multiplier breakdown and idea-promotion bonus). Audit trail is also visible by reading `credit_log.description` directly.
88
+
89
+ ### Indirect
90
+ - **Game-the-system risk:** A builder could theoretically reclassify their `feature` task as `learning-capture` to chase 1.5×. Two safeguards:
91
+ - The auto-classifier (V2 [#122](https://example.com/builders#/task/122)) produces an opinion on `kind` at task creation; manual override is logged in `audit_log`.
92
+ - Subagent grader sees the kind in the prompt and can flag misclassifications in `issues[]`.
93
+ Worst case the swing is 0.5× — small enough that the friction of arguing the misclassification isn't worth the gain on most tasks.
94
+ - **Bonus drainage risk:** If a power-user captures hundreds of ideas in idea_inbox and they all eventually get shipped by others, that user accumulates large bonus payouts without doing the work. This is a *feature*, not a bug — capturing high-quality ideas IS valuable work. If the pattern becomes pathological we can cap per-capturer bonuses per version in a follow-up.
95
+ - **Re-grade idempotency:** Both the primary credit and the idea-bonus are guarded on the same `task_id` + `reason` key. A re-grade for the same task is a true no-op for both ledger rows.
96
+
97
+ ### Reversal posture
98
+
99
+ This is reversible at policy level by editing `KIND_MULTIPLIERS` (uniform 1.0s + `IDEA_BONUS_FRACTION = 0` would restore the V2 behaviour). Already-paid bonuses stay paid (the ledger is append-only).
100
+
101
+ ### What changes vs. what stays the same
102
+
103
+ | Before | After |
104
+ | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
105
+ | 40c feature ships → 40c | 40c feature ships → 40c (no change for the baseline) |
106
+ | 40c cleanup ships → 40c | 40c cleanup ships → 32c |
107
+ | 40c learning-capture ships → 40c | 40c learning-capture ships → 60c |
108
+ | credit_log row has NULL description | credit_log row has `40c × 1.5 = 60c (learning-capture)` |
109
+ | idea_inbox capturer earns 0 when their idea ships | idea_inbox capturer earns 25% of the multiplied amount (rounded), if different from the shipper |
110
+ | One credit_log row per ship | Up to two rows: `task.confirmed` (shipper) + optional `idea_promotion_bonus` (capturer) |
111
+ | `confirm` / `applyGrade` / `decideOverrideRequest` write 1× raw | All three paths route through `insertMultipliedConfirmCredit` + `maybeAwardIdeaPromotionBonus` |
112
+
113
+ ## Cross-refs
114
+
115
+ - Pairs with R32 (criterion-proposal workflow) — proposers will earn similar staged credit when their criteria land. Same shape, different source table.
116
+ - Builds on migration 031 (V3.R93 [#354](https://example.com/builders#/task/354)) which added `credit_log.description` for the net-negative ship bonus.
117
+ - Migration 041 (this task) reserves the migration number; the actual policy lives in code.
118
+ - Cross-references the kind enum from migration 006 (V2): `feature, bug, infra, refactor, spike, learning-capture, cleanup, decision, blocker-resolution, unclassified`.
@@ -0,0 +1,277 @@
1
+ # ADR 0024 — Cloneable repo + local-first memory with server-canonical sync
2
+
3
+ **Date:** 2026-05-29
4
+ **Context:** GDS-V3, spike [#230](https://example.com/builders#/task/230) (V3.R04 — Architecture spike: cloneability + local-first memory with server sync). Satisfies done-when criterion C8 (`cloneable-local-memory-server-sync`). Companion to [ADR 0016](<redacted>.md) (trust boundary — same enforcement boundary applies here) and [ADR 0022](0022-secrets-policy.md) (no secrets in repo — a precondition for "cloneable").
5
+ **Status:** Accepted.
6
+
7
+ > Numbering note: the spike's done-when named this ADR `<redacted>.md`, but `0016` was already taken by the trust-boundary ADR before this spike was opened. This ADR is **0024**. Same correction the R03 spike (ADR 0016) made for itself.
8
+
9
+ ## Problem
10
+
11
+ GDS-V3 opens the system to more than one builder. Today there is exactly one builder (`example-owner`) on exactly one machine, so "memory" is whatever lives in `~/.claude/projects/<redacted>/memory/` on that one laptop. If that laptop dies, the memory is gone. If a Metic onboards from `git clone`, their memory starts empty and stays empty — there is no path for them to pick up where a previous session left off, even their *own* previous session on a different machine.
12
+
13
+ We need an explicit answer to:
14
+
15
+ 1. **What is "memory" in this project, and why does it need to survive the laptop?** Distinct from the *code* (which `git` already handles) and distinct from the *system state* (which the GDS DB already handles).
16
+ 2. **Where does memory live canonically?** Local file, server DB, object store?
17
+ 3. **When does it sync, in which direction, on whose authority?**
18
+ 4. **What happens when two builders (or one builder on two machines) edit the same memory file?**
19
+ 5. **Can builder A read builder B's memory?** Under what conditions?
20
+ 6. **What happens when the server's memory store is wiped?**
21
+
22
+ These cluster into five design choices: **schema**, **sync trigger**, **conflict policy**, **isolation**, **backup cadence**. The rest of this ADR is the choice made for each, with the rejected alternatives recorded so the trade-off survives the decision.
23
+
24
+ ## What "memory" means here
25
+
26
+ Three distinct artifact classes live on a builder's laptop. Only one of them is in scope:
27
+
28
+ | Artifact | Where canonical | Already solved? |
29
+ |---|---|---|
30
+ | Source code, ADRs, skills, migrations, CLAUDE.md | `git` (origin = `github.com/example-owner/example`) | ✅ yes — git is the answer |
31
+ | Work state (tasks, claims, credits, learnings, idea_inbox) | GDS Postgres on droplet | ✅ yes — `/api/gds/*` is the answer |
32
+ | **Claude Code's per-session memory dir** (`~/.claude/projects/<project>/memory/*.md`) | **Local laptop only** | ❌ no — this is what R04 designs |
33
+
34
+ The third row is what this ADR addresses. It's the auto-memory Claude Code itself writes (e.g. `MEMORY.md`, `feedback_*.md`) plus any builder-authored persistent context that isn't code and isn't a GDS row. Today there's no path off the laptop; that is the gap C8 is trying to close.
35
+
36
+ **Out of scope:** the GDS `learnings` table (already server-canonical, written via `node scripts/gds/learning-capture.js`), the `~/.config/otb/` directory (per-builder *secrets* — covered by ADR 0022, never synced), and the art pipeline's iteration ledger (already in-repo at `art/iterations/`). If a thing is already on the server or already in git, it is not "memory" in this ADR's sense.
37
+
38
+ ## Decision
39
+
40
+ Five choices, each forced into the simplest viable shape unless the simple version actively breaks. Default posture per CLAUDE.md §4: choose cheap and small; pay complexity only when the simple version visibly fails.
41
+
42
+ ### 1. Schema — Postgres TEXT in one new table
43
+
44
+ A new table `builder_memory(builder_id, path, content TEXT, mtime, sha256, byte_len, PRIMARY KEY (builder_id, path))` on the existing GDS Postgres. Per-file rows; `path` is the relative path under the builder's memory dir (e.g. `MEMORY.md`, `feedback_auth_flows_ui_first.md`). Content stored as `TEXT` (not `BYTEA`) because memory files are markdown — readable in `psql` for forensics is a meaningful Archon convenience.
45
+
46
+ **Limits** (enforced at the helper layer in [#273](https://example.com/builders#/task/273) R54):
47
+
48
+ - Per-file cap: **1 MB**. Memory files measured today are kilobytes; 1 MB is 1000× headroom and stops a runaway loop from filling the row.
49
+ - Per-builder cap: **50 MB total**. 50,000× current observed size. A sync that would exceed the cap returns `413 memory_quota_exceeded` and is logged; the builder is told what to prune.
50
+ - Per-builder file count cap: **2000 files**. Defensive.
51
+
52
+ **Rejected: object storage (DO Spaces / S3).** Adds $5/mo minimum + an SDK dependency + a second auth-token surface + a second backup story. For files measured in kilobytes, with backup already free from `pg_dump`, this is buying complexity to solve a problem we don't have. Revisit only when (a) we see per-file sizes routinely above 100 KB or (b) total table size exceeds ~1 GB and `pg_dump` time becomes painful.
53
+
54
+ **Rejected: git-backed memory** (push to a per-builder branch in the repo). Tempting because git is already there, but it conflates *code-king* artifacts with *per-builder mutable scratch* — and worse, it would expose one builder's memory diffs in the public repo, contradicting the isolation requirement (§4 below).
55
+
56
+ ### 2. Sync trigger — lifecycle-event push + pull, no daemon
57
+
58
+ Two trigger points, both transactional boundaries that already exist in the methodology:
59
+
60
+ - **Push on `/builder-ship`.** After the ship completes successfully (drachmae landed, branch merged or queued), `scripts/gds/ship.js` walks `~/.claude/projects/<project>/memory/*` and calls `POST /api/gds/memory/sync` with each file. If the push fails, ship still succeeds — work is preserved in the GDS row, memory can be resynced next time. Progress visible to the builder ("syncing 3 memory files…"). This is what [#274](https://example.com/builders#/task/274) R55 implements.
61
+ - **Pull on `SessionStart` hook + `/builder-start`.** A new hook (or extension of the existing `.claude/hooks/sync-env-local.sh` pattern) calls `GET /api/gds/memory/since?mtime=<local-newest>` and writes any files the server has that are newer than the local copy. This is what [#275](https://example.com/builders#/task/275) R56 implements.
62
+
63
+ No background polling. No Claude-Code-side daemon. No mid-session sync. The two trigger points are predictable, debuggable, and align with the natural commit/restart boundaries builders already think in.
64
+
65
+ **Rejected: every-N-minutes background sync.** A daemon means a process to start, a process to stop, a place for it to log, a place for it to fail silently. The marginal benefit (memory survives a `kill -9` mid-session) is small — the same session is probably about to re-write the file anyway.
66
+
67
+ **Rejected: sync on every Claude Code tool call.** Per-tool-call HTTP is a perceptible latency tax on every `/builder-*` interaction. Not worth it.
68
+
69
+ ### 3. Conflict policy — last-write-wins per file, server clock authoritative
70
+
71
+ When the push handler receives a file, it compares the incoming `mtime` against the stored row. **Newer wins.** No merge, no rejection, no warning. The server's clock decides which `mtime` is "newer" (clients are not trusted to set the future-mtime trick).
72
+
73
+ The expected collision shape is **one builder, two machines** — e.g. Lars edits memory on the desktop, then later on the laptop. Push from laptop overwrites the desktop's version. Pull-on-start brings the laptop's version back to the desktop next session. The lost-write window is "the time between push-A and pull-B," which in practice is one session boundary — recoverable from backup (§5) if a real loss occurs.
74
+
75
+ Two-builders-same-builder-id is impossible by construction: `builder_id` is the unique GitHub user, not a session.
76
+
77
+ Two-builders-different-builder-id on the same file is impossible by construction: paths are namespaced by `builder_id` (§4).
78
+
79
+ **Operator escape hatch:** the conflict-resolution recipe (`docs/recipes/memory-sync-conflicts.md`, shipped by [#277](https://example.com/builders#/task/277) R58) documents how to restore an older version of a file from `pg_dump` if a builder confirms a clobber.
80
+
81
+ **Rejected: three-way merge for markdown files.** Tempting (markdown diffs reasonably well), but the failure mode — a half-merged `MEMORY.md` that looks plausible but is structurally broken — is worse than the simple lose-one. Defer to V4 and only if we observe real collisions in V3.
82
+
83
+ **Rejected: optimistic concurrency (reject pushes whose base-mtime is stale, force a pull-first).** Adds a step builders will work around by `--force`-ing. Push-then-overwrite is simpler and the recovery path (backup) handles the rare bad case.
84
+
85
+ ### 4. Isolation — server enforces `req.builder.id === path_owner.builder_id`
86
+
87
+ All memory endpoints (`POST /memory/sync`, `GET /memory/since`, `GET /memory/files`, `GET /memory/files/:path`) check that the requester's `req.builder.id` matches the row's `builder_id` before reading or writing. Mismatch returns `403 memory_forbidden`. The check happens in the route handler, after `requireBuilder`, before any DB work. Same trust-boundary posture as [ADR 0016](<redacted>.md): the server enforces; nothing the builder can edit locally can grant cross-builder access.
88
+
89
+ **Archon forensic exception — read-only.** An Archon-only endpoint `GET /memory/builders/:id/files` exists for restore + forensics use cases (e.g. a builder offboards, Archon needs to inspect their memory; a corrupt file needs restoration). Every Archon read is logged to `audit_log` with `actor_builder_id`, `target_builder_id`, `path`, `reason`. **There is no Archon write endpoint.** Restores happen via `pg_restore` into a sandbox schema, never live. Read-only is the V3 posture; cross-builder *reads* are likely to be relaxed in a later version (e.g. Metics seeing each other's memory for collaboration), but cross-builder *writes* through the API are not on the roadmap. Any future relaxation requires a superseding ADR.
90
+
91
+ In V3: no other rank gets cross-builder access. Not Metic, not Thetes. Not for any reason short of an ADR-supersede.
92
+
93
+ ### 5. Backup cadence — ride the existing `pg_dump`
94
+
95
+ `builder_memory` is a Postgres table. It rides whatever backup cadence the GDS DB has.
96
+
97
+ > **Precondition (confirmed during this spike):** the GDS DB does **not** currently have a nightly `pg_dump` cron. R62 ([#281](https://example.com/builders#/task/281)) therefore has two parts: (a) stand up nightly `pg_dump` for the whole GDS DB (which `builder_memory` then inherits for free), and (b) the restore drill + recipe doc. Part (a) is the gating dependency for flipping C8 — until backups are real, the "server-canonical" half of C8 is unverified. A follow-up task is filed for part (a) so it's not buried inside R62's scope.
98
+
99
+ **Target cadence:** nightly `pg_dump` to a separate volume on the droplet + weekly off-droplet archive (Backblaze B2 or DO Spaces — the cheapest target). **Retention:** 30 days rolling daily + 12 weekly archives. **Drill:** quarterly. Pick a random builder, restore their `builder_memory` rows from yesterday's dump into a sandbox schema, diff against live, confirm match. Documented in `docs/recipes/memory-backup.md`, shipped by [#281](https://example.com/builders#/task/281) R62.
100
+
101
+ **Cost ceiling:** $1–2/month for off-droplet storage at expected memory sizes (GDS DB is currently <100 MB total; 12 weekly archives = ~1.2 GB; B2 cold tier is ~$0.005/GB/mo). Inside the $5K/year envelope without trouble.
102
+
103
+ ## Trust-model + sync diagram
104
+
105
+ ```
106
+ Builder's local machine (cloneable from git)
107
+ ┌────────────────────────────────────────────────────────────────────┐
108
+ │ git clone repo + /builder-setup (Gemini key, Anthropic link) │
109
+ │ │
110
+ │ ~/.claude/projects/<project>/memory/ │
111
+ │ ├── MEMORY.md (Claude Code auto-memory) │
112
+ │ ├── feedback_*.md (rules captured from feedback) │
113
+ │ └── … │
114
+ │ │
115
+ │ ▲ │ │
116
+ │ │ pull (on SessionStart │ push (on /builder-ship) │
117
+ │ │ + /builder-start) │ │
118
+ └───┼──────────────────────────────────┼─────────────────────────────┘
119
+ │ │
120
+ │ HTTPS + Bearer/Cookie session token (identity, not authority)
121
+ │ │
122
+ ============================== TRUST BOUNDARY ==============================
123
+ │ │
124
+ ▼ ▼
125
+ ┌────────────────────────────────────────────────────────────────────┐
126
+ │ GDS server (single droplet, Node + Postgres) │
127
+ │ │
128
+ │ POST /memory/sync GET /memory/since?mtime=... │
129
+ │ │ │ │
130
+ │ ▼ requireBuilder ▼ requireBuilder │
131
+ │ ▼ isolation check ▼ isolation check │
132
+ │ ▼ (req.builder.id == ▼ │
133
+ │ path_owner_id) │
134
+ │ │ │ │
135
+ │ ▼ ▼ │
136
+ │ ┌────────────────────────────────────────────────────────────┐ │
137
+ │ │ builder_memory (builder_id, path, content TEXT, │ │
138
+ │ │ mtime, sha256, byte_len) │ │
139
+ │ │ │ │
140
+ │ │ ► last-write-wins on push (server clock) │ │
141
+ │ │ ► quota: 1 MB/file · 50 MB/builder · 2000 files/builder │ │
142
+ │ │ ► forensic read: Archon only, audit-logged │ │
143
+ │ └────────────────────────────────────────────────────────────┘ │
144
+ │ │
145
+ │ ┌────────────────────────────────────────────────────────────┐ │
146
+ │ │ Nightly pg_dump → droplet volume; weekly archive offsite │ │
147
+ │ │ 30 daily + 12 weekly retention; quarterly restore drill │ │
148
+ │ └────────────────────────────────────────────────────────────┘ │
149
+ └────────────────────────────────────────────────────────────────────┘
150
+ ```
151
+
152
+ ## Implementation sub-tasks (C8)
153
+
154
+ These already exist as seeded GDS-V3 tasks; this spike sets `parent_task_id = 230` on each so the lineage is explicit. The spike **does not reshape their scope** — the design decisions above match the assumptions the seeds were drafted under. If any seed description references an assumption this ADR overrode, the task description gets a follow-up edit in the same ship.
155
+
156
+ | Task | What it builds | Encodes which decision |
157
+ |---|---|---|
158
+ | [#273](https://example.com/builders#/task/273) (V3.R54) | `builder_memory` schema + `storeMemoryFile / fetchMemoryFile / listMemoryFiles` helpers, per-builder isolation at helper layer | §1 (schema), §4 (isolation) |
159
+ | [#274](https://example.com/builders#/task/274) (V3.R55) | `/builder-ship` reads local memory dir, calls `POST /memory/sync`, progress UX | §2 (push trigger) |
160
+ | [#275](https://example.com/builders#/task/275) (V3.R56) | SessionStart / `/builder-start` reads `/memory/since`, writes newer files locally, last-write-wins | §2 (pull trigger), §3 (conflict policy applied client-side too) |
161
+ | [#276](https://example.com/builders#/task/276) (V3.R57) | Every memory endpoint asserts `req.builder.id === path_owner_id`; Archon forensic-read endpoint with audit log | §4 (isolation enforcement) |
162
+ | [#277](https://example.com/builders#/task/277) (V3.R58) | `docs/recipes/memory-sync-conflicts.md` — operator playbook for clobber recovery, parallel-session warning | §3 (conflict policy doc) |
163
+ | [#280](https://example.com/builders#/task/280) (V3.R61) | `portability-smoke-memory.sh` + `portability-smoke-art.sh` — fresh-clone → ship → re-clone → memory restored | validates the whole stack end-to-end |
164
+ | [#281](https://example.com/builders#/task/281) (V3.R62) | Nightly `pg_dump` + weekly offsite archive + restore drill + `docs/recipes/memory-backup.md` | §5 (backup cadence) |
165
+
166
+ Already shipped under C8 (kept here for reference): [#278](https://example.com/builders#/task/278) R59 (.env.local propagation), [#279](https://example.com/builders#/task/279) R60 (secrets-in-repo scan, + ADR 0022).
167
+
168
+ ## Portability test plan
169
+
170
+ The validation gate C8 ultimately answers: **"a Metic with no prior project state can clone, set up, ship, and have their memory follow them to a second machine."** Decomposes into a scripted smoke test ([#280](https://example.com/builders#/task/280) R61) and a manual rehearsal that runs before C8 is flipped to satisfied.
171
+
172
+ ### Scripted smoke (`scripts/gds/portability-smoke-memory.sh`)
173
+
174
+ Runs on staging, ideally nightly in CI. Uses a synthetic Metic account.
175
+
176
+ > **Path-encoding gotcha (important for the implementer of [#280](https://example.com/builders#/task/280) R61):** Claude Code does NOT store memory at `~/.claude/projects/$PWD/...`. It hyphen-encodes the absolute project path — every `/` becomes a `-`. So a project at `/Users/lars/foo/bar` lives at `~/.claude/projects/-Users-lars-foo-bar/`. The smoke script must resolve the real encoded path; do not use `$PWD` directly. The exact encoding rule may shift across Claude Code versions, so prefer querying it via `claude` CLI or inspecting `~/.claude/projects/` after a session start over hard-coding the substitution.
177
+
178
+ ```
179
+ # Phase 0 — helper to resolve the encoded Claude Code memory dir for this checkout.
180
+ # Strategy: derive it from the absolute project path, with a verification step that
181
+ # fails loudly if the encoded dir doesn't appear after a SessionStart trigger.
182
+ encode_project_dir() {
183
+ # Hyphen-encode the absolute path. If Claude Code's rule changes, replace this
184
+ # with a CLI query and bump the smoke script — do NOT silently let the path drift.
185
+ printf '%s' "$1" | sed 's|/|-|g'
186
+ }
187
+
188
+ # Phase 1 — bootstrap from cold
189
+ WORK=$(mktemp -d)
190
+ cd "$WORK"
191
+ git clone https://github.com/example-owner/example.git
192
+ cd example
193
+ PROJECT_DIR="$PWD"
194
+ MEM_DIR=~/.claude/projects/"$(encode_project_dir "$PROJECT_DIR")"/memory
195
+ ./scripts/setup-builder.sh # Node, Python, npm ci, …
196
+ TEST_GDS_TOKEN=<redacted> ./scripts/gds/auth-from-env.sh
197
+
198
+ # Phase 2 — capture a memory file pre-ship
199
+ mkdir -p "$MEM_DIR"
200
+ echo "smoke marker $(uuidgen)" > "$MEM_DIR/portability-smoke.md"
201
+ MARKER=$(cat "$MEM_DIR/portability-smoke.md")
202
+
203
+ # Phase 3 — claim + ship a known no-op task
204
+ node scripts/gds/claim.js <staging-portability-task>
205
+ # (the no-op task has zero-touch scope: it just exists for this drill)
206
+ node scripts/gds/ship.js <id> --notes "portability smoke" --summary "portability smoke"
207
+
208
+ # Phase 4 — wipe local memory + repo, re-clone, verify pull
209
+ rm -rf "$MEM_DIR"
210
+ WORK2=$(mktemp -d)
211
+ cd "$WORK2"
212
+ git clone https://github.com/example-owner/example.git
213
+ cd example
214
+ PROJECT_DIR_2="$PWD"
215
+ MEM_DIR_2=~/.claude/projects/"$(encode_project_dir "$PROJECT_DIR_2")"/memory
216
+ TEST_GDS_TOKEN=<redacted> ./scripts/gds/auth-from-env.sh
217
+ node scripts/gds/start.js # triggers pull
218
+ # The pull writes to MEM_DIR_2 (encoded for the *new* checkout path); the GDS
219
+ # sync logic must key memory by builder_id, not by local path, so files restore
220
+ # regardless of where on disk this checkout lives.
221
+ test "$(cat "$MEM_DIR_2/portability-smoke.md")" = "$MARKER"
222
+ echo "OK — memory survived clean reclone"
223
+ ```
224
+
225
+ Failures file an idea_inbox row tagged `portability-regression` for follow-up.
226
+
227
+ ### Manual rehearsal (one-time, gates C8-satisfied flip)
228
+
229
+ Lars (or a stand-in) runs the full flow with a stopwatch, on a fresh laptop / VM:
230
+
231
+ 1. Fresh macOS or Linux box — no prior project artifacts, no `~/.claude`, no `~/.config/otb`.
232
+ 2. Stopwatch starts.
233
+ 3. `git clone` → `./scripts/setup-builder.sh` → `/builder-setup` (real browser auth).
234
+ 4. `/builder-start` → claim a `newcomer_friendly` task.
235
+ 5. Do the task, `/builder-ship`. (This pushes memory.)
236
+ 6. Wipe `~/.claude` entirely.
237
+ 7. On the same box: `git clone` to a fresh dir → `/builder-setup` (re-auth) → `/builder-start`.
238
+ 8. Confirm `~/.claude/projects/.../memory/` contains the files from step 5.
239
+ 9. Stopwatch stops. Note total elapsed time for the C1 onboarding-2h reference.
240
+
241
+ ## Alternatives considered
242
+
243
+ **Sync via git** — push memory to a per-builder branch in the repo, e.g. `memory/<github-login>`. Rejected for three reasons: (a) leaks each builder's memory diffs to anyone with read on the repo, contradicting §4 isolation; (b) couples memory size to repo size (clones get heavier over time); (c) requires `git push` to be a viable operation from inside `/builder-ship`, which it already isn't on the no-`git` paths (mobile, sandboxed).
244
+
245
+ **Sync via DO Spaces (S3-compatible object storage)** — see §1 rejection. Right answer if file sizes were megabytes or if Postgres backup became painful; wrong answer for our actual data shape.
246
+
247
+ **Server-canonical, no local copy** (every memory read fetches from server) — rejected because Claude Code reads `~/.claude/projects/<...>/memory/*.md` directly from disk and rewriting that is out of scope. Local-first is mandatory for the way Claude Code already works.
248
+
249
+ **Local-only, never sync** — rejected because it fails C8: a builder's memory does not follow them across machines, and a dead laptop loses memory forever. Today's de-facto state, not the V3 target.
250
+
251
+ **Encrypted-at-rest (client-side encryption with per-builder key)** — rejected for V3. The server is single-tenant on a single droplet that already holds the GDS DB; encrypting memory at rest doesn't change the threat model (anyone with droplet root sees everything anyway). Revisit if (a) the server becomes multi-tenant, (b) we move to a managed Postgres where the operator can read rows, or (c) a builder requests it explicitly.
252
+
253
+ **Per-session memory snapshotting (every Claude tool call writes a delta)** — rejected as over-engineered. The information content of "memory after a session" is approximately the same as "memory at ship time"; per-tool-call deltas are noise.
254
+
255
+ ## Consequences
256
+
257
+ **Good:**
258
+ - One table, two endpoints, two triggers — the smallest possible surface that satisfies C8.
259
+ - No new infra cost. Rides Postgres + existing `pg_dump`.
260
+ - Memory follows the builder across machines and across worktrees on the same machine.
261
+ - A wiped laptop is recoverable in two commands (`git clone` + `/builder-start`).
262
+ - Trust boundary is the same one [ADR 0016](<redacted>.md) already established — no new authority concept to reason about.
263
+ - Forensic access exists (for Archon) but is audit-logged, so misuse is visible.
264
+
265
+ **Costs:**
266
+ - A new sync step in `/builder-ship` slows ship by however long `POST /memory/sync` takes. Expected p50: <500 ms for typical memory dirs (kilobytes, ~3 files). Cap the wall time; if the push hangs, log + continue rather than block ship.
267
+ - Last-write-wins means the rare two-machine collision *will* lose one side's edit. Acceptable because (a) the same builder typically intends to overwrite, (b) `pg_dump` makes it recoverable, (c) the alternative (true merge) is much more complex for less than 1× the rare-event benefit.
268
+ - The 1 MB per-file cap and 50 MB per-builder cap are *guesses*. If real-world memory grows past them we either raise the cap or prune. Both are cheap; the guess being wrong is not load-bearing.
269
+
270
+ **Operationally:**
271
+ - Backup cadence has to be real before the first non-Lars builder pushes memory. Precondition check on R62: confirm GDS DB is in a `pg_dump` cron before C8 is flipped. If not, that's the first task to ship under R62.
272
+ - `docs/recipes/memory-sync-conflicts.md` (R58) needs to land before the manual rehearsal, so the playbook exists when a collision is observed.
273
+ - The onboarding diagram of the memory layer originally labelled the server-side store "PLANNED: R54–R62, mostly backlog." After this spike + R54–R62 shipped, that label was dropped. (That diagram, `04-server-repo-memory`, was later merged with the dev-box diagram into the single `04-architecture` map under [#1059](https://example.com/builders#/task/1059); it is now auto-generated and reads LIVE.)
274
+
275
+ **Implementation notes that reach into other criteria:**
276
+ - The isolation check in §4 IS a privileged-route addition. The periodic rank-check auditor ([#265](https://example.com/builders#/task/265) / V3.R45) needs to learn about the new memory endpoints so it asserts they're gated. Captured as a follow-up note on R57 ([#276](https://example.com/builders#/task/276)).
277
+ - The audit-log entry on Archon forensic reads is a security surface; the security review ([#288](https://example.com/builders#/task/288) V3.R69) should include it once the endpoint exists.