@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,44 @@
1
+ # ADR 0063 — Generated code symbol skeleton (the repo map)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-18
5
+ - **Track:** internal
6
+ - **Builds on:** [ADR 0061](<redacted>.md) (the content charter + nested per-module `CLAUDE.md` — this generates their *factual half*), [ADR 0060](0060-gds-retrieval-layer.md) (the lexical recall layer — this is its structural/code complement), [ADR 0062](<redacted>.md) §9 (Path B, folded into the Medusa portable core)
7
+ - **Task:** [#1224](https://example.com/builders#/task/1224) (V4.R75) — Path B of the 2026-06-18 context-cliff plan.
8
+
9
+ ## Context
10
+
11
+ As an AI-authored repo grows, an agent's ability to make safe changes degrades: it cannot hold the whole tree in context, so it either reads too many files (burning budget) or guesses (drifting). [ADR 0061](<redacted>.md) added nested per-module `CLAUDE.md` docs whose hand-written "Key files / public surface" section is exactly the kind of fact that **drifts** — the moment a function is renamed or a file added, the prose lies, and nothing forces it back into sync.
12
+
13
+ Path B (the 2026-06-18 research) is the fix: a committed, **generated** symbol skeleton, regenerated mechanically so it cannot drift — the same "generate, don't narrate" discipline `gen-diagrams.js` already applies to the onboarding diagrams (task 357). It gives an agent an **altitude map** (à la Aider's repo map): the most central symbols and per-file signatures, so it can navigate without reading every file. It complements the recall layer ([ADR 0060](0060-gds-retrieval-layer.md)), which indexes *prose* (docs + DB rows) — the repo map indexes *code*.
14
+
15
+ ## Decision
16
+
17
+ Ship `scripts/gds/gen-repo-map.js`, a deterministic generator that produces two artifacts and is wired into the deploy regen:
18
+
19
+ 1. **`docs/repo-map.md`** — the global altitude map: the top exported symbols ranked by reference frequency, plus per-directory exported signatures.
20
+ 2. **A delimited generated block** (`<!-- BEGIN/END GENERATED REPO-MAP -->`) injected into each nested `CLAUDE.md` (`src/bongos/`, `src/bongos/routes/`, `scripts/gds/`) — the **factual half**. The hand-written interpretive prose above it (purpose, gotchas, ADR links) is left untouched; only the factual signature list is regenerated, so the two halves can't drift apart.
21
+
22
+ **Regenerated on every ship** by `regenerateRepoMap()` in `ship.js` (alongside `regenerateDiagrams()`), and gated in CI by `gen-repo-map.js --check` (exit 2 if stale) — the enforcement is Path C / [#1225](https://example.com/builders#/task/1225). Deterministic (no timestamps, stable sort) so `--check` is a clean idempotent gate.
23
+
24
+ ### Why zero-dependency (not tree-sitter, despite the task name)
25
+
26
+ The task is named "tree-sitter repo map." We use a **zero-dependency line+regex extractor** instead, deliberately:
27
+
28
+ - **Portability is the whole point.** Paths B+C exist to keep *every* Medusa instance navigable cheaply. A portable-core capability that needs a native `node-gyp` build (`tree-sitter`) or a fetched WASM grammar (`web-tree-sitter`) adds an install/build step to CI and to every dev box — the opposite of the goal, and a recurring source of breakage.
29
+ - **The codebase is CommonJS JS**, formatted with col-0 top-level declarations — a regex extractor keyed on that is accurate enough.
30
+ - **The output is advisory**, not a compiler input. An imperfect signature in a navigation aid costs nothing; a broken CI build costs every ship.
31
+ - **Bootstrap budget** ([CLAUDE.md](../../CLAUDE.md) §4): no new dependency.
32
+
33
+ `extractFile()` is the seam: a tree-sitter/WASM backend can replace it later for a **polyglot** instance (a Python or Go host) behind the same interface, without touching the ranking or rendering. Until an instance needs more than one language, the regex backend wins on every axis that matters.
34
+
35
+ ### Known limitation: reference frequency is a corpus token tally
36
+
37
+ "Refs" is the count of a symbol's name across the scanned corpus — a cheap centrality proxy (à la Aider's repo map, minus the PageRank graph). It does **not** resolve scope, so two distinct symbols sharing a name (e.g. several files' exported `start()`) share one count. Ranking only the **exported** surface (cross-file-reachable in CommonJS) plus a generic-name stoplist (`main`/`log`/`err`/…) removes the worst noise; the residual same-name conflation is acceptable for an altitude map and documented here so a reader doesn't over-trust the exact number.
38
+
39
+ ## Consequences
40
+
41
+ - Nested-doc file/signature lists can no longer silently drift — they're regenerated on every deploy and gated in CI.
42
+ - An agent gets a cheap, always-fresh structural map of the codebase, complementing prose recall.
43
+ - Scope today: server-side JS (`server.js`, `src/`, `scripts/`, `.claude/hooks/`). Extending coverage (e.g. `public/game/`) or languages is a one-line `SCAN_ROOTS` change / an `extractFile()` backend swap.
44
+ - The generator is itself in `scripts/gds/` and so appears in its own map — editing it changes its own skeleton, so a regen+commit must be the last step before shipping any source change (the `--check` gate enforces this).
@@ -0,0 +1,49 @@
1
+ # ADR 0064 — Rename the platform: Medusa → Cloud Bongos
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-19
5
+ - **Track:** internal
6
+ - **Amends:** [ADR 0062](<redacted>.md) (the instance-model build platform, formerly named "Medusa"). The 0062 architecture — portable core / host instance / gated feature-modules, the branding contract, feature-module selection — is **unchanged**; only the platform's name changes.
7
+ - **Task:** 1242 (this rename). Sibling: task 1216 / V4.R74 (the Cloud Bongos visual brand pack — the look this name wears).
8
+
9
+ ## Context
10
+
11
+ The build platform decoupled out of the GDS in [ADR 0062](<redacted>.md) was named **Medusa** (a working name from the 2026-06-17 planning session). While designing the vanilla "customer 0" brand pack (task 1216 / V4.R74), the owner settled on a different identity and renamed the platform to **Cloud Bongos** — a light, joyful, "playing in the clouds" developer tool where *building software is laying down a beat*.
12
+
13
+ The visual direction is recorded with the brand pack (task 1216), not here: a Lion-King sunrise backdrop, Apple-style liquid-glass "cloud" cards, a bongo-pair mark with an equalizer/beat motif, and the type pairing **baloo 2** (lowercase wordmark) · **Quicksand** (interface) · **Fira Code** (numbers & code). *This* ADR records only the name and the rename's scope.
14
+
15
+ ## Decision
16
+
17
+ 1. **The platform is named Cloud Bongos** (was "Medusa"). This is the whole platform: the product name, the AGPL open-source project (C9 / R68–R73), the future `cloudbongos` CLI (`init`/`upgrade`, R65/R72), the canonical config identity, and all forward-facing docs.
18
+ 2. **Scope = whole-platform rename, history preserved** (owner choice, 2026-06-19). Forward-facing surfaces are renamed; the historical record keeps "Medusa" as what was decided when, each reachable via this ADR.
19
+ 3. **Canonical identity** lives in `config/branding.neutral.json` (customer 0): `identity.productName` / `identity.worldName` = `"Cloud Bongos"`, `envPrefix` = `"CLOUDBONGOS"`. The branding contract resolver and schema (ADR 0062 §3, `src/branding.js`) are unchanged — only the values move; `tests/branding.mjs` updated to match.
20
+ 4. **The Greek rank ladder (Xenos · Thetes · Metic · Archon) is unchanged.** It is core methodology, not brand flavor (locked in the 0062 planning); the rename does not touch it.
21
+ 5. **Capitalization:** the wordmark renders lowercase ("cloud bongos"); prose and identifiers use "Cloud Bongos".
22
+
23
+ ## What this touches
24
+
25
+ **Renamed now (forward-facing):**
26
+ - `config/branding.neutral.json` (identity + envPrefix) and `tests/branding.mjs`; `src/branding.js` default env prefix.
27
+ - `CLAUDE.md` methodology-core framing (platform-name references; the §13 session-log index is left as history).
28
+ - `docs/branding-contract.md`, `docs/branding-fill-prompt.md`, `docs/project-context.md`, `docs/project-context.template.md`.
29
+ - Comments in `scripts/gds/fitness.js` and `scripts/gds/gen-repo-map.js`.
30
+ - This ADR + the [ADR index](README.md) row; a pointer note on ADR 0062.
31
+ - **Live DB strings** (follow-up, task 1244 / migration `<redacted>.sql`): the GDS-V4 **C8 + C9** done-when criteria and the **R67** proof-task title/description — rewritten forward because the API serves them to users (/status, the hall, /recall). Display text only; the `medusa-*` `criterion_id` keys and the `schema_migrations` version strings are untouched.
32
+
33
+ **Left as history (NOT rewritten):**
34
+ - ADR 0062 body (carries a pointer note to here), [ADR 0063](<redacted>.md).
35
+ - `docs/session-logs/<redacted>.md` and other logs.
36
+ - Applied migrations `110_medusa_planning_seed.sql`, `<redacted>.sql` (immutable once applied).
37
+ - `scripts/gds/seed-medusa-tasks.js` (the historical seed tooling; its filename and the **other 23** V4.R50–R74 task titles/descriptions that say "Medusa" — the R67 proof task + the C8/C9 criteria were rewritten live via migration 114 / task 1244; the rest stay as history per the owner's choice).
38
+ - `docs/repo-map.md` (generated — regenerates on deploy).
39
+
40
+ ## Consequences
41
+
42
+ - `envPrefix: "CLOUDBONGOS"` only changes a *fresh* instance's branding env-**override** variable names (e.g. `CLOUDBONGOS_PUBLIC_ORIGIN`). Customer 1 (Example / OTB) keeps `OTB_*`; no live instance used a `MEDUSA_*` **branding-override** prefix, so there is nothing to shim there. *(Separately, the R52 migration-mode flag `MEDUSA_GDS_ONLY` in `scripts/migrate.sh` — a different namespace, not the branding prefix — does still carry the old name; it is unset by every live instance, so it is harmless today, and is slated for a neutral rename under V4.R71. Tracked in task 1244.)*
43
+ - Follow-on work inherits the new name: the visual brand pack (task 1216 / V4.R74); the config-namespace + env/CLI rename with back-compat shims (V4.R71) now targets the Cloud Bongos namespace; the AGPL repo + governance docs (C9, R68–R73) use "Cloud Bongos."
44
+ - A transitional split is expected and intentional: forward docs say "Cloud Bongos," the 0062-era record says "Medusa," and this ADR bridges them. Future agents should treat "Medusa" in historical records as the former name of Cloud Bongos.
45
+
46
+ ## Rejected alternatives
47
+
48
+ - **Rewrite history too** (also rename ADRs, logs, migrations, the 24 task descriptions): rejected by the owner — it destroys the record of what was decided when, for little forward value.
49
+ - **Brand-pack-only** (keep the platform internally named "Medusa," show "Cloud Bongos" only as the default instance's brand): rejected — the owner wants the platform itself renamed.
@@ -0,0 +1,69 @@
1
+ # ADR 0065 — Cloud Bongos is AGPL-3.0, non-profit, and AI-first
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-19
5
+ - **Track:** internal
6
+ - **Task:** [#1207](https://example.com/builders#/task/1207) (V4.R68) — the foundational decision for the C9 open-source track.
7
+ - **Builds on:** [ADR 0062](<redacted>.md) (the instance-model build platform — defines the portable core / host instance / feature-module cut-line this ADR releases), [ADR 0064](<redacted>.md) (the platform is named **Cloud Bongos**), [ADR 0016](<redacted>.md) (the server-enforced trust boundary — survives open-sourcing untouched).
8
+ - **Gates:** [#1208](https://example.com/builders#/task/1208) (R69 LICENSE file), [#1209](https://example.com/builders#/task/1209) (R70 governance docs), [#1210](https://example.com/builders#/task/1210) (R71 public mirror + carve-out), [#1211](https://example.com/builders#/task/1211) (R72 delayed export pipeline), [#1212](https://example.com/builders#/task/1212) (R73 lineage-consistency proof). This ADR is the decision those five tasks implement.
9
+
10
+ ## Context
11
+
12
+ [ADR 0062](<redacted>.md) decoupled the GDS into **Cloud Bongos** — a configurable, self-hostable build platform where AI agents claim tasks and ship code, with a human owner setting scope and the hard gates. Example (the Off the Boats game) becomes **customer 1** running on it; Cloud Bongos runs on its own plain vanilla brand as **customer 0** and builds itself.
13
+
14
+ Criterion **C9 (`medusa-open-and-protected`)** commits Cloud Bongos to being *open, free, and protected from capture*: released to the public as open source on a deliberate, delayed cadence. Three questions had to be answered before any of R69–R73 could be built, because each is downstream of the answer:
15
+
16
+ 1. **Which license?** The choice determines whether a well-funded operator can take the code, host it as a closed SaaS, and out-compete the project that produced it.
17
+ 2. **What is the governance posture?** Whether the project is a commercial concern that monetizes its contributors, or a non-profit commons.
18
+ 3. **Who writes the code, and is that a rule or a norm?** Cloud Bongos is AI-first by construction; the open-source release has to say what that means for outside contributors.
19
+
20
+ The owner locked the answers in the 2026-06-17 planning session ([log](../session-logs/<redacted>.md)). This ADR records them and the alternatives rejected, so R69–R73 build against one decision instead of re-litigating it five times.
21
+
22
+ ## Decision
23
+
24
+ ### 1. License: AGPL-3.0
25
+
26
+ Cloud Bongos is released under the **GNU Affero General Public License, version 3.0 (AGPL-3.0)**.
27
+
28
+ The AGPL's distinguishing clause (§13) closes the **hosted-closed-fork loophole**: anyone who runs a modified Cloud Bongos as a *network service* must offer that service's complete corresponding source to its users. A plain GPL would let a SaaS operator modify the platform and never distribute a binary — the modifications stay private because nothing is "distributed" in the GPL sense. The AGPL treats "you can use it over the network" as the trigger. This is the **only license consistent with the anti-monopoly goal** in C9: it keeps the platform a commons even when it is operated, not just when it is shipped.
29
+
30
+ The license covers the **publishable subset only** — the portable methodology core, the Cloud Bongos platform code, the neutral (customer-0) branding, and sanitized docs/ADRs. It does **not** attach to a host instance's private identity, secrets, content, or operational infrastructure (see §4). An instance owner's own branding pack and game/world content remain theirs.
31
+
32
+ ### 2. Governance: non-profit, capture-resistant
33
+
34
+ The project is run as a **non-profit**: it is **not monetized from its contributors**, and it is structured so no single party can capture it.
35
+
36
+ - No contributor pays to contribute, and no contribution is resold as a proprietary add-on by the project.
37
+ - The drachmae/credit economy ([ADR 0054](<redacted>.md)) is an **instance-internal** mechanism — it rewards builders on a given instance out of that instance's own budget; it is not the project monetizing the commons. It ships as a feature an instance configures, not as a revenue stream flowing to a central owner.
38
+ - The AGPL is the legal backstop; the non-profit posture is the social one. Together they are the "protected from capture" half of C9.
39
+
40
+ Optional **managed-hosting** (operating instances for owners) was captured as a post-C8 idea in the planning session. If it is ever built, it is a service offered *on top of* the same AGPL artifact — it does not change the artifact's license or the non-profit posture of the platform itself.
41
+
42
+ ### 3. AI-first is a documented norm, not a technical gate
43
+
44
+ Cloud Bongos is **AI-first**: the expectation is that **AI agents write the code** — a human owner sets scope, direction, and the hard gates (rank, approval, deploy); the day-to-day building is done by AI agents claiming tasks.
45
+
46
+ This is a **documented norm folded into governance/methodology, not a technical gate**. We do *not* add machinery that detects or blocks human-authored commits. The norm is stated in CONTRIBUTING (R70) and lives in the portable methodology core (CLAUDE.md, [ADR 0061](<redacted>.md)); enforcement is cultural and reviewable, the same way the "every change is backed by a claimed task" rule is. An instance is free to relax it; the project ships it as the default expectation because the whole methodology — the grader, the session-token economy, the claim lifecycle — is designed around agents as the primary authors.
47
+
48
+ ### 4. The public-mirror boundary (jointly defined with R50)
49
+
50
+ What is published is the **portable core + platform, never a host's private surface**. Concretely, the publishable subset is:
51
+
52
+ - **Published:** the portable methodology core (CLAUDE.md framing, the claim→ship lifecycle, the trust-boundary/rank machinery), the GDS platform code (`src/bongos/*`, `scripts/gds/*` minus instance literals), the neutral customer-0 branding (`config/branding.neutral.json`), the docs/ADRs (sanitized), and the skills that drive the methodology.
53
+ - **Not published:** secrets and credentials, a host instance's identity literals (domains, IPs, owner, OAuth app, repo), live DB contents, prod operational infra, customer-1 (Example) game/art content and brand pack, and **anything inside the redaction window** — the public mirror lags the private repo by **~6 months** so an operator can never track head-of-line development in real time (R72).
54
+
55
+ The mirror is **generated** from the private Example repo by the delayed-export pipeline (R72), not maintained as a hand-curated fork; R73 proves private↔public lineage consistency and no-leak. This boundary is the same §1 cut-line ADR 0062 drew (portable core / host instance / gated feature-modules) — open-sourcing it just means the *core* side of that line is the thing that ships, and R71 carves the subtree to match.
56
+
57
+ ## Alternatives considered (rejected)
58
+
59
+ - **MIT / BSD / Apache-2.0 (permissive).** Maximum adoption, but a permissive license **does not close the hosted-closed-fork loophole** at all — a funded operator could fork, close, and out-host the commons with zero obligation. Directly contradicts "protected from capture." Apache-2.0's explicit patent grant is a real virtue, but not enough to outweigh the capture risk. Rejected.
60
+ - **GPL-3.0 (copyleft, no network clause).** Copyleft on *distribution*, but the **SaaS loophole** stays open: run a modified copy as a network service and you never "distribute," so the modifications stay private. For a platform whose primary deployment mode is *being operated over the network*, GPL is copyleft with the relevant case carved out. AGPL is GPL-3.0 plus exactly the clause we need. Rejected in favor of AGPL.
61
+ - **Source-available / BSL (Business Source License), commons-clause, "open-core."** Would let the project monetize hosting or gate features, but it is **not open source** (fails the OSI definition / DFSG), conflicts with the non-profit posture, and reintroduces the central-capture risk we are trying to design out. Rejected.
62
+ - **Dual-license / CLA-backed relicensing.** A contributor license agreement assigning rights to a central entity is the standard path to *later* relicensing (i.e., the capture move we are guarding against). Rejected as inconsistent with the non-profit, capture-resistant posture. Inbound contributions are inbound=outbound under the AGPL (the standard for AGPL projects).
63
+
64
+ ## Consequences
65
+
66
+ - **R69–R73 have one decision to build against.** R69 drops the AGPL-3.0 `LICENSE` file; R70 writes GOVERNANCE/CONTRIBUTING/CODE_OF_CONDUCT encoding the non-profit + AI-first norms decided here; R71 carves the publishable subtree to the §4 boundary; R72 builds the 6-month-delayed redacted export; R73 proves lineage + no-leak.
67
+ - **The trust boundary and rank ladder are unaffected.** Server-enforced permissions ([ADR 0016](<redacted>.md)) and the Greek rank enum ([ADR 0062](<redacted>.md) planning lock) are core methodology; open-sourcing the code does not weaken them — an instance's authority still lives in its own DB, checked server-side, regardless of who can read the source.
68
+ - **Downstream operators inherit the AGPL obligation.** Anyone hosting a modified Cloud Bongos owes their users source. That is the intended effect, not a side effect.
69
+ - **No new infrastructure or recurring cost** from this decision itself; it is a license + posture choice. The export pipeline (R72) has its own cost profile, evaluated under its task.
@@ -0,0 +1,51 @@
1
+ # ADR 0066 — Generated file-map sections (skills + scheduled-tasks) with a sidecar of notes
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-19
5
+ - **Track:** internal
6
+ - **Builds on:** [ADR 0063](<redacted>.md) (generated symbol skeleton — same "generate, don't narrate" discipline + the `git-merge-regen` self-heal), [ADR 0062](<redacted>.md) §8–§9 (Path C fitness gate + the gen-on-deploy pattern), [ADR 0061](<redacted>.md) (the context-layer docs this keeps honest)
7
+ - **Task:** [#1276](https://example.com/builders#/task/1276)
8
+
9
+ ## Context
10
+
11
+ `docs/file-map.md` is the repo's "where things live" index. Every other self-knowledge doc had already been moved off the honor system: the onboarding diagrams (`gen-diagrams.js`, task 357), the code symbol skeleton (`gen-repo-map.js`, [ADR 0063](<redacted>.md)), and the session-log index (`gen-session-index.js`, [ADR 0062](<redacted>.md) §8) are all **generated and CI-enforced** — so an agent physically cannot forget to update them. `file-map.md` was the last one still hand-maintained.
12
+
13
+ The cost showed up concretely: task 1267/1269/1272 shipped three new skills (`/ideate`, `/paint`, `/dev`) without adding them to `file-map.md`, which then needed a *separate* doc-hygiene task ([#1274](https://example.com/builders#/task/1274)) just to catch the map up. Worse, an audit while building this found the two enumerable sections had silently drifted into curated **subsets**: `.claude/skills/` had 28 dirs on disk but the map listed ~18 (`recall`, `status`, `builder-box`, `priority-session`, … were simply absent), and `.claude/scheduled-tasks/` had 17 but listed ~6. The map looked complete and wasn't.
14
+
15
+ The owner's directive: if this logging is critical for the system to know itself, it should happen automatically, not via a hand-filed follow-up task.
16
+
17
+ ## Decision
18
+
19
+ Generate the two sections of `file-map.md` that are genuinely **"list every item" sets** — `.claude/skills/` and `.claude/scheduled-tasks/` — from what is on disk, and keep the per-entry one-line notes (the prose after the `←`) in a **sidecar** the generator reads.
20
+
21
+ `scripts/gds/gen-file-map.js` (zero-dependency, deterministic — dirs sorted by name, no timestamps):
22
+
23
+ 1. Walks the immediate subdirectories of each section's dir and renders an aligned tree between sentinel markers (`<!-- BEGIN/END GENERATED FILE-MAP <section>/ -->`) placed **outside** the fenced code block so they don't render. The surrounding prose stays hand-written.
24
+ 2. Pulls each entry's note from **`docs/file-map.notes.json`** — keyed by section → dir name. This is the one place a human writes these notes (a directory walk can't know what a skill *does*).
25
+ 3. `--check` mode (the CI gate) fails (exit 2) on any of: a rendered block that differs from what's committed (drift); a dir on disk with **no note** (a skill can't land undescribed); a note whose dir no longer exists (no ghosts).
26
+
27
+ Wiring (the established three-point pattern):
28
+ - **Freshness gate** — added to `fitness.js` `checkGeneratedArtifactsFresh()`, so the DB-free `unit` required check enforces it on every PR (no new workflow).
29
+ - **Regenerate-on-deploy** — `ship.js` `regenerateFileMap()` runs it on the same beat as the repo map + session index and commits any change, so the map self-heals even if a builder forgets.
30
+ - **Merge self-heal** — `file-map.md` joins the `otb-regen` merge driver (`git-merge-regen.js` + `.gitattributes`): two parallel branches that each add a skill conflict only in the generated block, and the one correct resolution is to 3-way-merge the prose then re-inject both sections from the merged tree.
31
+
32
+ ### Why a sidecar, not per-file markers
33
+
34
+ The pitch floated a `// @map:` comment in each file. Rejected: it can't work for `.json`/`.sql` files (no comments), the skills' frontmatter `description:` is the verbose Skill-tool trigger blurb (wrong register for a one-line map note), and it would scatter the notes across ~45 files. A single sidecar is uniform across file types, keeps the notes in one reviewable place, and still forces a one-line addition per new skill in the same PR (the gate fails otherwise) — the same "can't forget" property, less churn.
35
+
36
+ ### Why `scripts/gds/` is NOT generated
37
+
38
+ `file-map.md`'s `scripts/gds/` listing is a deliberately **curated highlight reel** (~20 of ~70 files) and sits mid-tree inside the big fenced repo tree where HTML-comment markers can't live cleanly. Auto-generating it would either bloat it 3× with low-signal entries or require a curation list for little benefit. It stays hand-curated. The two generated sections cover the actual failure mode (a new skill/routine going missing).
39
+
40
+ ## Consequences
41
+
42
+ - A new skill or scheduled task **cannot** ship without a note in `file-map.notes.json` — the `unit` gate fails — so the doc-hygiene follow-up task (the 1274 pattern) is structurally retired.
43
+ - The generation back-filled the ~10 skills + ~11 routines that had silently fallen out of the map; both sections are now exhaustive.
44
+ - One more sidecar file to keep in mind, but it's the *only* place those notes live and the gate points an author straight at it.
45
+ - Generating only two of file-map.md's many sections is a deliberate scope line; if another section later becomes a churny enumerable set, it can join `SECTIONS` the same way.
46
+
47
+ ## Alternatives considered
48
+
49
+ - **Presence-only fitness check** (assert every skill/routine appears *somewhere* in the hand-written map). Lighter, but leaves the author hand-writing the line and doesn't fix the tree-art/ordering drift or the latent omissions. The owner chose generation.
50
+ - **Fully generate the entire `file-map.md` tree.** Throws away the hand-written framing prose (the intro, the droplet layout, the curated `scripts/` highlights) and the editorial notes; a bare `ls -R` is less useful, not more.
51
+ - **Per-file `// @map:` markers** — see "Why a sidecar" above.
@@ -0,0 +1,43 @@
1
+ # ADR 0067 — Fast-forward the checkout to origin/main at session start (when safe)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-19
5
+ - **Track:** internal
6
+ - **Builds on:** the warn-only freshness step ([#1258]) it replaces; the dev-box source-materialization cron (`infra/box-source-fetch.sh`, [ADR 0031](<redacted>.md)); the existing memory pull-on-session-start (`.claude/hooks/pull-memory.js`, [#275]) whose best-effort/fail-open discipline this mirrors for the code checkout.
7
+ - **Task:** [#1277](https://example.com/builders#/task/1277) — owner request ("make sure we pull on every session start").
8
+
9
+ ## Context
10
+
11
+ A builder's working checkout can run **stale** relative to `origin/main`, and several startup-loaded surfaces — `CLAUDE.md`, the file-based memory, and the SessionStart hooks themselves — are read **once** per session. A session that starts behind `main` therefore runs old methodology and old code with no self-heal during the session.
12
+
13
+ Two existing mechanisms only partly cover this:
14
+
15
+ 1. **The dev-box cron** (`box-source-fetch.sh`, every ~10 min) does `git pull --ff-only` on the box's `/workspace` checkout. But it only freshens `/workspace` (not per-task worktrees), only fast-forwards, and lags by up to its interval — so a *new* session opened between ticks can still be behind.
16
+ 2. **The warn-only freshness step** ([#1258]) did a bounded, non-mutating `git fetch origin main` and, if behind, *warned* but never pulled. Its stated reasons for not pulling: dirty trees can't fast-forward, and the Mac's iCloud-synced checkout has an mmap risk on big working-tree git ops.
17
+
18
+ The owner asked for the obvious fix — pull on session start — but the naive alternative (shorten the cron toward "every few seconds") is wrong on the merits: `cron` can't go sub-minute, every tick is an authenticated `GET /box/source-access` round-trip against the single prod droplet, and a frequent pull risks rewriting files **under an active session**. The right lever is **event-driven**: freshen once, at the moment work begins, not by polling faster.
19
+
20
+ ## Decision
21
+
22
+ Upgrade the SessionStart freshness step (`freshenOrWarn()` in `.claude/hooks/session-start.js`, renamed from `printFreshnessWarning()`) from *fetch-and-warn* to *fast-forward-when-safe, else warn*. After the same bounded `git fetch origin main`, it computes `behind = HEAD..origin/main` and, if behind, runs `git merge --ff-only origin/main` **only** when **all** of these hold:
23
+
24
+ - **on branch `main`** — never pull `origin/main` into a feature branch / worktree (that is a rebase, not this hook's job; it cleanly no-ops the common laptop case);
25
+ - **zero local commits ahead** (`origin/main..HEAD == 0`) — strictly behind, so the merge is a real fast-forward, never a merge commit;
26
+ - **no modified/staged tracked files** (untracked/ignored are fine, so a box with stray logs still qualifies) — a fast-forward then cannot shadow uncommitted work;
27
+ - **a full clone, not a partial/blobless one** — on a `--filter=blob:none` box, checkout lazily fetches blobs over the network, which the bounded merge could interrupt; those are left to the cron.
28
+
29
+ Everything stays **bounded + fail-open**: a slow/offline network or any git error never blocks or delays session start — it falls through to the existing warning. The kill-switches (`OTB_FRESHNESS_CHECK_OFF`, `OTB_SUBAGENT` subagent skip) are preserved. On a successful pull the hook prints a one-line confirmation that also notes the caveat below.
30
+
31
+ This **reverses** the "nothing pulls at session start, by design" rule the [#1258] comment documented. That rule is preserved exactly for every case *outside* the safe gate (feature-branch worktrees, dirty trees, diverged history, partial clones), which still get the warning.
32
+
33
+ ## Consequences
34
+
35
+ - **A fresh session on a clean `main` full clone starts current** — the box `/workspace` and a laptop's main checkout fast-forward at startup instead of waiting up to a cron interval (or forever, for a between-ticks session). This is the owner's asked-for behavior.
36
+ - **Never worse than before.** Where the safe gate doesn't hold, behavior is byte-identical to the warn-only step. Where it does, a fast-forward on a clean `main` is local + fast, so the bounded merge effectively never trips; if it ever did, the box cron remains the backstop.
37
+ - **The iCloud-mmap risk is sidestepped, not ignored.** The merge only runs on a clean `main`; Mac sessions are overwhelmingly feature-branch worktrees, which take the (unchanged) warn path. A main-checkout pull on the Mac is bounded and fail-open.
38
+ - **Worktrees and loaded-once surfaces are out of scope.** Per-task worktrees aren't auto-advanced (you don't pull `main` into a feature branch), and even after a successful code pull, the `CLAUDE.md` / hooks / memory already loaded for *this* session reflect the pre-pull state until the next session — the success line says so. The real reset for those surfaces remains a fresh session.
39
+ - **Starter (partial-clone) boxes** keep relying on the cron for freshness; they are deliberately excluded to avoid interrupting lazy blob fetches. If that matters later, the gate can be relaxed once a partial-clone-safe pull path exists.
40
+ - **No new dependency, no new network load.** One extra local `git merge` on the qualifying path; the prod API is untouched (this is the cheap event-driven alternative to a faster cron).
41
+
42
+ [#1258]: https://example.com/builders#/task/1258
43
+ [#275]: https://example.com/builders#/task/275
@@ -0,0 +1,38 @@
1
+ # ADR 0068 — Shared Gemini art key delivered from the GDS to newcomers
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-20
5
+ - **Track:** internal
6
+ - **Builds on:** [ADR 0016](<redacted>.md) (rank enforced server-side, no caching — the gate here is `builders.rank`), [ADR 0054](<redacted>.md) (cost-plus economics — this is the org choosing to absorb newcomer art spend), and the existing per-builder BYOK key path in `art/pipeline/gen_api.py` (V3.R11 [#91](https://example.com/builders#/task/91))
7
+ - **Task:** [#1281](https://example.com/builders#/task/1281)
8
+
9
+ ## Context
10
+
11
+ A newcomer's (rank `xenos`) three first chores include an **art** task — "generate one in-world asset" via `/otb-tile-generate` (`scripts/gds/newcomer-floor.templates.json`). That pipeline needs a Google AI Studio (Gemini) key. Until now the only ways a builder had one were (a) pasting their own during `/builder-setup` (`gemini_api_key` in their local session file) or (b) an operator hand-placing one in `~/.config/otb/env` on the machine. A brand-new builder has neither, so their very first art task fails with a "set `GOOGLE_AI_STUDIO_KEY`" error — a hostile first impression for a task we explicitly want them to complete.
12
+
13
+ The owner's intent: **we pay up front** for a newcomer's first art tasks. Once they prove themselves (graduate `xenos → thetes` after three shipped tasks) they bring their own key. This ADR records the Phase-1 *infrastructure* decision; the newcomer-facing *experience* (copy explaining we pay, the on-promotion walkthrough to add a personal key, a rank-aware setup prompt) is a deliberate Phase 2.
14
+
15
+ ## Decision
16
+
17
+ The GDS becomes the source of a **shared** Gemini key, delivered to entitled builders and consumed by riding the art pipeline's existing key-resolution cascade.
18
+
19
+ 1. **Storage = server secret, not the DB.** The shared key is an operator-provisioned env var `SHARED_ART_GEMINI_KEY` in `/etc/example/web-source.env` (env-first, then `~/.config/otb/gemini-shared.json#api_key` for local dev) — the exact pattern `auth.js` already uses for the GitHub/Discord secrets (`src/bongos/art-key.js`). It is **never** written to the database or its backups, so a DB dump is never a key-disclosure event.
20
+
21
+ 2. **Entitlement = `xenos` only, server-enforced.** `GET /api/gds/me/art-key` (`src/bongos/routes/me.js`) reads the builder's live rank and returns `{ entitled, configured, reason, shared_key }`. The secret is attached **only** when `entitled && configured`. The boundary is a single named constant `SHARED_ART_KEY_MAX_TIER = REQUIRES_RANK_TIER.xenos`, so widening it later (e.g. "any builder without their own key") is a one-line change. Thetes+ get a `200` with `entitled:false` — **not** a 403 — so the client can tell "withdraw the key" apart from an auth failure.
22
+
23
+ 3. **Delivery = a distinct, self-healing session slot.** A SessionStart sync (`scripts/gds/fetch-art-key.js`, a port of `fetch-sound-prefs.js`) calls the endpoint each session and writes/removes a **new** `shared_gemini_api_key` field in `~/.config/otb/gds-session.json` — separate from the builder's own `gemini_api_key`, so "ours" and "theirs" never blur. Re-deriving it every session means promotion to Thetes automatically withdraws the key on the next session start; `setup.js` also fetches it once at onboarding so the first task works immediately.
24
+
25
+ 4. **Resolution = own key always wins.** `gen_api.py` gains one tier, slotted **below** the builder's own key and **above** the manual dotenv fallbacks: `env → own (gds) → own (pms) → shared (gds) → ~/.config/otb/env → .env.local`. A builder who sets their own key is never affected; the shared key is only ever a floor.
26
+
27
+ 5. **Attribution.** `gen_api.api_key_source()` returns `own|shared|env|dotenv`, and `cost_ledger.log_call` stamps it as `key_source` on each row, so shared-key spend (the org's dime) is distinguishable from own-key spend on the cost dashboard.
28
+
29
+ ## Consequences
30
+
31
+ - **Trust widening, bounded deliberately.** We hand a paid key to a low-trust newcomer (it lands in their mode-600 session file, the same tier as their GitHub token). A `xenos` could extract it and run up spend outside the pipeline. We accept this for newcomers and bound the blast radius by: (a) recommending a **dedicated** key with a Google-side **billing/quota cap** ([blocker for the owner](../../blockers/blockers.md)); (b) the server-side rank gate; (c) trivial rotation (change one env var, redeploy). The key is never logged and the endpoint is `no-store`.
32
+ - **Ships safely before the key exists.** With `SHARED_ART_GEMINI_KEY` unset the endpoint returns `configured:false` and nothing changes for anyone — newcomers see today's behavior. Provisioning is decoupled from the code landing.
33
+ - **No schema change.** Entitlement is computed from the existing `builders.rank`; no migration, no encryption layer, nothing in `migrations/`.
34
+
35
+ ## Alternatives considered
36
+
37
+ - **Encrypted key in the DB + an Archon paste-in-browser UI.** More owner-friendly (no SSH) but adds an encryption layer, a migration, and a web surface, and puts the secret in the DB/backups. Rejected by the owner in favor of the server-secret-file path (simplest, most secure, matches every other secret on the project).
38
+ - **Reuse the existing `~/.config/otb/env` shared slot for delivery.** Zero pipeline change, but it's a plain shared dotenv that an operator may have set by hand — the sync could clobber a deliberate choice, and it can't cleanly distinguish "GDS-delivered" from "manual." Rejected for the dedicated, self-healing `shared_gemini_api_key` session field.
@@ -0,0 +1,35 @@
1
+ # ADR 0069 — Builders-hall live updates move from Colyseus WebSocket to SSE
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-20
5
+ - **Deciders:** task [#1194](https://example.com/builders#/task/1194) (V4.R55) — part of the Cloud Bongos standalone-instance work (C8, [ADR 0062](<redacted>.md))
6
+ - **Track:** `internal` (the builders hall)
7
+ - **Supersedes:** the *transport* decision of [ADR 0030](<redacted>.md) §2 (WebSocket/Colyseus). The change-signal layer of ADR 0030 (Postgres `NOTIFY` + `src/bongos/live-channel.js`) is **unchanged** and still authoritative.
8
+
9
+ ## Context
10
+
11
+ [ADR 0030](<redacted>.md) gave the hall live updates in two layers: a transport-agnostic change-signal (a statement-level `NOTIFY` trigger relayed by one persistent `LISTEN` connection in `live-channel.js`) and a **delivery transport** — a broadcast-only Colyseus room (`builders_hall`) riding the game's existing WebSocket server. ADR 0030 explicitly considered SSE, called it "arguably the textbook fit for a receive-only dashboard," and rejected it for one reason only: to **reuse the game's already-proxy-proven Colyseus stack** rather than stand up a second long-lived-connection mechanism.
12
+
13
+ That reason is exactly what the Cloud Bongos decoupling (C8) removes. The GDS-only entrypoint (`src/platform-server.js`, [R51](<redacted>.md)) boots the build platform with **no Colyseus in the process**. A `builders_hall` room cannot exist there, so on a game-less instance the hall's only live feature was dead — it would freeze at load exactly as it did before ADR 0030. The transport was load-bearing on the game runtime, which a standalone Cloud Bongos instance does not have.
14
+
15
+ ## Decision
16
+
17
+ Move the hall live transport to **Server-Sent Events**: `GET /api/gds/live` (`src/bongos/routes/live.js`), mounted **unconditionally** in the GDS router (`buildGdsRouter`). Because that router mounts in *both* entrypoints (`server.js` and `platform-server.js`), the hall refreshes live whether or not the game is in the process — which is the R55 done-when.
18
+
19
+ - **Signal layer untouched.** The endpoint `subscribe()`s to the same `live-channel.js` relay the room used. Triggers, channel, and fan-out logic are identical (ADR 0030 §1 still governs them).
20
+ - **Same zero-leak contract.** It emits an opaque `nudge` event with an empty `{}` body — never the relay's `{table, op}` (leaking internal table names was a hacker-dispatch finding on [#569](https://example.com/builders#/task/569)). The hall re-runs its authenticated per-panel fetches on any nudge, so access control stays where the data is.
21
+ - **Auth + abuse control.** `requireBuilder` gates the stream (mirrors the room's [#983](https://example.com/builders#/task/983) signed-in requirement; the `gds_session` cookie rides the same-origin `EventSource` GET). A per-IP concurrent-connection cap is kept **inline** in the route — deliberately *not* imported from `src/rooms/hall-join-guard.js` — so the GDS live channel carries **zero game-code dependency**, which is the point of R55.
22
+ - **Client simplifies.** `public-builders/builders.js` opens an `EventSource` instead of joining a Colyseus room. `EventSource` reconnects natively, so the manual 4 s rejoin backoff is gone; the debounced `loadAll()`, the don't-clobber-active-input guard, and the `visibilitychange` backstop are kept. The hall no longer loads `/vendor/colyseus.js`.
23
+ - **Dead code removed.** `src/rooms/BuildersHallRoom.js`, `src/rooms/hall-join-guard.js`, and `tests/builders_hall_room.mjs` are deleted; `server.js` no longer defines `builders_hall`. The game still serves `/vendor/colyseus.js` for itself — only the hall stopped depending on it.
24
+
25
+ ## Alternatives considered
26
+
27
+ - **Keep the Colyseus room AND add SSE (pick per boot).** Rejected: it leaves two parallel live mechanisms — precisely the "second long-lived-connection style" ADR 0030 wanted to avoid — and doubles the maintenance surface for a tiny internal feature. SSE works in both boots, so the room is pure dead weight after the client rewire.
28
+ - **A raw `ws` endpoint instead of SSE.** Rejected: the channel is strictly receive-only, so WebSocket's bidirectionality buys nothing, and `ws` would reintroduce a long-lived-connection lib and a hand-rolled reconnect/heartbeat the browser's `EventSource` gives for free.
29
+
30
+ ## Consequences
31
+
32
+ - The hall is live on a game-less Cloud Bongos boot — the executable R55 done-when lives in `tests/platform_boot.mjs` (`GET /api/gds/live` is mounted + auth-gated, not 404) and `tests/live_sse.mjs` (SSE framing, bare-nudge no-leak, per-IP cap).
33
+ - One fewer long-lived-connection style on the internal surface; the hall's realtime path no longer touches the game runtime.
34
+ - SSE must traverse Caddy → Cloudflare. It rides plain HTTP with `Cache-Control: no-cache, no-transform` + `X-Accel-Buffering: no`, and a 25 s heartbeat comment keeps the stream under Cloudflare's ~100 s idle timeout.
35
+ - If a future change ever puts row data on this channel, the `requireBuilder` gate already in place must stay (ADR 0030's "add an `onAuth` gate first" caveat is satisfied by construction here).
@@ -0,0 +1,44 @@
1
+ # ADR 0070 — Deterministic delivery of in-session cards (hook-delivered, read-only vs mutating)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-20
5
+ - **Track:** internal
6
+ - **Builds on:** the deterministic-card lineage — task 1273 (script owns the card markup, same shape every session), task 1279 (per-builder "render widgets" knob; OFF ⇒ no HTML), task 1282 (in-band `[otb-card]` relay directive so the contract doesn't live only in the skill). Hook discipline mirrors [`.claude/hooks/conductor.js`](../../.claude/hooks/conductor.js) (the `UserPromptSubmit` MAS Conductor, [ADR 0024](<redacted>.md)).
7
+ - **Task:** [#1288](https://example.com/builders#/task/1288)
8
+
9
+ ## Context
10
+
11
+ A session review found the `/builder-start` "pane" rendering unreliably. The card's *content* had been deterministic since tasks 1273/1279/1282 — `start.js` owns the markup — but its *delivery* was not. The skill asked the model to run a multi-step routine every session: detect whether `show_widget` exists → call `read_me` → run the script → branch on the first character of stdout → parse stderr directives → render. Every step is a place a probabilistic model can diverge.
12
+
13
+ The sharpest failure is structural, not behavioral. The exported session ran on a **cloud/remote** surface where the `mcp__visualize` server (which provides `show_widget`/`read_me`) **was not present at all** — so the skill's documented "normal case in the app" path was impossible, and the model either called a missing tool or dumped raw HTML as text. The same class of miss happens whenever the model "summarizes" instead of relaying.
14
+
15
+ We confirmed the hook boundary against the Claude Code docs:
16
+
17
+ - A hook **cannot** render UI or call an MCP tool (`show_widget`), and **cannot** detect which tools/MCP servers exist in the session (no tool manifest reaches a hook). Only the model can emit the visible card, and only the model knows its own tool set.
18
+ - `UserPromptSubmit` (and `SessionStart`/`UserPromptExpansion`) inject **stdout as context**; `PostToolUse` injects model-visible context via **`hookSpecificOutput.additionalContext`** (placed next to the tool result, read on the next model request).
19
+
20
+ So fully-deterministic *pixels* are not achievable today. The achievable win is to move the deterministic 5 of the 6 steps **out of the model and into a hook**, leaving the model only the irreducible "emit" step — with the finished card and a one-step directive handed to it.
21
+
22
+ ## Decision
23
+
24
+ Make card **delivery** deterministic via hooks, and split the vehicle by whether the owning script **mutates state** — because that determines whether a hook may run it.
25
+
26
+ 1. **Read-only cards** (`/builder-start`, `/status`; future: `/recall`) → **[`session-cards.js`](../../.claude/hooks/session-cards.js)**, a `UserPromptSubmit` hook. On a matching intent it runs the script's `--hook` mode, which emits a one-fetch JSON envelope `{widgets_enabled, html, markdown, warnings}`, and injects the finished card + a one-step "render this once" directive. Registry-driven: adding a read-only card is one `CARDS` entry (a matcher, a script, an arg-extractor). Safe to pre-run because these scripts only fetch + render.
27
+
28
+ 2. **Mutating / lifecycle cards** (`/builder-claim`, `/builder-ship`; `release` matched, emits none today) → **[`lifecycle-card.js`](../../.claude/hooks/lifecycle-card.js)**, a `PostToolUse`/Bash hook. These **must never be pre-run** — claiming or shipping as a side effect of merely typing would be catastrophic. Instead the model runs the script itself; the hook fires immediately after, reads the `[otb-card-html] <path>` marker the shared emitter ([`src/bongos/ship-card.js`](../../src/bongos/ship-card.js)) wrote, reads that file, and injects the card + directive next to the tool result.
29
+
30
+ Both hooks honor the task-1279 widgets knob (OFF ⇒ no HTML injected, the plain-text card stands), carry **exactly two** fence markers around each payload (no extraction ambiguity), and follow the standard hook discipline: silent-fail (any miss/parse/IO error → exit 0, no output), zero model calls, a kill-switch (`OTB_SESSION_CARDS_OFF`) and the `OTB_SUBAGENT` guard. The skills (`builder-start`, `status`, `builder-claim`, `builder-ship`) are slimmed to **defer to the injected directive**, keeping their old run-the-script logic as the fallback when no directive appears (hook disabled, an older checkout, or a silent failure).
31
+
32
+ ## Consequences
33
+
34
+ - **Reliability up across every surface.** The card data + render instruction reach the model deterministically on app, cloud/remote, plain terminal, and cron — independent of whether `show_widget` exists. Where it doesn't, the directive says "paste the markdown," so the failure mode becomes a plain card instead of a broken widget or a raw-HTML dump.
35
+ - **Interactivity preserved.** The rich, click-to-claim / click-to-drill widget still renders where `show_widget` exists; it's now a reliable enhancement rather than the sole, fragile path.
36
+ - **The render is still a model action.** This is a hard platform limit — a hook can instruct but cannot force a tool call. Reliability equals the model's compliance with an unmissable, pre-computed instruction (high), not a hard guarantee. If a forced-render primitive ever exists, `/feedback` is the channel.
37
+ - **Token cost.** When widgets are ON the hook injects both the HTML and the markdown form (it can't detect `show_widget`, so the model must be able to branch). Bounded: it fires only on an explicit card intent, not every prompt.
38
+ - **`/status` gained a card.** It previously emitted freeform text the skill was told to "interpret + relay" (per-session improvisation); it now owns a deterministic widget + markdown card, and its stale default version was bumped `GDS-V3` → `GDS-V4` (GDS-V3 is closed).
39
+
40
+ ## Alternatives considered
41
+
42
+ - **Bulletproof the skill only** (reword so markdown is the default, widget the exception). Improves the odds but leaves delivery a model decision — same failure class, just rarer. Rejected as a mitigation, not a fix; kept as the fallback layer.
43
+ - **Auto-render at `SessionStart`.** Rejected: a builder runs many parallel sessions, so a card on every session open is noise. Delivery fires on explicit intent instead.
44
+ - **One hook for both events.** Rejected: read-only (pre-run on intent) and mutating (post-run on tool use) have genuinely different trigger logic; two single-responsibility hooks read more clearly than one dispatching on `hook_event_name`.
@@ -0,0 +1,59 @@
1
+ # ADR 0071 — Dev-box teardown confirms the droplet is gone before marking 'destroyed'; a bidirectional drift reconcile is the backstop
2
+
3
+ **Date:** 2026-06-20
4
+ **Context:** GDS / dev boxes, task [#1289](https://example.com/builders#/task/1289). Builds on [ADR 0031](<redacted>.md) (cloud dev environments) and [ADR 0053](0053-scoped-dev-box-session.md) (scoped dev-box session). Touches `scripts/gds/box.js`, `src/bongos/boxes.js`, `src/bongos/do-api.js`, `infra/box-drift-reconcile.{service,timer}`.
5
+ **Status:** Accepted.
6
+ **Track:** `internal` (development system / builder dev boxes).
7
+
8
+ ## Problem — the "zombie" box
9
+
10
+ A dev box could reach GDS `box_state='destroyed'` while its DigitalOcean droplet kept **running and SSH-reachable**. Confirmed 2026-06-20 on `box-example-owner.dev.example.com` (builder LarsCode, xenos, id 3): `GET /api/gds/box/source-access` returned `403 {"reason":"NO_ACTIVE_BOX","box_state":"destroyed"}`, the box had no git `origin` remote, and it was frozen at an old commit — it could never pull new code again, which silently broke a newcomer feature (the box never fetched `scripts/gds/fetch-art-key.js`).
11
+
12
+ The impact is three-fold: **cost** (a "destroyed" droplet keeps billing), **security** (a box the control plane considers gone is still SSH-reachable and holds a live session token + repo clone), and **UX** (every task on a zombie box silently fails because the code can't update — a baffling "it's just not working").
13
+
14
+ ### Root cause
15
+
16
+ `deprovisionOne()` deleted the droplet with a swallowed error and then set `destroyed` unconditionally:
17
+
18
+ ```js
19
+ if (box.droplet_id) await doApi.deleteDroplet(box.droplet_id).catch((e) => console.log(` ⚠ droplet delete: ${e.message}`));
20
+ // ...
21
+ await boxes.setBoxState(pool, box.builder_id, 'destroyed', { droplet_id: null, ... });
22
+ ```
23
+
24
+ A transient DO failure (API blip, rate limit, token issue) was logged and ignored; the row flipped to `destroyed` and **nulled `droplet_id`** — losing the only reference to a droplet that was still alive. Worse, `canTransition('deprovision','destroyed')` is `false`, so the existing tooling could never re-attempt the teardown: the zombie was unreachable by id, forever.
25
+
26
+ ## Decision
27
+
28
+ ### 1. Confirm-before-destroyed (the primary fix)
29
+
30
+ The droplet delete is the **gate** for the `destroyed` transition. In `deprovisionOne()`:
31
+
32
+ - Delete the droplet via an **idempotent, retried** helper (`deleteWithRetry`): a `404` means "already gone" = success; transient failures retry a few times.
33
+ - If the delete genuinely fails after the retry budget, the box is parked at **`state='error'` with `droplet_id` PRESERVED** (not nulled) and an `error_note`, an `error` event is recorded, and the function **throws**. The row never reaches `destroyed` while a droplet is still alive.
34
+ - Snapshot / Cloudflare-tunnel / DNS teardown stay best-effort (a leftover snapshot is cost-only; the droplet — the thing that bills and is SSH-reachable — is gone by then), but the snapshot delete is now idempotent too.
35
+
36
+ This makes the DB row **truthful by construction**: `destroyed` now means "DO confirmed the droplet is gone."
37
+
38
+ ### 2. A bidirectional drift reconcile (the backstop)
39
+
40
+ `box.js reconcile-drift` lists the real fleet droplets (`DoApi.listDroplets({ tag })` — a live read even in dry-run, since listing is non-mutating) and compares them to the GDS box rows via a pure `boxes.planDropletDrift()`:
41
+
42
+ - **Zombie** — a droplet no live box row claims (row is `destroyed`/`error`/`none`, or its `droplet_id` was nulled) → force-delete the droplet + tear down its tunnel/DNS.
43
+ - **Ghost** — a box row in a droplet-holding state whose `droplet_id` is gone from DO → mark `destroyed` (clearing the dead `droplet_id` + SSH host keys per idea 310) so the DB stops claiming a running box.
44
+
45
+ An **in-flight guard** protects provisions: a droplet created within `minAgeMinutes` (default 30) is never treated as a zombie — its box may still be `provisioning` (the row's `droplet_id` isn't written until the droplet settles `active`). Skipped-young droplets are reported, never deleted.
46
+
47
+ Dry-run is the default; `--apply` executes. A new hourly timer (`infra/box-drift-reconcile.{service,timer}`) runs it `--apply` so drift self-heals hands-off — hourly because a zombie bills continuously, so the daily dormant sweep is far too slow to catch one.
48
+
49
+ ## Alternatives considered
50
+
51
+ - **Poll `getDroplet` until 404 after the DELETE.** Stronger confirmation, but adds latency + API calls; the DELETE returning 204/404 is sufficient acceptance, and `reconcile-drift` is the backstop for anything that still slips through. Rejected as over-engineering.
52
+ - **Box-side self-termination on `NO_ACTIVE_BOX`.** A box *cannot* delete its own droplet (no DO token; the builder firewall doesn't allow-list the DO API), and `poweroff` does **not** stop DigitalOcean billing. So self-termination can't actually reclaim the droplet — only the control-plane reconcile can. The box-side loop is harmless churn; we left `box-source-fetch.sh` unchanged rather than touch a fleet-auto-installed, permission-path-sensitive script ([ADR 0043](<redacted>.md)) for no real gain.
53
+ - **Reconcile snapshots too.** Out of scope: a leaked snapshot is ~$0.30/mo, not SSH-reachable, and not the reported bug. The reconcile is droplet-focused, matching the task.
54
+
55
+ ## Consequences
56
+
57
+ - A failed teardown is now **visible** (`state='error'`, queryable) instead of a silent zombie, and self-heals on the next reconcile tick or `box.js deprovision`.
58
+ - One new operator step: `systemctl enable --now box-drift-reconcile.timer` on the prod droplet (mirrors the idle/dormant sweep units). `reconcile-drift` requires `DO_API_TOKEN` (always present in `/etc/example/box.env`).
59
+ - Pure decision (`planDropletDrift`) + idempotent delete (`deleteWithRetry`) are unit-tested hermetically in `tests/boxes.mjs` (no DO, DB, or clock).
@@ -0,0 +1,35 @@
1
+ # ADR 0072 — Bongos app ships Mac-signed + notarized first; Windows code signing deferred (reuse the Dev Box app's signing posture)
2
+
3
+ **Date:** 2026-06-20
4
+ **Context:** Bongos App `BONGOS-V1` / criterion C1 (signed-installable), task [#1296](https://example.com/builders#/task/1296) (`BV1.R01`). Builds on [ADR 0045](<redacted>.md) (the Dev Box desktop app) and [ADR 0004](0004-example-name-and-trademark-acceptance.md) (brand discipline). The bongos app forks the Dev Box app's Electron shell ([#1298](https://example.com/builders#/task/1298) `BV1.R03`), so it inherits that app's signing machinery; this ADR pins which parts it inherits now and which it defers.
5
+ **Status:** Accepted.
6
+ **Track:** `internal` (development system → the Cloud Bongos desktop app line; bongos succeeds the GDS after GDS-V4).
7
+
8
+ ## Problem — an unsigned mic + screen app reads as hostile
9
+
10
+ Bongos is a floating OS toolbar that asks for **Screen Recording + Microphone** on first run. An unsigned app making those requests is treated as hostile by the OS: on macOS the permission grants may not persist across launches (and arm64 won't launch at all without at least an ad-hoc signature), and on Windows SmartScreen blocks the first launch outright. So a code-signing path is a launch gate, and `R01` exists to **decide** that path up front so packaging (`R15`/`R16`) is unblocked — not to leave it open until packaging time.
11
+
12
+ The Dev Box app already walked this road ([ADR 0045](<redacted>.md)):
13
+
14
+ - **macOS — solved and wired.** `.github/workflows/build-devbox-app.yml` carries an *inert-until-armed* Mac signing block: with no secrets it builds unsigned (ad-hoc); arming is purely adding repo secrets (`MAC_CSC_LINK` + `MAC_CSC_KEY_PASSWORD`, plus optional `MAC_NOTARIZE_*` for notarization) — no workflow edit. The secrets are bound to the cert env vars **only on the trusted `main` ref** (the SR-13/SR-14 hardening, [#993](https://example.com/builders#/task/993)) so a `claude/**` feature branch can never exfiltrate the Developer ID cert. A post-build `dmgbuild` re-package (task [#1235](https://example.com/builders#/task/1235)) preserves notarization while fixing the install-window backdrop.
15
+ - **Windows — never resolved.** Windows signing stays unwired pending a cert-vendor decision: blocker [#20](https://example.com/builders#/blocker/20) (Azure Trusted Signing vs. a traditional EV cert). Today Dev Box Windows users get the SmartScreen "More info → Run anyway" first-run friction, documented in the hall onboarding copy.
16
+
17
+ (The committed `devbox-app/electron-builder.yml` header comment still says "no Apple Developer ID… in the budget yet." That comment is **stale** — the CI workflow is the live truth, and the only signing blocker still open is the Windows-only [#20](https://example.com/builders#/blocker/20). Corrected as a side-note below.)
18
+
19
+ ## Decision (owner — Lars)
20
+
21
+ **Ship the bongos app Mac-signed + notarized only at first; defer Windows code signing — the same posture as the Dev Box app.** Concretely:
22
+
23
+ 1. **macOS — reuse the Dev Box app's signing identity verbatim.** No new Apple Developer ID, no separate cert. The bongos build workflow (authored in `R15`/`R16`) copies the Dev Box app's inert-until-armed Mac block — `CSC_LINK` / `CSC_KEY_PASSWORD` + `APPLE_ID` / `APPLE_APP_SPECIFIC_PASSWORD` / `APPLE_TEAM_ID`, **`main`-ref-gated** per SR-13/SR-14 — so the same Developer ID that signs Dev Box signs bongos. Sign **and** notarize for a Gatekeeper-clean first launch.
24
+ 2. **Windows — defer, do not block V1.** Bongos does **not** acquire a Windows code-signing cert as part of `BONGOS-V1`. It ships either Mac-only at first, or with an **unsigned** Windows build carrying the same "More info → Run anyway" onboarding copy the Dev Box app uses. Windows signing rides the **existing** decision in blocker [#20](https://example.com/builders#/blocker/20) — there is no separate bongos Windows-cert decision and no new spend now.
25
+ 3. **One cert decision, two apps.** When blocker [#20](https://example.com/builders#/blocker/20) resolves (Azure Trusted Signing vs. EV) it resolves for **both** apps at once — the absorbed Dev Box module and the bongos toolbar share the umbrella app's installer ([#1298](https://example.com/builders#/task/1298)), so Windows signing arms once for the whole umbrella.
26
+
27
+ This satisfies `R01`'s done-when: the Windows approach is decided (explicit interim "Mac-signed only" recorded here), and the Mac path is confirmed to reuse the existing Dev Box Apple Developer ID rather than minting a new one.
28
+
29
+ ## Consequences
30
+
31
+ - **`R15` (electron-builder signing config) and `R16` (branded download + updater) inherit the Dev Box pattern, not a fresh design.** They copy the inert-until-armed Mac block and its `main`-ref-only secret gating verbatim into the umbrella build workflow. Re-deriving signing from scratch in those tasks is wasted work — point them at `.github/workflows/build-devbox-app.yml` and this ADR.
32
+ - **Budget: $0 new recurring cost from this decision.** It rides the Apple Developer ID already paid for Dev Box and explicitly declines a Windows cert for now (CLAUDE.md §4 — any new recurring cost needs the owner's go-ahead; this defers it).
33
+ - **Windows users see first-run friction until [#20](https://example.com/builders#/blocker/20) resolves.** Acceptable for V1: the early audience is Mac-first (the owner + the existing Dev Box builders), and the SmartScreen "Run anyway" copy is already written and proven for Dev Box.
34
+ - **The bongos app must not mint a second Apple Developer ID or duplicate the Mac signing block as a sibling.** Reuse is the rule — the umbrella app is one signed app ([#1298](https://example.com/builders#/task/1298)), one Developer ID, one notarization flow.
35
+ - **Side-note / cleanup, not in scope here:** `devbox-app/electron-builder.yml`'s "UNSIGNED for now — no Apple Developer ID" header comment contradicts the armed CI workflow and the closed-Apple / open-Windows blocker state. Worth a one-line fix under a Dev Box-scoped claim; flagged, not done here (this is a `decision` task touching `bongos-app/`, not `devbox-app/`).
@@ -0,0 +1,39 @@
1
+ # ADR 0072 — Dev-box code-staleness: make it visible, never auto-reset
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-20
5
+ - **Track:** internal
6
+ - **Builds on:** [ADR 0031](<redacted>.md) (per-builder dev boxes), the `box-source-fetch.sh` self-update machinery ([#600](https://example.com/builders#/task/600), [#985](https://example.com/builders#/task/985)), and task [#1187](https://example.com/builders#/task/1187) (the box host-key reporter — the report-up cron pattern this mirrors)
7
+ - **Task:** [#1316](https://example.com/builders#/task/1316) (from idea [#332](https://example.com/builders#/idea/332))
8
+
9
+ ## Context
10
+
11
+ A builder (LarsCode) repeatedly hit cryptic dev-box failures: the shared Gemini art key never reached the box, and Claude Desktop connect failed with "host verification failed." Both traced to **one cause — the box was running stale code.** Its box was provisioned 2026-06-07, before two features existed: the shared-art-key delivery rail ([ADR 0068](<redacted>.md), `fetch-art-key.js` + the `gen_api.py` shared tier) and the host-key reporter ([#1187](https://example.com/builders#/task/1187)).
12
+
13
+ Investigation refined the problem. Boxes **already auto-update**: `infra/box-source-fetch.sh` runs every ~10 min and `git pull --ff-only`s `/workspace`, *and* self-updates its own baked scripts/crons ([#985](https://example.com/builders#/task/985)). So any box provisioned *after* that machinery landed self-heals. The residual gaps:
14
+
15
+ 1. A box provisioned **before** the self-update machinery has no self-update cron — it can never pull the fix, so it's stuck stale forever. Only a rebuild (deprovision → fresh provision) helps.
16
+ 2. When `pull --ff-only` can't fast-forward (a diverged/dirty tree), `box-source-fetch.sh` logs and leaves the tree as-is — stale, **silently**.
17
+ 3. **There was no visibility.** A stale box fails cryptically and the builder has no way to know the cause is old code.
18
+
19
+ ## Decision
20
+
21
+ Add a **visibility** layer, not more auto-magic.
22
+
23
+ - The box reports its `/workspace` HEAD commit (sha + commit date) via a new cron `infra/box-report-version.sh` → `POST /box/version` (`allowBoxScope`, own resource), wired into the existing `box-source-fetch.sh` self-heal cron list so current boxes pick it up with no re-provision. Migration 121 adds `code_sha` / `code_committed_at` / `code_reported_at` to `builder_boxes` (same report-up shape as the host-keys columns, migration 105).
24
+ - The server computes staleness (`boxes.computeCodeStaleness`, pure + unit-tested) by comparing the box's reported commit date to the server's **own deployed commit date** (`src/build-info.js` `commitDate`). A box is stale when it's > 2 days behind, **or** when an active box past a 30-min provision grace has **never reported a version** — which is exactly the signature of a box too old to even run the reporter (the ancient pre-machinery box).
25
+ - Surfaced on `GET /box/me` and the `/boxes` Archon roster (via the shared `publicBox` projection), and rendered in the hall as an amber "This box is running old code — Close box, then provision a fresh one to update" banner (`public-builders/box-panel.js`), pointing at the existing Close-box affordance.
26
+
27
+ ### Why visibility, not auto-reset
28
+
29
+ The tempting "durable fix" is to have the box force itself current (`git reset --hard origin/main`). **Rejected:** a dev box holds the builder's in-progress, uncommitted work. Auto-resetting would silently destroy it — a far worse failure than running slightly old code. `box-source-fetch.sh` already makes the safe move (`pull --ff-only`, which refuses to clobber). When that can't fast-forward, the right answer is to *tell the builder* (so they can commit/stash and rebuild), not to overwrite their tree. Rebuild is the builder's explicit, informed choice.
30
+
31
+ ### Why a rebuild is the only fix for ancient boxes
32
+
33
+ A box that predates the self-update machinery has no mechanism to pull the fix — including no mechanism to pull *this* reporter. So it never reports, the server flags it stale on the "never reported while active" rule, and the surfaced remedy is a rebuild (Close box → provision fresh, which re-clones current `main` from cloud-init). There is no in-place path; that's inherent, and the flag makes it visible instead of cryptic.
34
+
35
+ ## Consequences
36
+
37
+ - Stale boxes become **visible and self-explanatory** instead of failing cryptically. Going forward, post-machinery boxes self-update; the flag catches the legacy stragglers and any box whose pull has silently wedged.
38
+ - Thresholds (30-min grace, 2-day lag) live in code with the tests, not the schema — tunable without a migration. The 2-day window is deliberately generous so a box mid-pull right after a deploy is never false-flagged; the target is weeks-stale boxes.
39
+ - **Follow-ups (out of scope here):** surfacing the same flag in the Dev Box Electron app (a separate release artifact); and optionally a one-click "rebuild" in the hall (today it's the existing Close box → provision).