@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,62 @@
1
+ # ADR 0116 — API error envelope + code taxonomy
2
+
3
+ **Date:** 2026-07-04
4
+ **Status:** Accepted (contract; R01 of goal 36).
5
+ **Context:** [task 1988](https://builders.example.com#/task/1988) (BONGOS-V1, goal 36 "Robust, versioned, easy-to-call public API", criterion `api-error-envelope`). This is the **contract** the rest of the criterion implements: the central middleware + `res.fail()` helper ([task 1989](https://builders.example.com#/task/1989), R02), the build check that holds the line ([task 1990](https://builders.example.com#/task/1990), R03), and the sweep of existing handlers onto it ([task 1991](https://builders.example.com#/task/1991), R04). Sibling contracts in the same goal: versioning (R05), the source-of-truth spike (R07), validation (C4), pagination (C5).
6
+
7
+ ## Problem
8
+
9
+ An audit of the live API surface (`src/bongos/` + `modules/*/routes/`) found **352 distinct `error:'…'` string literals**, returned across HTTP statuses 400/401/403/404/409/413/422/429/500/502/503 in three or four different response *shapes* (`res.status(n).json({error})`, bare `res.json({error})`, `res.status(500).json({error, message})`, `res.sendStatus(n)`). A caller — the CLI, the Dev Box app, a web page, or an external self-hoster — cannot write **one** error-handling path against that: there is no guaranteed key to read, no stable status, and no way to tell a retriable failure from a permanent one. The codes are not the problem (a specific slug like `task_not_found` is useful); the *absence of a documented, uniform envelope and a classification* is.
10
+
11
+ ## Decision
12
+
13
+ **One envelope, everywhere:**
14
+
15
+ ```json
16
+ { "error": { "code": "task_not_found", "message": "…", "details": … } }
17
+ ```
18
+
19
+ - **`code`** — a stable machine-readable slug the caller may switch on. **The specific slug is preserved** — a caller keying on `task_not_found` keeps working. The taxonomy collapses codes by *category*; it does not discard them.
20
+ - **`message`** — human-readable, safe to surface. Internals are never echoed unless a handler opts in.
21
+ - **`details`** — optional structured payload (e.g. the validator's `[{field,reason}]`).
22
+
23
+ **A registry, not 352 loose strings** — `src/bongos/api-errors.js` (kernel, core). It defines **~12 canonical categories**, each with a default HTTP status and a `retriable` flag:
24
+
25
+ | category | status | retriable | meaning |
26
+ |---|---|---|---|
27
+ | `bad_request` | 400 | no | malformed/invalid input |
28
+ | `validation_failed` | 400 | no | spec/schema validation failed; `details` lists field errors |
29
+ | `unauthenticated` | 401 | no | no valid session/credential |
30
+ | `forbidden` | 403 | no | rank/ownership insufficient |
31
+ | `not_found` | 404 | no | resource missing |
32
+ | `conflict` | 409 | no | clashes with current state (exists, cycle, active claim, stale tip) |
33
+ | `payload_too_large` | 413 | no | body/element over the limit |
34
+ | `unprocessable` | 422 | no | well-formed but semantically unacceptable |
35
+ | `rate_limited` | 429 | **yes** | too many requests / quota |
36
+ | `internal` | 500 | **yes** | unexpected error or a server-side op that failed |
37
+ | `bad_gateway` | 502 | **yes** | upstream returned garbage |
38
+ | `unavailable` | 503 | **yes** | dependency/feature not configured or down |
39
+
40
+ Every one of the 352 codes classifies onto a category via **`classify(code)`** — an explicit `OVERRIDES` table for the exceptions the naming can't disambiguate (auth codes, preconditions read as conflicts, `*_too_large`), plus a **suffix/prefix heuristic** for the long tail that encodes the conventions the audit surfaced: `*_failed`/`*_error` → `internal`; `*_not_found` → `not_found`; `bad_*`/`invalid_*`/`*_required`/`*_mismatch` → `bad_request`; `already_*`/`*_taken`/`*_exists`/`*_conflict` → `conflict`; `*_unconfigured` → `unavailable`. `classify` is **pure + total**: an unrecognised (or future) code falls back to `internal` (500) — the safe default — never throwing.
41
+
42
+ The module also ships the **`ApiError`** carrier (`throw new ApiError(code, {status?, message?, details?})` — status/category derived from the registry) and the pure **`envelope()`** formatter. `statusForCode(code, override)` lets a call site keep its current status where it differs from the category default (e.g. a route already returning 422) — so the R04 sweep changes *shape*, not *status*, and is safe.
43
+
44
+ ## Why this shape
45
+
46
+ - **`{error:{…}}` (nested), not `{error:'code', message:'…'}` (flat).** A nested object gives one place to grow (`details`, later `retriable`/`docs_url`) without colliding with a payload field, and lets a caller test `resp.error` as the single failure discriminator. The flat shape is what today's mess already is.
47
+ - **Preserve codes, collapse by category.** Discarding 352 codes down to 12 would break every caller that reads a specific code and lose real signal. Classification is additive: the code stays; the category + status become *derivable* and uniform.
48
+ - **Heuristic + overrides, not a 352-row frozen table.** The naming conventions are real and regular; encoding them as rules keeps the registry small and auto-classifies future codes, while the override table pins the ~90 genuine exceptions. The classifier is authoritative — R02/R04 call it, they don't re-decide.
49
+ - **Contract-only now, zero behaviour change.** Nothing imports `api-errors.js` yet, so this ADR + module + test ships without touching a single response. R02 wires the middleware; R04 sweeps the handlers behind the R03 build check.
50
+
51
+ ## Consequences
52
+
53
+ - A caller can finally write one path: read `resp.error.code`, branch on `resp.error` presence, retry on the `retriable` categories (429/5xx).
54
+ - The OpenAPI spec (R07/`gen-api-docs.js`) can advertise the envelope as the single error schema and the category set as an enum.
55
+ - The sweep (R04) is mechanical: replace each `res.status(n).json({error:'x'})` with `res.fail('x')` (or `throw new ApiError('x')`), status preserved via the registry. The R03 build check fails any new hand-rolled flat error, so the line holds as the sweep progresses.
56
+
57
+ ## Rejected
58
+
59
+ - **A flat `{error, message}`.** Already the de-facto shape; no room to grow, and `error` doubling as both discriminator and code is what callers can't rely on.
60
+ - **Renumbering to numeric error codes (e.g. `BONGOS-1234`).** Opaque to humans, needs a lookup table, and throws away the self-describing slugs.
61
+ - **Collapsing to ~12 codes only.** Loses per-operation signal and breaks specific-code callers.
62
+ - **A per-module registry.** The whole point is *one* shape across core + every module; a shared kernel registry is the only thing that guarantees it.
@@ -0,0 +1,50 @@
1
+ # ADR 0117 — API versioning + deprecation policy
2
+
3
+ **Date:** 2026-07-04
4
+ **Status:** Accepted (policy; R05 of goal 36).
5
+ **Context:** [task 1992](https://builders.example.com#/task/1992) (BONGOS-V1, goal 36 "Robust, versioned, easy-to-call public API", criterion `api-versioning`). This is the **policy**; the mount + aliasing that implements it is R06 ([task 1993](https://builders.example.com#/task/1993)). Builds on the API-prefix chokepoint ([`src/gds/api-prefix.js`](../../src/gds/api-prefix.js), task 1918/1919), the self-describing OpenAPI + hosted `/docs` ([ADR 0109](<redacted>.md)), and the docs-discovery contract ([ADR 0114](<redacted>.md)).
6
+
7
+ ## Problem
8
+
9
+ The API (212 endpoints) is served at `/api/bongos` (canonical) with `/api/gds` as a permanent silent alias. Neither is a **version** — they are *prefix* names. There is no version marker in the path, no written definition of what a breaking change is, and no deprecation policy. So today any change — a removed field, a tightened validation, a changed status code — can silently break a self-hoster's integration, a shipped Dev Box binary, or the status dashboard, with no signalling and no migration window. Two things also get conflated: the **software version** (OpenAPI `info.version` = the core package semver, which moves every release) and the **API contract version** (which should move only on a breaking change). A caller must be able to pin to a contract that won't shift under it.
10
+
11
+ ## Decision
12
+
13
+ **1. An explicit version segment in the path: `/api/bongos/v1/…`.** The version is a path marker (`v1`, `v2`, …) immediately after the prefix — coarse-grained (a whole-surface major), the shape almost every caller finds easiest to pin and reason about. It is the **contract** version, distinct from the package semver.
14
+
15
+ **2. Today's unversioned paths are PERMANENT aliases pinned to v1.** `/api/bongos/<x>` and `/api/gds/<x>` keep working forever and resolve to **v1** semantics. This extends the existing permanent-`/api/gds`-alias decision (`api-prefix.js`): shipped Dev Box desktop binaries, live boxes, and the separately-hosted status-dashboard mirror all call unversioned `/api/gds/…` and **cannot be force-updated**, so their surface can never be removed.
16
+
17
+ The load-bearing safety rule: **an unversioned path never silently jumps major versions.** When v2 ships, it mounts at `/api/bongos/v2/…`; the unversioned alias **stays pinned to v1**. An old caller keeps getting v1 behaviour; only a caller that explicitly asks for `/v2/` gets the new contract. Breaking changes therefore reach only opted-in callers.
18
+
19
+ **3. What counts as a breaking change** (bumps the major → new `/vN`):
20
+
21
+ - Removing or renaming an endpoint, a request/response field, or an error `code`.
22
+ - Changing a field's type, or an endpoint's success status code.
23
+ - Adding a newly-*required* request field, or tightening validation to reject input that was previously accepted.
24
+ - Narrowing auth/rank so a call that used to succeed now 403s.
25
+ - Changing a default that alters a response's shape/size (e.g. a pagination default).
26
+
27
+ **Non-breaking** (ships within the current version, no bump):
28
+
29
+ - Adding an endpoint, an *optional* request field, or a new response field.
30
+ - Adding a new error `code` **within an existing category** (the ADR 0116 envelope means a caller already handles unknown codes by category, so this is safe).
31
+ - Relaxing validation; adding an optional query param.
32
+
33
+ **4. Deprecation window.** A version, once superseded, lives **≥ 180 days** past its successor's GA before it may be removed. While deprecated it returns RFC 8594 `Deprecation: true` + `Sunset: <date>` response headers and is marked deprecated in the OpenAPI spec + `/docs`. The **unversioned alias is exempt** — it is permanent (rule 2), never sunset. Only explicitly-versioned prefixes (`/v1`, `/v2`, …) are subject to the window. Removal of a sunset version is itself a tracked, announced task (build-broadcast to the team channel), never silent.
34
+
35
+ **5. The version is discoverable.** The OpenAPI spec grows a `servers` entry for `…/v1` and an `x-api-version: "v1"` marker; `info.version` continues to track the **package** semver (unchanged — it is the software build, not the contract). The machine-discovery index (`GET <publicOrigin>/api/bongos`, ADR 0114) advertises the current + supported contract versions. `/docs` states the version. `api-prefix.js` grows the version constant so the whole surface reads it from one chokepoint (the R06 implementation).
36
+
37
+ ## Consequences
38
+
39
+ - A self-hoster or external program pins `…/v1/…` and is guaranteed a stable contract for ≥ 180 days past any successor; unversioned/legacy callers never break at all.
40
+ - Day one is a no-op for every existing consumer: R06 mounts the current surface at `/v1` and aliases the unversioned paths into it, so nothing changes behaviourally — the version just becomes *nameable*.
41
+ - Shipping a breaking change is now a deliberate, expensive, announced act (a new `/vN` + a deprecation clock), not an accident — which is the whole point.
42
+ - The contract/package split means routine releases (bug fixes, new endpoints) never churn the version a caller pinned.
43
+
44
+ ## Rejected
45
+
46
+ - **Header-based versioning (`Accept: application/vnd.bongos.v1+json`).** Invisible in a URL, harder to `curl`, easy to forget → callers silently get the default. A path segment is self-evident and cache-friendly. (The AI-agent + self-hoster audience copies URLs, not header incantations.)
47
+ - **Per-endpoint / semver-in-path versioning (`/v1.2.3/`).** Too fine-grained; callers would chase patch versions. Whole-surface majors match how the contract actually breaks.
48
+ - **No version, "just don't break it."** The status quo — which is exactly the problem: no signal, no window, no way to pin.
49
+ - **Sunsetting the unversioned alias too.** Would break un-updatable shipped binaries; the permanent-alias precedent (`api-prefix.js`) is deliberate and kept.
50
+ - **Reusing `info.version` (package semver) as the API version.** Conflates software build with contract; every release would look like a version change.
@@ -0,0 +1,47 @@
1
+ # ADR 0118 — API contract source-of-truth: code-first, schema-as-data
2
+
3
+ **Date:** 2026-07-04
4
+ **Status:** Accepted (spike; R07 of goal 36).
5
+ **Context:** [task 1994](https://builders.example.com#/task/1994) (BONGOS-V1, goal 36, criteria `api-client-sdk` + `api-validation`). The spike that shapes the SDK (R08–R10) and validation (R11–R12): does the OpenAPI spec become the **source** (schema-first — author schemas, generate routes + validation + client), or stay **generated from code** (code-first) with codegen layered on? Builds on the self-describing OpenAPI generator ([ADR 0109](<redacted>.md), `scripts/gds/gen-api-docs.js`) and the error envelope ([ADR 0116](<redacted>.md)).
6
+
7
+ ## What exists today
8
+
9
+ `gen-api-docs.js` (ADR 0109) already generates the OpenAPI spec **from the route source**: it walks each `router.METHOD('/path', …)` in `src/gds/routes/` + `modules/*/routes/`, reads the `// rank:` comment for auth, and calls `extractBody()` — which finds the handler's `validateOrRespond(req, res, {schema})` / `validate(req.body, {schema})` call and pulls the schema's top-level **field names**. Measured on the live surface: **212 endpoints; 76 write ops carry a requestBody, 24 do not; `components.schemas` is empty.** So the spec is real and code-derived, but **shallow** — field names, not types/required/enums.
10
+
11
+ The crucial observation: the per-route **`validate()` schema object is already structured data** (`_helpers.js` — each field rule carries `type`, `required`, `maxLength`, `minLength`, `min`/`max`, `enum`, `itemsType`, `maxItems`). It already drives runtime validation. It is *right there in the code*, richer than what the spec currently emits.
12
+
13
+ ## Decision
14
+
15
+ **Stay code-first. The per-route `validate()` schema object is the single structured source of truth**; the spec, runtime validation, and the typed client are all *derived* from it — none is hand-authored.
16
+
17
+ 1. **Enrich the generator, don't invert the flow.** Extend `gen-api-docs.js` so `extractBody()` emits the FULL rule set (types, `required`, `enum`, length/range caps) from the `validate()` schema into typed OpenAPI request schemas (and named `components.schemas`), instead of only field names. This closes the 24 undocumented bodies and upgrades the 76 shallow ones to typed schemas — for free, from data that already exists.
18
+ 2. **One schema, three consumers.** That same `validate()` schema object:
19
+ - **generates** the OpenAPI request schema (this ADR's enrichment),
20
+ - **enforces** the request at runtime (it already does — R11 hardens it to reject unknown fields + cover query params),
21
+ - **types** the generated client (R08, emitted from the enriched spec).
22
+ So "single source of truth" is achieved *within* code-first — the code IS the schema, and everything downstream is generated. No drift, because there is only one authored artifact.
23
+ 3. **Generate the client from the spec (R08), don't hand-write it.** Once the spec carries typed schemas, a generator (a small in-house emitter, or `openapi-typescript`-class tooling kept to a dev-dependency — cheapest-viable, ADR §4 cost DNA) produces the typed client. The client is a build artifact, never edited by hand.
24
+
25
+ ## Why not schema-first
26
+
27
+ Schema-first (author OpenAPI/JSON-Schema, generate the route layer + validators + client from it) would mean **rewriting the entire mature 212-endpoint route layer** to be schema-driven, replacing hand-written Express handlers with a schema-bound framework. That is an enormous, high-risk rewrite that throws away a working generator (ADR 0109) to buy a "single source" we can get far more cheaply by treating the existing in-code schema as the source. The AI-first build model (many small claimed tasks against a live API) strongly favours the incremental, low-blast-radius path.
28
+
29
+ ## Refinement of R08–R12 (the spike's sub-task output)
30
+
31
+ - **R08 (typed client, [#1995](https://builders.example.com#/task/1995)):** (a) enrich `gen-api-docs.js` to emit typed request/response schemas + `components.schemas` from the `validate()` rules; (b) generate a typed client from the enriched spec; (c) publish as an internal package first.
32
+ - **R09 (migrate callers, [#1996](https://builders.example.com#/task/1996)):** move the CLI (`cli-lib.apiCall`), the devbox app, and the web UIs onto the client; delete the duplicates. **This is also where the R04 fallout is repaired** — callers that read `data.error` as a string move to the client's typed envelope handling (`error.code`).
33
+ - **R10 (external on-ramp, [#1997](https://builders.example.com#/task/1997)):** document token acquisition + a runnable hello-world against the published client.
34
+ - **R11 (validation, [#1998](https://builders.example.com#/task/1998)):** harden `validate()` to reject unknown/typo'd fields and cover query params, driven by the same per-route schema the spec advertises; failures return the ADR-0116 envelope (`validation_failed` + `details`).
35
+ - **R12 (build check, [#1999](https://builders.example.com#/task/1999)):** a fitness check failing the build when a write route has no spec-bound `validate()` schema (locks the 100% coverage).
36
+
37
+ ## Consequences
38
+
39
+ - The SDK + validation work becomes incremental enrichment of an existing generator, not a rewrite.
40
+ - The `validate()` schema gains a second payoff (it types the spec + client), which incentivises writing it — reinforcing R11/R12's coverage goal.
41
+ - The spec stays honest by construction (generated at ship, ADR 0109), so the client + docs can never drift from the routes.
42
+
43
+ ## Rejected
44
+
45
+ - **Schema-first** — full route-layer rewrite; disproportionate to the goal.
46
+ - **Hand-maintained OpenAPI** — drifts from code (ADR 0109 already rejected this).
47
+ - **Swapping to a schema-native framework (Fastify/JSON-Schema, tRPC)** — far too invasive for a live 212-endpoint surface; a framework migration, not an API-hardening task.
@@ -0,0 +1,34 @@
1
+ # ADR 0119 — API pagination contract
2
+
3
+ **Date:** 2026-07-04
4
+ **Status:** Accepted (contract; R13 of goal 36).
5
+ **Context:** [task 2000](https://builders.example.com#/task/2000) (BONGOS-V1, goal 36, criterion `api-pagination`). The contract; the sweep that adopts it across every list endpoint + caps the currently-unbounded public lists is R14 ([task 2001](https://builders.example.com#/task/2001)).
6
+
7
+ ## Problem
8
+
9
+ Three pagination styles coexist across the API: `limit`-only, `limit`+`offset`, and none. Some public lists (leaderboard, blockers, versions) return **everything** — an unbounded result set that grows with the project and is a cost/DoS amplification target on the unauthenticated `/public/*` surface. A caller cannot page any two endpoints the same way, and cannot assume a list is bounded.
10
+
11
+ ## Decision
12
+
13
+ **One convention: `?limit=&offset=` (limit/offset), served through one shared helper.**
14
+
15
+ - **`limit`** — positive integer; default **50**, hard cap **200** (`PAGINATION.DEFAULT_LIMIT` / `MAX_LIMIT`). A value over the cap is clamped to the cap, so **no list can return an unbounded set**.
16
+ - **`offset`** — non-negative integer; default **0**.
17
+ - **Clamp, never reject.** A bad/absent/oversized value is coerced to a sane default (a list read stays forgiving — a typo'd `limit` returns the first page, not a 400). This is deliberately looser than write-body validation (R11), which rejects.
18
+ - **Shared helper** — `parsePagination(req, { defaultLimit, maxLimit })` in `src/gds/routes/_helpers.js` returns `{ limit, offset }`. Per-endpoint caps are expressible via `maxLimit` (e.g. a heavy aggregate can cap lower).
19
+ - **Response convention** — a paginated list returns `{ items: [...], page: { limit, offset, total? } }`; `pageMeta(limit, offset, total?)` builds the `page` block. `total` is optional (some lists can't cheaply count); when present a caller derives "more pages" via `offset + items.length < total`.
20
+
21
+ **Why limit/offset, not cursor.** Limit/offset is the style already in use (the `?limit=`/`?offset=` reads today), needs no opaque-token or stable-sort infrastructure, and is trivial for an external caller or a `curl` to construct. Cursor pagination is stronger under high write-churn (no skipped/duplicated rows across pages), but this API's lists are modest and mostly append/status-updated; the cursor machinery is not worth its cost here. If a specific hot, churning list ever needs it, cursor can be added for that endpoint without changing this default.
22
+
23
+ ## Consequences
24
+
25
+ - Adopting the helper (R14) makes every list page identically and caps the unbounded public lists (leaderboard/blockers/versions) — closing the cost/DoS surface.
26
+ - **Opt-in + non-breaking today:** adding the helper + `pageMeta` changes no response until a route calls them. R14 does the adoption; the currently-unbounded lists gain a default page (a behaviour change scoped to R14, announced there).
27
+ - The OpenAPI spec (R08 enrichment) advertises `limit`/`offset` query params + the `page` response block as the standard, so the generated client + docs teach one paging model.
28
+
29
+ ## Rejected
30
+
31
+ - **Cursor/keyset pagination as the default** — more robust under churn but needs opaque cursors + a stable sort key per endpoint; disproportionate for these list sizes. Left as a per-endpoint escape hatch.
32
+ - **Page-number pagination (`?page=&per_page=`)** — same expressiveness as offset but an extra mental step (page→offset) and awkward when the page size changes mid-scroll.
33
+ - **Leaving lists unbounded** — the status quo; the exact cost/DoS problem the criterion exists to close.
34
+ - **Rejecting a bad `limit` with a 400** — a list read should be forgiving; clamping is friendlier and keeps a typo from breaking a dashboard. (Write validation, R11, is the strict counterpart.)
@@ -0,0 +1,108 @@
1
+ # ADR 0120 — Pay drachmae on land (not on confirm) + a builder-owned rebase gate
2
+
3
+ **Date:** 2026-07-04
4
+ **Status:** Accepted
5
+ **Discipline:** engineer (GDS / economy + lifecycle)
6
+ **Task:** [#2035](https://example.com/builders#/task/2035) (BONGOS-V1)
7
+
8
+ ## Context — the problem
9
+
10
+ The per-task drachmae reward is awarded in **`confirmTask`** (`modules/lifecycle/db.js`,
11
+ `reward.insertMultipliedConfirmCredit`, `credit_log.reason = 'task.confirmed'`) — at the
12
+ `completed → confirmed` transition. Confirmed means *verified + credited*, but the code is
13
+ **not yet on `main`**: the merge to `main` + deploy is the later `confirmed → shipped`
14
+ transition, run by the auto-lander / `publish-reconciler`.
15
+
16
+ So a builder is paid the moment they declare done and pass verification — **before their
17
+ code lands.** When the branch then can't merge (stale after a big codebase change, a real
18
+ conflict, or never pushed at all), the task strands at `confirmed` indefinitely with **no
19
+ consequence to the builder**: they already have the drachmae, and nothing stops them
20
+ claiming new work while the stranded branch rots.
21
+
22
+ This is not hypothetical. On 2026-07-04 the confirmed queue held ~17 tasks across three
23
+ builders — several never pushed to the remote at all (the commits lived only on the
24
+ builder's machine), one 154 commits behind `main` across the `src/gds → src/bongos`
25
+ rename. Only the original builder can rebase their own stranded branch; but the incentive
26
+ structure gave them no reason to, and no one else *can*. The reward was decoupled from the
27
+ outcome we actually want (landed code).
28
+
29
+ ## Decision
30
+
31
+ Re-couple reward and queue-access to **landed code**, in four parts.
32
+
33
+ 1. **Pay on land, not on confirm.** Move BOTH reward writes from the `confirmed`
34
+ transition to the `shipped` (merged-to-`main`) transition:
35
+ - the per-task credit (`insertMultipliedConfirmCredit` + the idea-promotion bonus), and
36
+ - the cost-plus session-token reward ([ADR 0054](<redacted>.md)).
37
+
38
+ The award becomes idempotent on ship (`credit_log.reason = 'task.shipped'`, guarded by a
39
+ uniqueness check per task, mirroring today's confirm-time guard). **The happy path barely
40
+ changes:** a clean PR auto-merges within a minute or two of confirm, so the credit lands
41
+ almost immediately. The teeth only bite when a task strands — no landed code, no drachmae.
42
+
43
+ 2. **A stalled land becomes the builder's own chore (`needs_rebase`).** The
44
+ `publish-reconciler` already detects why a confirmed task won't land — `merge_conflict`,
45
+ a failing required check against current `main`, or no pushed branch. After the normal
46
+ auto-land grace (the reconciler's existing retries + the [ADR 0082](<redacted>.md)
47
+ generated-file self-heal) is exhausted, it flags the task `needs_rebase = true`, attributed
48
+ to the **claim holder** (the builder who did the work — the same attribution rule as
49
+ `confirmTask`, task 661). This is a signal, not a status change: the task stays `confirmed`
50
+ (its work is done), it is simply marked as awaiting *its builder's* rebase.
51
+
52
+ 3. **A `needs_rebase` task blocks that builder's NEW claims — not their existing ones.**
53
+ `claimTask` / `POST /claims` gains a precondition: refuse a **new** claim
54
+ (`409 { error: 'REBASE_REQUIRED' }`, naming the offending task(s)) when the builder has
55
+ any `needs_rebase` task. Their already-active claims still resolve/ship normally — we
56
+ don't freeze in-flight work, we only stop them taking on *more* while a landing chore is
57
+ outstanding. Since the reward is now contingent on landing (part 1), the builder is
58
+ motivated to clear it; since it gates their queue, they can't walk away from it.
59
+
60
+ 4. **One-time clawback + re-gate for the existing confirmed backlog.** A migration reverses
61
+ the `task.confirmed` credit deltas for every task currently at `status = 'confirmed'`
62
+ (a compensating negative `credit_log` row per task, `reason = 'task.confirmed_reversal'`,
63
+ so the `builders.total_credits` trigger rolls it back; achievements already unlocked are
64
+ left intact — reversing gamification is punitive and messy) and sets `needs_rebase = true`
65
+ on those tasks. This applies the new incentive to the work that stranded under the old
66
+ rule, rather than grandfathering it. It hits every affected builder, the owner included.
67
+
68
+ Together: **a builder's pay AND their ability to pick up new work both hinge on their code
69
+ being on `main`** — and the rebase after a big codebase change falls on the one person who
70
+ can do it.
71
+
72
+ ## Consequences
73
+
74
+ - **Good behavior is unaffected.** Clean work still auto-lands in minutes and pays out then;
75
+ most builders never see `needs_rebase` or the gate.
76
+ - **Stranding now has teeth.** No landed code → no drachmae, and a stalled land blocks new
77
+ claims until the builder rebases (or releases the task, forfeiting its reward).
78
+ - **The credit ledger tells the truth.** `credit_log` credits now correspond to code that is
79
+ actually on `main`, not to verified-but-unlanded branches.
80
+ - **Retroactive sting.** The clawback reverses already-shown drachmae for currently-stranded
81
+ tasks. This is intentional (it creates the pressure) and is applied uniformly, but it will
82
+ feel punitive to builders who were paid under the old rule. The reversal is fully re-earnable:
83
+ land the task and the `task.shipped` credit books.
84
+ - **A genuinely un-rebaseable task must have an exit.** A builder blocked by a task they
85
+ truly cannot land can `release` it (freeing it, forfeiting the reward) to unblock their
86
+ queue — so no one is ever permanently stuck.
87
+ - **New surfaces to keep honest.** `needs_rebase` is a new lifecycle signal the reconciler
88
+ writes and the claim gate + hall/CLI read; the reward-timing move touches the economy
89
+ `reward` port and the sessions reward path. All are covered by the seeded tasks' tests.
90
+
91
+ ## Alternatives considered
92
+
93
+ - **Keep paying at confirm, add only the gate.** Rejected: the reward is the strongest lever;
94
+ leaving it at confirm means a stranded task still paid out, so the builder's only cost is a
95
+ queue block they can dodge by releasing — weak alignment.
96
+ - **Soft gate (warn, don't block).** Rejected per the owner's call: a warning is ignorable and
97
+ stranded work kept accumulating exactly because nothing enforced it.
98
+ - **Grandfather the existing confirmed backlog.** Rejected per the owner's call: it would leave
99
+ the current stranded tasks paid-and-unblocked, precisely the state this ADR exists to end.
100
+ - **Only per-task credit waits for land; session reward stays at confirm.** Rejected per the
101
+ owner's call in favor of fullest alignment — nothing pays until the code is on `main`.
102
+
103
+ ## Implementation
104
+
105
+ Seeded as tasks under this ADR (dependencies noted): pay-on-land (economy + lifecycle) →
106
+ `needs_rebase` state + reconciler flag (lifecycle + migration) → claim gate (lifecycle/claims)
107
+ → clawback migration (depends on pay-on-land being live) → hall + `/builder-start` surfacing →
108
+ tests. See the [#2035](https://example.com/builders#/task/2035) dependency graph.
@@ -0,0 +1,97 @@
1
+ # ADR 0121 — Greenfield vs. brownfield onboarding: scope `bongos init --adopt` (adopt an existing repo)
2
+
3
+ - **Status:** Accepted (the split + the adopt-mode requirements are decided; the build is task-pending — see §Consequences for the seeded breakdown). **No adopt-mode code ships in this ADR — it is scope-only.**
4
+ - **Date:** 2026-07-04
5
+ - **Track:** internal (a portable Cloud Bongos platform capability)
6
+ - **Task:** [#1986](https://example.com/builders#/task/1986) (BONGOS-V1, goal 35 — *Project creation flow*, the `adopt-existing-repo` criterion) — "SCOPE what an adopt mode must do; deliver an ADR + a task breakdown. Do NOT build adopt-mode here."
7
+ - **Deciders:** Lars (Archon), Claude
8
+ - **Builds on:** [ADR 0108](<redacted>.md) (configurable-root / core-as-npm-dep — the "layer, don't clone" substrate), [ADR 0111](<redacted>.md) (the `provisioning` module + the greenfield `bongos init` → provisioning-request wiring), [ADR 0062](<redacted>.md) (core↔host instance model), [ADR 0100](<redacted>.md) (two-repo instance model), [ADR 0105](<redacted>.md) (instance seeds out of core migrations), [ADR 0016](<redacted>.md) (server-enforced trust boundary), [ADR 0083](<redacted>.md) + [ADR 0108](<redacted>.md) §5 (module system + cross-repo migration namespacing).
9
+ - **Raised while** abandoning task 1689 (2026-07-04): the standalone two-repo model is already proven by Emersonian Circles (task 1917), so the missing piece is not *"can core run standalone"* but *"how does an owner who **already has a repo** adopt it."*
10
+
11
+ ---
12
+
13
+ ## Context
14
+
15
+ Goal 35 ("Project creation flow") has two done-when criteria:
16
+
17
+ - **`project-creation-flow`** (greenfield) — a new owner goes zero-to-live on a fresh, empty project.
18
+ - **`adopt-existing-repo`** (brownfield) — an owner with an *existing* repository (app code, git history, a backlog) brings Cloud Bongos onto it.
19
+
20
+ **Today the flow is greenfield-only.** `scripts/gds/init.js`:
21
+
22
+ - opens with *"Let's stand up a new Cloud Bongos instance."* (`init.js:325`) — the mental model is a blank slate;
23
+ - **refuses to run where `config/branding.json` already exists** unless `--force`, and `--force` *overwrites* (`init.js:408–409`) — there is no "merge onto what's here" path;
24
+ - **seeds a synthetic first version** — default id `V1`, name `"V1 — Prove the loop"` (`init.js:341–342`) + starter/kickoff tasks — rather than reflecting the repo's real current version, goal, or backlog;
25
+ - **inspects nothing** about the existing tree: not its stack, not its layout, not its CI, not its migration numbering.
26
+
27
+ So an owner with a real repo has only two bad options today: run `init` in a throwaway directory and hand-merge, or `--force` and clobber their config. Neither is a guided flow, and neither preserves their real state. That is the gap `adopt-existing-repo` names — and the reason this ADR complements the greenfield criterion rather than replacing it.
28
+
29
+ ---
30
+
31
+ ## Decision
32
+
33
+ ### 1. Two explicit onboarding modes over one canonical step sequence
34
+
35
+ Goal 35's canonical runbook (task [#1981](https://example.com/builders#/task/1981)) is the source of truth for the *sequence*: name+address → init → scaffold → provision → OAuth app + verified secret + first sign-in → verify → brand. The runbook branches at **exactly one leg — scaffold** — into:
36
+
37
+ - **greenfield** (`bongos init`, today's behavior): scaffold a fresh standalone repo + a synthetic first version.
38
+ - **brownfield** (`bongos init --adopt`): **layer** onto the existing tree and reflect its real state.
39
+
40
+ Every other leg (provision, OAuth, verify, brand) is **identical** across the two modes. `--adopt` is a mode of the *same* `init`, not a separate command — so the CLI form (task [#1982](https://example.com/builders#/task/1982)) and the hall wizard form (task [#1983](https://example.com/builders#/task/1983)) inherit it for free.
41
+
42
+ ### 2. LAYER, never scaffold or clobber (the core requirement)
43
+
44
+ In `--adopt`, `init`:
45
+
46
+ - adds the pinned `@cloudbongos/core` dependency + `config/` overrides + `.claude/` **additively** onto the existing tree;
47
+ - for any file that already exists (an owner's `package.json`, a pre-existing `.claude/`, a CI workflow), it **merges or leaves-and-reports** — it **never overwrites**. The `--force`-overwrites code path is explicitly *not* reused;
48
+ - writes only the *lean* `config/branding.json` overrides ADR 0108 defines (the rest resolves from `*.neutral.json`), so the owner's existing files stay theirs.
49
+
50
+ ### 3. Reflect REAL state, not a synthetic V1
51
+
52
+ `--adopt`:
53
+
54
+ - does **not** seed `"V1 — Prove the loop"`; it captures (by interview + detection) the repo's actual current version/milestone and open goal;
55
+ - **imports the existing backlog** into GDS tasks — GitHub issues (via the GitHub auth the flow already establishes), a `TODO`/`ROADMAP`/`BACKLOG.md`, or an interview fallback — so the ledger starts truthful rather than empty.
56
+
57
+ ### 4. DETECT the existing stack + layout
58
+
59
+ Before writing anything, `--adopt` inspects the tree — language/runtime, package manager, test + CI setup, directory layout — so the enabled modules, the generated repo-map, and the **core↔host fitness boundary** (ADR 0062 §1) fit what is already there instead of assuming the reference layout.
60
+
61
+ ### 5. A CONFLICT PRE-FLIGHT report — the owner sees the blast radius before committing
62
+
63
+ `--adopt --dry-run` (the default first pass) produces a report covering at least:
64
+
65
+ - **migration namespace** — do the repo's existing migration numbers collide with core's namespace (ADR 0108 §5)?
66
+ - **the fitness boundary** — would adopting flag existing imports as core↔host violations (ADR 0062 §1)?
67
+ - **protected-path / rank gates** — which incoming files land on protected paths (ADR 0043)?
68
+ - **existing CI** — does core's expected `unit`/gate check collide with the repo's own workflows?
69
+
70
+ **Nothing is written until the owner accepts the pre-flight.** This accept-gate is the safety the greenfield path does not need (a blank slate cannot be clobbered).
71
+
72
+ ### 6. What `--adopt` does NOT change
73
+
74
+ The trust boundary (ADR 0016), the provisioning path (ADR 0111 — an adopted instance provisions exactly like a greenfield one), and the standalone composition model (ADR 0108) are all unchanged. Adopt is a *front door* onto the same substrate, not a new substrate.
75
+
76
+ ---
77
+
78
+ ## Alternatives considered
79
+
80
+ - **Extend `--force` to "merge."** Rejected — `--force` means *overwrite*; overloading it to sometimes-merge is a footgun on exactly the repos where a mistake is expensive. A distinct `--adopt` mode with a dry-run pre-flight is legible.
81
+ - **A separate `bongos adopt` command.** Rejected — it would duplicate the init/provision/verify legs and drift from them. Adopt is one branch of `init`'s *scaffold* leg; the CLI + hall forms then get it for free.
82
+ - **Auto-import everything (issues + TODOs + CI) with no pre-flight.** Rejected — brownfield repos are exactly where silent clobbering hurts most; the pre-flight + accept step is mandatory, not optional.
83
+ - **Build adopt-mode now.** Out of scope by the task's own charter — 1986 is scope-only. This ADR + the seeded breakdown *is* the deliverable.
84
+
85
+ ---
86
+
87
+ ## Consequences
88
+
89
+ - **`adopt-existing-repo` gets a concrete, buildable shape** — the criterion is no longer a one-line aspiration; it has a governing decision and a dependency-wired task breakdown.
90
+ - **The greenfield criterion is untouched** — today's `bongos init` *is* the greenfield mode; `--adopt` is purely additive to it.
91
+ - **Sequencing:** the adopt build depends on goal 35's canonical runbook (task 1981) existing, because `--adopt` is a branch of it; the detection + pre-flight pieces are independent and can start first.
92
+ - **Follow-up tasks seeded** under BONGOS-V1 / goal 35, linked to the `adopt-existing-repo` criterion (idempotent seeder `scripts/gds/seed-adopt-tasks.js`, `source_ref = BONGOS-V1-adopt-*`). Seeded as **`backlog`** — the owner schedules the adopt build deliberately; nothing auto-promotes:
93
+ 1. [#2042](https://example.com/builders#/task/2042) **`bongos init --adopt` skeleton + config layering** — add the mode; layer the `@cloudbongos/core` dep + lean `config/` + `.claude/` additively; merge-or-report on every pre-existing file; never overwrite. *(deps: none — the substrate is shipped)*
94
+ 2. [#2043](https://example.com/builders#/task/2043) **Stack + layout detection** — inspect runtime / package-manager / test / CI / layout; feed enabled modules + repo-map + the fitness boundary. *(deps: none)*
95
+ 3. [#2044](https://example.com/builders#/task/2044) **Real-state capture + backlog import** — replace the synthetic V1 with the repo's actual version/goal; import GitHub issues / TODO / roadmap into GDS tasks. *(deps: [#2042](https://example.com/builders#/task/2042))*
96
+ 4. [#2045](https://example.com/builders#/task/2045) **Conflict pre-flight report** — migration-namespace + fitness-boundary + protected-path + CI-collision report, `--dry-run` default, gated behind an accept step. *(deps: [#2042](https://example.com/builders#/task/2042), [#2043](https://example.com/builders#/task/2043))*
97
+ 5. [#2046](https://example.com/builders#/task/2046) **Wire `--adopt` into the canonical runbook + both forms** — the /new-project skill, `bongos onboard`, and the hall wizard offer greenfield-vs-adopt at the scaffold leg. *(deps: [#2042](https://example.com/builders#/task/2042), [#2044](https://example.com/builders#/task/2044), [#2045](https://example.com/builders#/task/2045), and goal-35 runbook task [#1981](https://example.com/builders#/task/1981))*
@@ -0,0 +1,43 @@
1
+ # ADR 0122 — Onboarding diagram renders: untracked + rendered at deploy from a host-provisioned Chrome
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-07-05
5
+ - **Track:** internal
6
+ - **Completes:** [ADR 0110](<redacted>.md) — the diagram half it explicitly **deferred** ("the diagrams need verified headless-Chromium handling"). This ADR records that verified handling and lands the untrack.
7
+ - **Builds on:** [ADR 0094](<redacted>.md) (gitignored artifact rebuilt at deploy), [ADR 0063](<redacted>.md) / [ADR 0062](<redacted>.md) §8 (the nav-doc generators ADR 0110 already migrated)
8
+ - **Task:** [#2027](https://example.com/builders#/task/2027) (consolidated the duplicate [#1928](https://example.com/builders#/task/1928))
9
+
10
+ ## Context
11
+
12
+ ADR 0110 moved the whole-file generated **navigation docs** (`docs/repo-map.md`, `docs/session-log-index.md`) off the git graph — gitignored, regenerated server-side at deploy — to kill the multi-builder branch-collision class. It **deferred the onboarding diagrams** (`docs/onboarding/diagrams/*.svg` + `*.png`) for one reason: unlike the pure-Node nav generators, rendering a Mermaid `.mmd` needs a **headless Chromium**, and `mermaid-cli` (via puppeteer) **downloads its own Chromium on first run** — a multi-minute network fetch that stalls/no-ops the $14/mo, 2 GB prod droplet. So the renders stayed tracked and committed on every render-capable ship, and kept colliding on parallel branches (the exact cost ADR 0110 set out to remove).
13
+
14
+ The blocker was never the untrack — it was proving a **reliable, non-downloading render on the actual deploy host**. That could not be verified from a credential-less dev box (puppeteer's browser download is blocked there too), so the work needed a deploy-host session.
15
+
16
+ ## Decision
17
+
18
+ Apply the ADR 0110 model to the diagram **renders**, with a host-provisioned browser instead of an on-deploy download:
19
+
20
+ 1. **Provision Chrome once on the host.** Install Google Chrome stable (`google-chrome-stable`, `apt` resolves all shared-lib deps on Ubuntu 24.04) on the prod droplet. It is the single persistent browser the render step reuses — no per-deploy download.
21
+ 2. **`render-diagrams.sh` prefers an installed browser.** It auto-detects `google-chrome-stable`/`chromium`/… (or honors `PUPPETEER_EXECUTABLE_PATH`), and when it finds one exports `PUPPETEER_SKIP_DOWNLOAD=1` so puppeteer **never** attempts the droplet-stalling fetch. With nothing installed (a dev laptop) it falls back to puppeteer's own download, unchanged. It passes a committed `puppeteer-config.json` carrying `--no-sandbox` (required for headless Chrome as the non-root deploy user on Ubuntu 24.04, whose restricted unprivileged user namespaces break Chrome's own sandbox), and pins `mermaid-cli@11`.
22
+ 3. **Render at deploy + at box-fetch.** `scripts/deploy/deploy-prod.sh` runs `render-diagrams.sh` (timeout-guarded, **LOUD `::ERROR::` on failure**, best-effort — never fails a deploy) right beside the ADR 0110 nav-doc generators; `infra/box-source-fetch.sh` does the same **guarded on a browser being present** (a box without Chrome skips instantly rather than stalling on a download — a box does not serve the diagrams page).
23
+ 4. **Untrack only the renders.** `git rm --cached` + `.gitignore` for `docs/onboarding/diagrams/*.svg` + `*.png`. The **`.mmd` sources + `assertions.json` stay tracked** — `git reset --hard` restores them and the render regenerates the images from them.
24
+ 5. **Ship stops producing/committing renders.** `ship.js`'s diagram regen runs `gen-diagrams.js --no-render` (sources only); the gitignored images never enter its `git add`.
25
+
26
+ ## Why this is safe — and never worse than before
27
+
28
+ - **No bot commits to `main`; the trust boundary is untouched** (ADR 0016/0043/0055). The renders are written as untracked files on the droplet after `git reset --hard`, exactly like the atlas and the ADR 0110 nav docs.
29
+ - **The backstop is unaffected.** The nightly `diagram-drift` cron reads `assertions.json` (still tracked), not the images — so untracking the renders cannot blind it.
30
+ - **Verified before landing.** Chrome + `mermaid-cli@11` was confirmed rendering all five `.mmd` (svg + png, incl. the ELK-layout `04-architecture`) on the prod droplet using the installed browser with no download — the verification ADR 0110 required.
31
+
32
+ ## Consequences
33
+
34
+ - The diagram-render branch-collision class is eliminated at the source; render-capable ships drop a bookkeeping commit.
35
+ - **Accepted staleness:** the served images are fresh only *after deploy* (or a box-fetch tick), not at merge — tolerant by nature for a human onboarding page; the LOUD `::ERROR::` is the alarm if a deploy render breaks, and the nightly drift cron is the belt-and-braces.
36
+ - **Operational coupling:** the prod droplet must keep Google Chrome installed. `deploy-prod.sh` is the hand-maintained `~/deploy.sh` mirror ([ADR 0042](<redacted>.md)/[0043](<redacted>.md)), so landing this requires an operator to (a) install Chrome (done) and (b) reinstall the updated `deploy.sh`. If Chrome is ever removed, the render step fails LOUD and the drift cron flags staleness — the page keeps its last-deployed images (no `git reset` wipes an untracked file that was just re-rendered) until the next successful deploy.
37
+ - **Fresh pristine checkout / core package:** a bare `git clone` that never deploys lacks the images (same accepted trade-off ADR 0110 notes for the nav docs). `docs/onboarding/diagrams/` is not in the core publish allowlist, so nothing changes for packaged core.
38
+
39
+ ## Alternatives considered
40
+
41
+ - **On-deploy `npx mermaid-cli` with its own Chromium download** — rejected: the multi-minute first-run fetch stalls the 2 GB droplet (the original ADR 0110 deferral reason).
42
+ - **Snap `chromium` on Ubuntu 24.04** — rejected: flaky/confined headless behavior on a server; the Chrome `.deb` gives a stable `/usr/bin` path with apt-resolved deps.
43
+ - **Keep the renders tracked, strengthen the ADR 0082 conflict resolver only** — rejected for the same reason ADR 0110 rejected it for the nav docs: it hides the collision rather than removing it, and the cost grows with parallelism.
@@ -0,0 +1,36 @@
1
+ # ADR 0123 — Idle-swept dev boxes lose uncommitted work: an on-box autosave-push, not a VM snapshot
2
+
3
+ - **Status:** Accepted (the approach + rejected alternatives are decided; the cron script + operator credential wiring are task-pending — see §Consequences for the seeded follow-up). **No autosave code ships in this ADR — it is a SPIKE.**
4
+ - **Date:** 2026-07-05
5
+ - **Track:** internal (dev-box lifecycle)
6
+ - **Task:** [#837](https://example.com/builders#/task/837) — "SPIKE: don't lose uncommitted work when a dev box is reclaimed (idle sweep deprovisions, no snapshot)."
7
+ - **Builds on:** [ADR 0031](<redacted>.md) (cloud dev environments), [ADR 0071](<redacted>.md) (confirm-before-destroyed + drift reconcile — the closest prior art; hardens droplet *truthfulness*, not data preservation), [ADR 0043](<redacted>.md) (git/SSH trust boundary — relevant because the fix widens a box credential's scope).
8
+
9
+ ## Problem
10
+
11
+ `scripts/gds/box.js` `cmdSweepIdle()` → `deprovisionOne()` deletes the droplet outright once `modules/dev-box/boxes.js` `selectIdleBoxes()` decides a box is idle (no heartbeat, no `claude_active`, past `BOX_IDLE_MINUTES`, default 10). **Nothing on this path looks at git status.** Park/snapshot was deliberately removed from the automated idle path (box.js:842-845 — snapshot storage cost with no benefit, since boxes are meant to be ephemeral). So today: idle sweep = hard droplet delete, and any uncommitted tracked work on `/workspace` is gone permanently, with no confirmation step and no way to recover it.
12
+
13
+ The heartbeat (`infra/box-heartbeat.sh`) that feeds the idle clock is a pure presence signal (SSH/ttyd connection + CPU load) — it has no concept of a dirty working tree. A builder who steps away mid-edit with real uncommitted changes and no active connection gets swept exactly like a builder who is genuinely done.
14
+
15
+ No existing ADR, blocker, or backlog entry addresses this — ADR 0071 explicitly treats the droplet as disposable and is scoped to infra-state correctness, not data preservation. `sweep-dormant` (parked boxes) is not the acute case: a parked box already has a snapshot from the manual `park` path, so its reclaim destroys a *backup copy*, not live work. The acute path is specifically **active → destroyed** via the idle sweep.
16
+
17
+ ## Decision
18
+
19
+ **<redacted> from the box, not a VM/droplet snapshot.** Add an on-box cron (sibling to `box-heartbeat.sh`, similar ~5-minute cadence) that, when `/workspace`'s git tree is dirty, commits the tracked changes and pushes them to the box's own claim branch (the `claude/<name>` branch a claimed task already works in per ADR 0097). This bounds data loss to "since the last autosave tick" (~5 min) instead of "since session start," using infrastructure that already exists for a different purpose:
20
+
21
+ - **Auth pattern is proven.** `infra/box-source-fetch.sh` already does one-shot-credentialed-push semantics for *fetch*: `git remote set-url origin "$AUTH_URL"` → git op → `git remote set-url origin "$REPO_URL"` (credential never persisted in `.git/config`). The autosave cron reuses the identical pattern for a *push*.
22
+ - **Credential scope must widen.** `GET /box/source-access` (`modules/dev-box/routes/box.js:422`) mints a scope-appropriate token via `box-credential.js`, but the token today is only ever used to clone/fetch. Whether the operator-configured `BOX_SOURCE_FULL_TOKEN` already carries push scope is unknown from code — it's an operator-supplied env value (`box-credential.js:46-65`). **This is the one real open dependency**: either confirm the existing token already has push scope, or mint a second, push-scoped credential. Because this is a trust-boundary-relevant change (a box gains the ability to write to `origin`, not just read it), the follow-up task must treat it with the same care as ADR 0043 — scoped to the box's own `claude/<name>` branch only (never `main`), audited via the existing `source_grant`/new `autosave_push` event on `box_events`, and gated to the same rank floor that already gates source access.
23
+ - **Explicit non-goals.** Gitignored/untracked local-only state (`.env.local`, other per-worktree secrets) is NOT covered — those are meant to be regenerated via `/builder-setup`/`/builder-key`, not preserved. This fix is scoped to tracked-file work loss only.
24
+
25
+ ## Alternatives considered
26
+
27
+ - **Reintroduce snapshot-before-destroy on the idle path (bring back `park`'s snapshot).** Rejected: this is the exact cost (~$0.30/mo per idle box × fleet size, plus snapshot-restore latency on next wake) the team deliberately removed from the automated path. It also doesn't actually solve the problem faster than a commit — a snapshot still requires the operator (or the builder) to notice and restore it; a pushed branch is immediately visible and diffable from any machine.
28
+ - **Control-plane git-status check before sweep (abort deprovision if `/workspace` is dirty).** Rejected: requires giving the control plane a NEW capability (SSH/exec into the box to read git state) that doesn't exist today, and a builder who simply forgets to commit for days would pin their box active-forever, defeating the idle sweep's entire cost-saving purpose. An autosave-push needs no new control-plane capability — it's entirely box-side, symmetric with the existing heartbeat/source-fetch crons.
29
+ - **Rely on the manual `/builder-end` git-dirty check alone.** Rejected as the sole mitigation: it already exists (`builder-end` refuses to tear down a dirty worktree) but only fires when a builder explicitly signs off. It has zero relationship to the automatic idle sweep, which is precisely the unguarded path this spike is about.
30
+
31
+ ## Consequences
32
+
33
+ - Bounds — doesn't eliminate — the loss window to the autosave interval; a crash or sweep in the seconds between an edit and the next tick can still lose that slice. Full elimination would need a snapshot (rejected above) or a live pre-sweep check (rejected above); this is the accepted trade-off.
34
+ - Autosaved commits land on the SAME `claude/<name>` claim branch (not a separate `autosave/*` branch), so they show up as ordinary WIP commits a builder squashes/amends before shipping — no new branch-namespace or `/builder-ship` special-casing needed.
35
+ - Needs an operator credential decision (push-scope token) before the cron can be built — flagged as the seeded follow-up task's first step, not assumed solved here.
36
+ - No code ships from this ADR. Seeded follow-up: implement `infra/box-autosave.sh` (dirty-check + one-shot-credentialed commit+push, mirroring `box-source-fetch.sh`'s credential-scrub pattern) + the operator-side push-credential decision + wiring it into cloud-init alongside the existing heartbeat cron.
@@ -0,0 +1,37 @@
1
+ # ADR 0124 — Typed API response bodies (infer the success shape from `res.json`)
2
+
3
+ **Date:** 2026-07-05
4
+ **Status:** Accepted (follow-up to [ADR 0118](<redacted>.md); goal 36 `api-client-sdk`).
5
+ **Context:** [task 2061](https://builders.example.com#/task/2061) (BONGOS-V1), promoted from idea 519. [ADR 0118](<redacted>.md) / task 2050 typed every **request** body field-level from each route's `validate()` schema. Success **responses** stayed the `ApiResponse` (`= any`) alias: routes declare no response schema, so the generator had nothing to type them from — a caller got zero autocomplete or safety on what a call returns.
6
+
7
+ ## Problem
8
+
9
+ The generated client (`clients/bongos-client`) is the one true way to call the API (goal 36). Its request bodies are typed, but every method returned `Promise<any>` (aliased `ApiResponse`). So `const { task } = await api.tasks.getTasks()` had no idea `task` was wrong (the field is `tasks`), and a paginated call's `page` block was untyped. The "typed client" was only half typed.
10
+
11
+ ## Decision
12
+
13
+ **Infer the success shape statically from each route's inline `res.json({ … })` object literal** — do not add a parallel per-route response-schema declaration.
14
+
15
+ - `gen-api-docs.js` scans a route's handler window for success (`2xx`) `res.json(…)` / `res.status(2xx).json(…)` calls (reusing the `captureBalanced` / `splitTopLevel` / `splitKeyValue` machinery the request extractor already uses — it **never executes** a route). The top-level keys of the object literal become a `<OperationId>Response` component in `components.schemas`, attached to the `200` response's `content`.
16
+ - **Only keys are provable.** A property's value is usually a variable, so it types as `unknown` — the *shape* (which keys exist) is the win. Two values type with confidence: a **boolean literal** (`ok: true`), and the ADR-0119 `pageMeta(…)` `page` block → a shared **`PageInfo`** component.
17
+ - `gen-api-client.js` types the method return as `Promise<<OperationId>Response>`; the component renders as a TS interface automatically (same path as request schemas). A route with no provable shape keeps `Promise<ApiResponse>`.
18
+
19
+ **Degrade-gracefully contract — never emit a shape we cannot prove.** A route whose success body is a **bare value** (`res.json(row)`), contains a **top-level spread** (`{ …rest }`), an **empty** `{}`, or a **computed/quoted key** keeps the `ApiResponse` alias. We only ever *narrow* `any`; we never assert a wrong or partial-looking-complete shape. Branches within one handler are merged: a key present in every branch is required, others optional; a value schema is kept only where all branches agree.
20
+
21
+ ## Why not a per-route `responseSchema` export (idea 519 option a)
22
+
23
+ ADR 0118 is **code-first**: the contract is read from what the route already does, not from a second declaration that can drift. The `res.json({ … })` literal *is* the response shape — adding a `responseSchema` export beside it would (a) duplicate that truth, (b) require touching 200+ route files for a one-time win, and (c) reintroduce exactly the drift the generator exists to kill. Reading the literal keeps a single source of truth and covers the whole surface for free.
24
+
25
+ ## Consequences
26
+
27
+ - **162 of 221 endpoints** now return a concrete `<…>Response` interface; the remaining ~59 (bare values, spreads) safely stay `ApiResponse`. A representative, majority slice of the API is now typed end-to-end.
28
+ - **No runtime change.** Only `docs/api/openapi.json` and `clients/bongos-client/index.d.ts` change — the client's runtime JS (`index.mjs/.cjs/.global.js`) is untouched (return types are a `.d.ts`-only concern), so the devbox-vendored CJS stays byte-identical.
29
+ - Correctness is bounded: a value typed `unknown` forces a cast at the call site (honest — we don't know it); a missing route type is `any` (no worse than before). The generator can never over-claim a shape.
30
+ - Enforced by both generators' `--check` gate + `tests/api_docs.mjs` (the pure extractors + spec facts) and `tests/api_client.mjs` (the emitted `.d.ts`).
31
+
32
+ ## Rejected
33
+
34
+ - **Per-route `responseSchema` export / `res.json` hint comment** — drift + churn; see above.
35
+ - **Executing routes / a running server to observe real responses** — breaks the generator's zero-execution, DB-free, deterministic contract (ADR 0118).
36
+ - **Typing every value by tracing the variable** — would need real data-flow analysis; brittle and far past the static line/regex extractor's remit. Keys + the two safe value cases capture the value at a fraction of the risk.
37
+ - **`additionalProperties: false` on response components** — omitted; since we degrade on spreads, the inferred shape is trusted, but leaving responses open avoids a false compile error if a handler branch we didn't parse adds a key.
@@ -0,0 +1,36 @@
1
+ # ADR 0125 — The control plane scaffolds + pushes a standalone instance's repo
2
+
3
+ **Date:** 2026-07-05
4
+ **Status:** Accepted (implements goal 35's `project-creation-flow` criterion; builds on [ADR 0108](<redacted>.md) + [ADR 0111](<redacted>.md)).
5
+ **Context:** [task 2055](https://builders.example.com#/task/2055) (BONGOS-V1) — greenfield onboarding gap 3/4, found in the 2026-07-05 end-to-end standup attempt (task 2052).
6
+
7
+ ## Problem
8
+
9
+ The greenfield "one guided flow" (`bongos init` → provision → OAuth → verify) had a **manual dead-end** between init and provision. `scripts/gds/provision.js` assumed a standalone instance's repo was **already cloned** at `/srv/cloudbongos/<slug>` and **threw** ("standalone instance repo not found … clone … first") otherwise. So an owner who requested an instance (`POST /api/bongos/provisioning/instances`) had to SSH the control plane and hand-clone + hand-scaffold the repo — there was no automation to turn an *empty* GitHub repo into an *installable* Cloud Bongos instance.
10
+
11
+ ## Decision
12
+
13
+ **The control-plane provisioning runner scaffolds the instance's own repo itself, then commits + pushes it** — replacing the throw with a `scaffoldStandaloneRepo()` leg that runs before the existing code-sync/db/service steps:
14
+
15
+ 1. **clone** the (empty) `target_ref` → `/srv/cloudbongos/<slug>`, forcing the initial branch to `main` (an empty clone has an unborn HEAD).
16
+ 2. **build** the installable `@cloudbongos/core` tarball from the control-plane checkout (`package-core.js`).
17
+ 3. **materialize** `config/` + `.claude/` + a `file:`-pinned `package.json` + `package-lock.json` via `bongos init --vendor-core` (the [task 2053](https://builders.example.com#/task/2053) primitive), `--no-seed` (the instance's own DB is seeded by `migrate`, not here).
18
+ 4. **commit + push** to the instance's `main` (with a `node_modules`-excluding `.gitignore`; the vendored tarball + lockfile stay tracked so `npm ci` resolves the pinned core).
19
+
20
+ It is **idempotent** (skips once the repo carries a `package.json`) and **dry-run-safe** (every mutation goes through the injected `exec`/`writeFile`).
21
+
22
+ **Git transport = the existing SSH deploy alias.** The clone/push use `git@<alias>:<owner>/<repo>.git` (default alias `github-deploy`, overridable via `PROVISION_GIT_SSH_ALIAS`) — the **same** transport the control-plane checkout already uses for the platform repo. No secret is interpolated into a command (SSH-key auth), so nothing leaks into journald.
23
+
24
+ **Operational prerequisite (the one manual grant):** the control plane's deploy public key (`~/.ssh/github_deploy.pub`) must have **write** access to each instance repo. GitHub deploy keys are per-repo, so standing up a new instance requires the owner to add that key (write) to the new repo — a one-time browser step alongside "create the empty repo," mirroring how the platform repo's deploy key is registered.
25
+
26
+ ## Consequences
27
+
28
+ - **`deploy-instance.sh` already existed** at `scripts/deploy/deploy-instance.sh` (added by [ADR 0108](<redacted>.md) §4 / task 1884 — the task-2055 description predated it). It is the *ongoing* consumer deploy (git pull → `npm ci` → three-root migrate → restart), installed as an instance's own `~/deploy.sh`; the provisioner does the *first-time* standup inline. No duplicate at `infra/` was created.
29
+ - A fresh empty GitHub repo now goes from "requested" to "installable + bootable" with **no manual clone/scaffold** — closing the init→provision dead-end.
30
+ - The control plane gains a new responsibility (pushing to owner repos). Bounded by the per-repo deploy-key grant above.
31
+
32
+ ## Rejected alternatives
33
+
34
+ - **A control-plane GitHub PAT / App token over HTTPS.** More scalable than per-repo deploy keys, but (a) embedding a token in a `git` URL risks leaking it into journald / process args, requiring a credential-helper dance, and (b) it introduces a new broad-scoped secret class on the control plane. Deferred — the SSH-alias reuse ships zero new secret machinery. A **GitHub App** (per-repo installation tokens, no long-lived secret) is the scalable end-state and is the natural follow-up when instance count grows.
35
+ - **Keep the "clone it yourself first" throw.** That *is* the manual dead-end this task exists to remove.
36
+ - **Scaffold from a template repo (fork).** Adds a template-repo to maintain + a fork step; `bongos init --vendor-core` already produces the exact tree from the live core, single-source.