@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,209 @@
1
+ # ADR 0096 — Require a `credits_reward` (drachmae) value before a task is workable
2
+
3
+ **Date:** 2026-06-28
4
+ **Status:** Accepted
5
+ **Track:** `internal` (GDS / economy + lifecycle)
6
+ **Task:** [#1670](https://example.com/builders#/task/1670) (GDS-V4)
7
+
8
+ ## Context — the problem
9
+
10
+ Every task carries a `credits_reward` integer — the in-world drachmae payout when it
11
+ ships ([ADR 0023](<redacted>.md), [ADR 0054](<redacted>.md)).
12
+ That column was created with `NOT NULL DEFAULT 0` (migration `003_pms.sql`). Nothing in
13
+ the lifecycle ever required it to be set, so the default path was:
14
+
15
+ > create a task (reward = 0) → promote it to `ready` → claim → ship → **pay 0 drachmae**.
16
+
17
+ A task could travel the whole claim→ship→credit pipeline paying nothing. The credit
18
+ ledger then records a real shipped task with a zero payout — the reward economy is
19
+ silently unfunded for every task whose author never set a value. At the time of this
20
+ change there were ~57 tasks sitting in `ready` with `credits_reward = 0`.
21
+
22
+ The fix is to make a present, positive reward a **precondition for a task becoming
23
+ workable** — without stranding any of the existing zero-reward work.
24
+
25
+ ## Decision — three enforcement points
26
+
27
+ The reward requirement is enforced at the two transitions that make a task *workable*,
28
+ plus the predicate that auto-promotes tasks:
29
+
30
+ 1. **Promote-to-ready (`POST /tasks/:id/promote`).** Refuses to flip a task to `ready`
31
+ when `credits_reward` is NULL or `<= 0`, returning `409 { error: 'REWARD_REQUIRED' }`
32
+ with an actionable message that *suggests* a value derived from `kind` + `est_minutes`
33
+ and names the `PATCH /tasks/:id` call to set it. (`modules/lifecycle/routes/tasks.js`.)
34
+
35
+ 2. **Auto-promote predicate (`task_is_fully_unblocked`, migration 177).** This SQL
36
+ predicate is the single condition shared by all three auto-promotion triggers
37
+ (`promote_dependents_on_ship` / `_criterion_satisfy` / `_goal_achieve`, migration 163).
38
+ It now requires `(reward_gate_exempt OR credits_reward > 0)` **in addition to** the
39
+ dependency-doneness check. A deps-shipped task with no reward therefore stays `backlog`
40
+ when its last dependency ships — it does not auto-promote until an author sets a reward.
41
+
42
+ 3. **Claim-time backstop (`db.claimTask`).** Refuses a claim on a 0/NULL-reward task with
43
+ the same `REWARD_REQUIRED` error (mapped to `409` in `modules/lifecycle/routes/claims.js`).
44
+ This catches the residual case where a row reached `ready` by some path other than the
45
+ promote route, or had its reward zeroed after promotion. It mirrors the existing
46
+ `DEPS_NOT_SHIPPED` claim backstop (second line of defence behind the promote gate).
47
+
48
+ All three resolve through one shared pure helper, `db.rewardGateError(task, { grandfathered })`,
49
+ so the route, the claim path, and the unit tests can never disagree (the
50
+ `deriveRequiredRank` / `highestRank` precedent).
51
+
52
+ ## Grandfathering — never strand existing work
53
+
54
+ The critical constraint: this change must **not** make any currently-claimable task
55
+ unclaimable, and must **not** retro-demote any `ready` task to `backlog`. We grandfather
56
+ explicitly with a dedicated flag rather than a fragile timestamp cutoff (`promoted_at` is
57
+ not reliably stamped — `updateTaskStatus` doesn't set it):
58
+
59
+ - Migration 177 adds `tasks.reward_gate_exempt boolean NOT NULL DEFAULT false` and sets it
60
+ `true` for **every task already at or past `ready`** (`status IN ('ready','active',
61
+ 'completed','confirmed','shipped')`). Those ~57 zero-reward `ready` tasks — and any
62
+ in-flight work — are permanently exempt: `rewardGateError` returns `null` for them, so
63
+ the claim backstop lets them through.
64
+ - **New** tasks default `reward_gate_exempt = false`, so the gate applies only to
65
+ transitions happening *after* this change.
66
+ - The predicate change is **forward-only by construction**: the auto-promotion triggers
67
+ fire on later ship/satisfy/achieve events and only ever flip `backlog → ready`. They
68
+ never re-evaluate a row already in `ready`, so no demotion can occur. (And the exempt
69
+ rows would pass the predicate's reward clause anyway.)
70
+
71
+ Net effect: existing claimable + in-flight work is untouched; the gate bites only on the
72
+ next promotion or claim of an unrewarded task.
73
+
74
+ ## Anti-gaming — the reward stays author-set
75
+
76
+ [ADR 0023](<redacted>.md) makes `credits_reward` an author-set,
77
+ review-gated value on purpose (auto-deriving it from `est_minutes` would be trivially
78
+ gameable — inflate the estimate, inflate the payout). This ADR preserves that stance:
79
+
80
+ - We do **not** auto-derive or auto-apply `credits_reward`. The refusal MAY *suggest* a
81
+ value (`suggestCreditsReward` — ~1 drachma per estimated minute, weighted by a coarse
82
+ per-kind factor, floored at 5), but a human must confirm it via `PATCH /tasks/:id`.
83
+ - Setting the reward is the existing `PATCH /tasks/:id` path — no new write surface. The
84
+ gate only requires the value to be *present and positive*, never that it match the
85
+ suggestion.
86
+
87
+ ## Coordination — backfilling the existing zero-reward tasks
88
+
89
+ The grandfathered ~57 tasks remain claimable at 0 reward by design (so we don't strand
90
+ them), but they still *should* be valued. That backfill is tracked separately as
91
+ **<redacted>** (task 1672) — it walks the grandfathered
92
+ zero-reward tasks and assigns each an author-set value. Once a task is backfilled to a
93
+ positive reward it no longer depends on its exempt flag to be claimable. The
94
+ `reward_gate_exempt` column can be retired in a later migration once the backfill is
95
+ complete and no zero-reward `ready` tasks remain.
96
+
97
+ ## Consequences
98
+
99
+ - No task created/promoted/claimed after this change can be worked while paying 0 drachmae.
100
+ - Existing `ready` + in-flight zero-reward tasks stay fully workable (grandfathered).
101
+ - The promote/claim refusals name the way forward (suggested value + the `PATCH` call),
102
+ matching the `TASK_NOT_READY` actionable-hint precedent ([#952](https://example.com/builders#/task/952)).
103
+ - One new column (`reward_gate_exempt`), one `CREATE OR REPLACE` of an existing predicate,
104
+ no data loss; the migration is idempotent and a clean no-op on replay.
105
+
106
+ ---
107
+
108
+ ## Amendment — 2026-06-28 (task [#1673](https://example.com/builders#/task/1673)): AUTO-ASSIGN at the gate, don't BLOCK
109
+
110
+ The original decision above made a missing reward **block** the two workable transitions
111
+ (promote returned `409 REWARD_REQUIRED`; the claim backstop threw the same). In practice
112
+ that turned a missing-value into a hard wall: a perfectly good task with a deps-met,
113
+ ready-to-work footprint could not be promoted or claimed until someone hand-set a value
114
+ first. That is friction the methodology doesn't want — the goal is "no task is worked for
115
+ 0 drachmae", not "stop work until a human types a number."
116
+
117
+ **The shift: the gate now AUTO-ASSIGNS a fair, capped value and PROCEEDS.**
118
+
119
+ - **Promote-to-ready (`POST /tasks/:id/promote`).** When `credits_reward` is 0/NULL it
120
+ assigns `suggestCreditsReward(task)` (persisted via `db.setCreditsReward`), then flips to
121
+ `ready` and returns `{ ok: true, assigned_credits_reward: N }`. No refusal. The shared
122
+ decision is `db.rewardGateAssignment(task)` (returns `{ assign: N }` or `null`).
123
+
124
+ - **Claim (`db.claimTask`).** Same — if 0/NULL at claim time it assigns the capped
125
+ suggestion **inside the existing `FOR UPDATE` transaction**, so the assignment and the
126
+ claim commit atomically, then proceeds. This also gives the ~27 grandfathered
127
+ `reward_gate_exempt` zero-reward tasks a real payout the moment they're claimed.
128
+
129
+ - **Auto-promote predicate (migration 178).** The reward clause migration 177 added to
130
+ `task_is_fully_unblocked` — `(reward_gate_exempt OR credits_reward > 0)` — is **reverted**:
131
+ the predicate returns to the migration-163 dependency-doneness check **only**. Auto-promotion
132
+ no longer blocks on reward, because claim-time auto-assign covers every task before any work
133
+ starts. A deps-shipped task auto-promotes `backlog → ready` even at 0 reward; it gets valued at claim.
134
+
135
+ - **`reward_gate_exempt` is now inert.** Nothing reads it anymore (the gate auto-assigns
136
+ regardless of the flag). The column is left in place; a later migration may drop it once the
137
+ task-1672 backfill is complete (same retirement plan as the original "Coordination" section).
138
+
139
+ ### Anti-gaming — the cap + the audit (this reverses ADR 0023's strict author-set stance, narrowly)
140
+
141
+ [ADR 0023](<redacted>.md) made `credits_reward` strictly
142
+ author-set precisely because auto-deriving it from `est_minutes` is gameable (inflate the
143
+ estimate → inflate the pay). Auto-assigning at the gate crosses that line — so two guards
144
+ contain the blast radius:
145
+
146
+ 1. **CAP.** `suggestCreditsReward` is capped at `REWARD_SUGGESTION_CAP = 60` drachmae. The
147
+ formula stays modest (~1 drachma/estimated-minute, weighted by a coarse per-kind factor,
148
+ floored at 5), and the cap bounds how far an inflated estimate can push the *auto-assigned*
149
+ value. Anyone who genuinely needs more sets `credits_reward` by hand via `PATCH /tasks/:id`
150
+ — the ADR 0023 author-set, review-gated path is untouched for explicit values.
151
+
152
+ 2. **AUDIT.** Every auto-assignment logs a `[reward-gate] AUTO-ASSIGN task N credits_reward
153
+ -> V` line (with the actor: `[promote]` or `[claim by builder B]`), and the `credits_reward`
154
+ change is itself visible on the task. The assignment is never silent.
155
+
156
+ 3. **The PRIMARY pay driver is unchanged and ungameable.** Builder earnings are driven by the
157
+ **cost-plus session reward** ([ADR 0054](<redacted>.md)) —
158
+ `round(true_cost_usd × 1.20)` per shipped session, derived from real token cost, not from
159
+ any author-set or auto-derived per-task number. The per-task `credits_reward` is a modest,
160
+ capped floor on top of that; capping it keeps the gameable lever small.
161
+
162
+ ### Net effect
163
+
164
+ No task is ever worked for 0 drachmae **and** no promote/claim is ever blocked for a missing
165
+ value. The friction is gone; the economy stays funded; the gameable surface is a capped,
166
+ audited floor sitting under the ungameable cost-plus primary reward.
167
+
168
+ ## Amendment — 2026-06-28 (task [#1677](https://example.com/builders#/task/1677)): assign at CREATION — the PRIMARY point; promote/claim is the BACKSTOP
169
+
170
+ The first amendment moved assignment to the two *workable* transitions (promote, claim). That
171
+ still left a window: a freshly **created** `backlog` task read `credits_reward = 0` until it was
172
+ later promoted or claimed. The owner's intent is stronger — **every task should carry a fair
173
+ drachmae value from the moment it is born**, so anyone reading the backlog sees real numbers, not
174
+ zeros waiting to be filled in.
175
+
176
+ **The shift: creation is now the PRIMARY assignment point; promote/claim becomes the backstop.**
177
+
178
+ - **`db.createTask` (the lowest create layer).** When the caller supplies no positive
179
+ `credits_reward` (null/undefined/0), `createTask` auto-assigns `suggestCreditsReward({ kind,
180
+ est_minutes })` — the same capped (`<= REWARD_SUGGESTION_CAP`) helper — **before the INSERT**, so
181
+ the row is born with a value. An explicitly-provided **positive** value is respected, never
182
+ overridden (the author-set path stays intact). Putting the default here means **every**
183
+ create-vector inherits creation-time assignment automatically: `POST /tasks`, idea-promotion,
184
+ newcomer-restock, the Discord `#bugs → task` flow, and any seed script — all call `createTask`.
185
+
186
+ - **`POST /tasks` route.** Its `credits_reward: body.credits_reward ?? 0` default flows a 0/absent
187
+ value into `createTask` as "unset" (so the creation default fires), and the `201` response now
188
+ surfaces the assigned `credits_reward` so the creator immediately sees the value the task was
189
+ born with.
190
+
191
+ - **Audit.** `createTask` logs `[reward-gate] AUTO-ASSIGN task N credits_reward -> V (cap …)
192
+ [creation]` on each creation-time fill; the visible `credits_reward` on the row is the other half
193
+ of the trail.
194
+
195
+ - **The promote/claim auto-assign (the first amendment) is KEPT as a BACKSTOP.** It now fires
196
+ rarely — new tasks already carry a value — but it still covers any legacy row created before this
197
+ change, or any edge path that somehow births a 0-reward task. Defence in depth: creation is the
198
+ primary point, promote/claim the safety net.
199
+
200
+ The **cap + anti-gaming reasoning is unchanged** — the same `REWARD_SUGGESTION_CAP` bounds the
201
+ auto-assigned floor, and the ungameable cost-plus session reward ([ADR 0054](<redacted>.md))
202
+ remains the **primary** pay driver. This per-task value stays a modest, capped, audited floor; it
203
+ just now lands at birth instead of at first-work.
204
+
205
+ ### Net effect (post-1677)
206
+
207
+ Every task is born with a fair, capped drachmae value. The backlog never shows a placeholder zero;
208
+ promote/claim no longer carries the assignment weight (it's a backstop); the economy stays funded
209
+ end-to-end with the same anti-gaming ceiling.
@@ -0,0 +1,46 @@
1
+ # ADR 0097 — One active claim per session + a claim binds to a dedicated worktree
2
+
3
+ **Date:** 2026-06-29
4
+ **Status:** Accepted
5
+ **Track:** `internal` (development system / lifecycle)
6
+ **Task:** [#1642](https://example.com/builders#/task/1642) (GDS-V4)
7
+ **Amends:** [ADR 0049](<redacted>.md) (the parallel-safety contract). 0049 fixed *cross-claim* parallel safety (two claims colliding); this adds the missing *within-session* invariant.
8
+
9
+ ## Context — the commingled-ship hole
10
+
11
+ ADR 0049 made cross-claim safety honest: `git merge` is the authoritative collision detector for interactive builders, and `uniq_active_claim_per_task` guarantees two sessions can't both claim the same task. But it left one invariant unstated, and a real failure mode followed from it.
12
+
13
+ A single Claude Code session works inside **one git worktree**, and that worktree owns **one branch**. If a builder claims a second task from the *same* worktree, both tasks' commits land on that one branch. `/builder-ship` publishes the whole branch — so shipping the first task drags the second task's (unfinished, ungraded) commits along with it. The ship is *commingled*: two tasks' work ride out under one task's ship, the grader reads a diff that mixes scopes, and the second task's ledger is now a lie.
14
+
15
+ The only pre-existing "one claim" guard was `gateNewcomerClaim`: **Xenos-only**, **builder-scoped**, and **fail-open**. It kept a brand-new builder focused, but did nothing for a Metic/Archon (or even a graduated Thetes) running two claims from one worktree, and it keyed on the builder, not the worktree — so it couldn't express "one claim *per worktree*" at all.
16
+
17
+ ## Decision
18
+
19
+ Two new rules, both at the lifecycle layer:
20
+
21
+ ### 1. One active claim per session
22
+
23
+ `POST /api/gds/claims` refuses a new claim when the **same `creator_session_id`** already holds an active claim, returning `409 session_already_has_active_claim` whose body names the in-flight task (`active_task_id` + `active_task_title`) and the remedy. This generalizes `gateNewcomerClaim` from Xenos-only to **all ranks** and from builder-scoped to **session-scoped**.
24
+
25
+ - **Session-scoped, NOT builder-scoped — the load-bearing choice.** A builder legitimately runs many sessions in parallel, each in its own worktree with its own single claim (the `feedback_parallel_sessions_not_anomaly` memory; one human builder, many sessions, is the *norm* at current scale). Keying on the builder would break that norm — it would cap a builder at one claim across all their worktrees. Keying on `creator_session_id` (already on the claim row, set per-CLI-session) caps each *worktree* at one claim, which is exactly the branch-isolation invariant we need and nothing more.
26
+ - **Fail-CLOSED.** Unlike `gateNewcomerClaim` (fail-open — onboarding plumbing must never brick a claim), this is a *correctness* guard against commingled ships. If the session-active-claim lookup throws, the route REFUSES (`409 session_claim_check_failed`) rather than silently allowing a second claim through. The deliberate asymmetry: a flaky onboarding read should not block work, but a flaky concurrency read must not let a commingling claim slip past.
27
+ - **NULL-session handling.** A web claim (`bind_session=false`, [#616](https://example.com/builders#/task/616)) stores `creator_session_id = NULL` and is adoptable by any of the builder's CLI sessions. The guard **skips NULL sessions**: an incoming NULL-session claim is allowed (there is nothing to scope to), and a pile of existing NULL-session web claims never counts against any CLI session (the DB lookup filters to the same non-null session, and the pure decision double-checks `creator_session_id != null`). So web-claim-then-ship-from-any-terminal keeps working untouched.
28
+ - **The decision is a pure, exported function.** `shouldRefuseSessionClaim({ activeClaimsForSession, creatorSessionId })` lives in `modules/lifecycle/routes/claims.js` and is unit-tested DB-free (`tests/one_active_claim_per_session.mjs`). The route middleware (`gateOneActiveClaimPerSession`) is thin: resolve the session, look up its active claims, call the pure fn, translate refuse→409.
29
+
30
+ ### 2. A claim binds to a dedicated worktree
31
+
32
+ The default claim flow (`.claude/skills/builder-claim/SKILL.md`) ensures the task runs in its **own** worktree (e.g. `EnterWorktree task-N`) so a builder never reuses a worktree that already owns a claim. This is the harness's job — the GDS cannot create worktrees — so it is enforced as skill guidance plus the server guard above: if the harness reuses a busy worktree, the server refusal is the backstop, and the documented remedy is a fresh worktree/session.
33
+
34
+ ### DB defence-in-depth
35
+
36
+ `migrations/<redacted>.sql` adds a **partial unique index** `uniq_active_claim_per_session ON claims (creator_session_id) WHERE released_at IS NULL AND creator_session_id IS NOT NULL`.
37
+
38
+ - **Predicate divergence from the task spec, on purpose.** The spec cited `WHERE status='active'`, but `claims` has **no `status` column** — "active" is the table's `released_at IS NULL` convention (the row's lifecycle status lives on `tasks`). The index uses the real column.
39
+ - **Migration safety.** A unique index *fails to create* if existing rows already violate it, which would block deploy. The migration first heals any current violation (keep the earliest active bound claim per session, close the rest — the same shape as migration 174), so the `CREATE` always succeeds; it is idempotent. The **app-layer guard is authoritative**; the index is belt-and-braces and must not break deploy.
40
+
41
+ ## Consequences
42
+
43
+ - A session can hold at most one active claim — commingled ships are structurally prevented, not just discouraged.
44
+ - The many-sessions-per-builder norm (ADR 0049's `feedback_parallel_sessions_not_anomaly`) is preserved exactly: each worktree/session still gets its own claim.
45
+ - Web claims (NULL session) are unaffected — claim-in-browser, ship-from-any-terminal still works.
46
+ - This composes with, and does not alter, ADR 0049's split cross-claim contract: the per-task index, the advisory `touches[]` warning, and the autonomous-runner footprint gate are all untouched. This ADR only adds the within-session invariant 0049 left implicit.
@@ -0,0 +1,124 @@
1
+ # ADR 0097 — Retroactive drachmae backfill for shipped 0-reward tasks
2
+
3
+ - **Date:** 2026-06-28
4
+ - **Status:** Accepted
5
+ - **Track:** `internal` (GDS / economy)
6
+ - **Task:** [#1672](https://example.com/builders#/task/1672)
7
+ - **Relates to:** [ADR 0023](<redacted>.md) (per-task kind multipliers), [ADR 0054](<redacted>.md) (cost-plus session reward)
8
+
9
+ ## Context — the gap
10
+
11
+ A task's `credits_reward` column **defaults to 0**. The per-task ship credit is
12
+ minted by `modules/economy/credits.js insertMultipliedConfirmCredit`, which
13
+ computes `applyKindMultiplier(credits_reward, kind)` — so a task that shipped
14
+ with `credits_reward = 0` (or NULL) paid `0 × multiplier = 0` drachmae. Many
15
+ early ships, and most dev-box / CI agent ships, never had a fair per-task reward
16
+ set, so the builders who did real, shipped work earned nothing for it on the
17
+ per-task stream.
18
+
19
+ There are **two reward streams** a builder accrues to `builders.total_credits`:
20
+
21
+ 1. **Per-task** — `reason='task.confirmed'`, the kind-multiplied `credits_reward`
22
+ ([ADR 0023](<redacted>.md)). This is the stream
23
+ that paid 0 for the affected tasks.
24
+ 2. **Cost-plus session** — `reason='session.token_reward'`,
25
+ `round(true_cost_usd × 1.20)` per shipped session ([ADR 0054](<redacted>.md)).
26
+ This was supposed to backstop the per-task gap, but it pays **~0 for dev-box /
27
+ CI agent ships**: those sessions upload no priced model usage, so
28
+ `priceModelUsage` returns ~$0 and the reward rounds to 0. So for exactly the
29
+ ships that missed the per-task reward, the cost-plus stream *also* paid nothing.
30
+
31
+ The net effect: a real backlog of shipped work that minted no drachmae for its
32
+ builders. This ADR records the decision (and the tool) to remediate that **once,
33
+ fairly, and safely** — with an Archon authorizing the amounts.
34
+
35
+ ## Decision
36
+
37
+ Ship a **one-time backfill SCRIPT** — `scripts/gds/backfill-task-rewards.js` —
38
+ that lets an Archon retroactively mint a fair, reviewed per-task reward for
39
+ shipped 0-reward tasks. The script is the deliverable; the **live run is a
40
+ separate, deliberate Archon action**, out of scope for the shipping session.
41
+
42
+ ### The two reward streams + the netting rule
43
+
44
+ Backfill must not **double-pay**. For each builder, the script:
45
+
46
+ 1. Computes the **would-be per-task total**: for each of that builder's shipped
47
+ 0-reward tasks, `applyKindMultiplier(reviewedRaw, kind).effective` — i.e. the
48
+ exact amount the per-task stream *would* have paid had a fair `credits_reward`
49
+ been set. The "reviewed raw" value is a per-task input from an Archon-reviewed
50
+ mapping (`--rewards <file.json>`), **not** an auto-formula from `estimate`
51
+ (re-deriving from `estimate` would just reproduce the un-reviewed numbers that
52
+ caused the gap).
53
+ 2. Sums what the **cost-plus stream already paid** that builder
54
+ (`SUM(delta) WHERE reason='session.token_reward'`).
55
+ 3. Mints only the **net**: `max(0, wouldBeTotal − costPlusAlreadyPaid)`. Floored
56
+ at 0 — if the cost-plus stream over-paid for some sessions, backfill never
57
+ claws back; it only ever **tops up** toward the fair task total.
58
+
59
+ The dry-run report shows, per builder: tasks, would-be per-task total, cost-plus
60
+ already paid, and the net to mint — so the Archon can **see whether the cost-plus
61
+ stream actually fired** (the audit confirms it pays ~0 for dev-box/CI ships) before
62
+ authorizing anything.
63
+
64
+ > **Why net at the builder level.** `session.token_reward` rows are session-level
65
+ > (`task_id` is NULL), so there is no clean per-task join back to a session reward.
66
+ > The honest audit question is "did the cost-plus stream already compensate this
67
+ > builder for the work these tasks represent" — a builder-level question — so the
68
+ > netting is builder-level.
69
+
70
+ ### Idempotency key
71
+
72
+ Every minted row is keyed on **`(task_id, reason='reward.backfill')`**. The apply
73
+ path SELECTs existing keys first (and re-checks inside the write transaction) and
74
+ skips any task already backfilled — so a re-run can never double-mint. This
75
+ mirrors the existing idempotency guards in `maybeAwardIdeaPromotionBonus`
76
+ (`(task_id, reason='idea_promotion_bonus')`) and `awardNetNegativeBonus`
77
+ (`(task_id, reason='ship.net_negative')`). The inline `description` records the
78
+ math (`"backfill: 40c × 1.2 = 48c (bug) [reward.backfill task #N]"`), matching the
79
+ self-describing convention of the other credit_log writers (migration 031).
80
+
81
+ ### Safety model — dry-run first, Archon-gated, never on import
82
+
83
+ - **Dry-run by default.** With no flags the script prints the full plan + grand
84
+ total and **writes nothing**. The whole reason a tool that mints currency is
85
+ safe to ship inert.
86
+ - **`--apply` requires ALL of:** the explicit `--apply` flag; an **Archon rank**
87
+ verified server-side via `GET /api/gds/me` (the script refuses for any other
88
+ rank — markdown/local edits cannot grant authority, [ADR 0016](<redacted>.md));
89
+ and an **interactive y/N confirmation** at the terminal.
90
+ - **Never acts on import/require.** All work is inside `main()`, gated on
91
+ `require.main === module`. Importing the file (the unit test does) touches no DB
92
+ and mints nothing.
93
+ - **Graceful with no DB.** On a builder box with no prod credentials, `--help`
94
+ and the dry-run report a clean message and exit non-zero — no stack trace, no
95
+ mint.
96
+ - **One transaction.** The apply path inserts all credit_log rows and updates
97
+ `builders.total_credits` in a single `BEGIN…COMMIT`, rolling back on any error.
98
+
99
+ ## NOT a migration
100
+
101
+ This is a **one-time, OTB-specific remediation**, deliberately **not** a
102
+ `migrations/` file. Migrations run on **every instance**, including
103
+ `cloudbongos.com` — and a fresh instance has no 0-reward backlog to fix. Putting
104
+ this in `migrations/` would re-run a currency-minting operation against every new
105
+ instance's empty ledger, which is exactly wrong. It lives under `scripts/gds/` as
106
+ an Archon-invoked tool, like the other backfill scripts (`backfill-cost.js`,
107
+ `backfill-sessions.js`).
108
+
109
+ ## Consequences
110
+
111
+ - An Archon can fairly compensate the 0-reward backlog with a reviewed,
112
+ netted, auditable, idempotent run.
113
+ - The fix is gated behind rank + interactive confirmation + dry-run-first, so it
114
+ cannot mint by accident or from a non-Archon machine.
115
+ - The **forward fix** (stop tasks shipping with `credits_reward = 0`) is a
116
+ separate concern — this ADR remediates the existing backlog only; it does not
117
+ change the default or the ship-time reward path.
118
+
119
+ ## Tests
120
+
121
+ `tests/backfill_task_rewards.mjs` unit-tests the **pure logic only** (no DB):
122
+ the idempotency-key construction, the kind-multiplied per-task would-be amounts
123
+ (reusing the real `applyKindMultiplier`), the cost-plus netting (floored at 0),
124
+ and the per-builder plan assembly (already-backfilled exclusion, 0-mapping skip).
@@ -0,0 +1,92 @@
1
+ # ADR 0098 — The Cloud Bongos public-mirror publish manifest (the R71 carve-out)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-30
5
+ - **Track:** internal
6
+ - **Task:** [#1210](https://example.com/builders#/task/1210) (V4.R71) — the publishable-subtree carve-out + the public mirror repo.
7
+ - **Builds on:** [ADR 0065](<redacted>.md) §4 (the AGPL decision + the prose publish boundary this task makes executable), [ADR 0062](<redacted>.md) §1 (the portable-core / host-instance / feature-module cut-line), [ADR 0043](<redacted>.md) (`PROTECTED_GLOBS`), [ADR 0058](<redacted>.md) (the gate-review "no allow-by-omission" doctrine this borrows).
8
+ - **Gates:** [#1211](https://example.com/builders#/task/1211) (R72 — the delayed export pipeline, which *consumes* this manifest) and [#1212](https://example.com/builders#/task/1212) (R73 — the lineage + no-leak proof, which *asserts against* it).
9
+ - **Referenced by:** [ADR 0108](<redacted>.md) §2 — `isPublishable()` stays the single definition of "the core," now read as "the core npm package's contents," not just the mirror/package-core tarball subtree.
10
+
11
+ ## Context
12
+
13
+ [ADR 0065](<redacted>.md) §4 defined the public-mirror boundary in **prose**: publish the portable methodology core + the platform + the neutral (customer-0) branding + sanitized docs; never publish secrets, instance identity literals, prod infra, or the customer-1 (Example) game/art content. That prose is the policy. But R72 (the generated, redacted, 6-month-delayed export) and R73 (the no-leak proof) need the boundary as an **executable, drift-proof artifact** — not a paragraph a future builder has to re-interpret per file.
14
+
15
+ The task instructs reusing the existing `PROTECTED_GLOBS` / `SENSITIVE_DOC_GLOBS` inventories. The catch: **those inventories are necessary but not sufficient, and `PROTECTED_GLOBS` is emphatically not a denylist.**
16
+
17
+ - `PROTECTED_GLOBS` (`src/bongos/permission-path-check.js`) is *write*-protection over the trust/pipeline/infra code. ADR 0065 §4 **publishes** most of it — the rank/permission machinery, the grader, and the ship pipeline **are** the open-source methodology. Only its *topology* subset (prod infra, deploy, CI, the local gate hooks) is excluded.
18
+ - `SENSITIVE_DOC_GLOBS` (`scripts/gds/search-ingest-md.js`) is *read*-gating; its security/audit corpus is excluded, but `docs/canonical-permissions.md` and the trust-boundary ADRs are methodology and publish (sanitized).
19
+ - Neither list mentions the **game, the art pipeline, or the instance's identity config** — which are the single largest exclusions, excluded for content/copyright/instance reasons, not trust reasons. (The art subtree additionally carries the 83 ripped Pokémon FireRed reference maps in `modules/art-pipeline/references/` — an independent, hard copyright reason never to ship it under an AGPL mirror.)
20
+
21
+ ## Decision
22
+
23
+ ### 1. One machine-readable manifest is the source of truth
24
+
25
+ The boundary is `scripts/gds/publish-manifest.js`, exporting `isPublishable(repoRelativePath) → boolean` (plus `partitionPaths`, the lists, and a `--list` CLI). R72 imports `isPublishable` to select what it exports; R73 asserts no path it forbids ever reached the mirror. The exact globs live **only** in that module — this ADR documents the *model* and *categories* so the two can't drift (the gen-repo-map pattern). Run `node scripts/gds/publish-manifest.js --list` to print the current boundary.
26
+
27
+ ### 2. Default-deny, two layers
28
+
29
+ ```
30
+ isPublishable(p) == matchesDeny(p) ? false : matchesAllow(p)
31
+ ```
32
+
33
+ The **allowlist is the primary gate**: a path in no allowlisted subtree is silently *not* published, so a new, unclassified surface never leaks by omission. The **denylist is a hard override applied first** (defense-in-depth): even a path inside an allowlisted subtree is dropped if denied — e.g. `scripts/` is broadly allowed but `scripts/deploy/` is denied and wins.
34
+
35
+ ### 3. Reuse the trust inventories; never re-type them
36
+
37
+ The manifest `require()`s `PROTECTED_GLOBS`, `HARD_FLOOR_GLOBS`, and `SENSITIVE_DOC_GLOBS` from their homes — never copies them (the gate-review.js "imported, never hand-retyped" rule). It **partitions** `PROTECTED_GLOBS` into a small `PROTECTED_TOPOLOGY_EXCLUDE` list (infra, deploy, CI, `.husky/`, the local `.claude/hooks/` + `.claude/settings.json`) versus the remainder, which publishes as the methodology core. `tests/publish_manifest.mjs` asserts the partition is consistent with the live inventory — every topology-exclude entry is a verbatim `PROTECTED_GLOB`, and every non-topology protected surface stays publishable. If `PROTECTED_GLOBS` changes incompatibly, the test fails and the carve-out must be re-decided. **No allow-by-omission**, applied to publishing.
38
+
39
+ ### 4. The boundary, by category
40
+
41
+ The enforced globs are in the manifest; this is the rationale-bearing summary.
42
+
43
+ | Publishable (allowlist) | Why |
44
+ |---|---|
45
+ | `src/` (engine + GDS), `scripts/`, `bin/`, `server.js` | the platform + the instance-model engine (game/art residue denied below) |
46
+ | `migrations/`, `tests/` | the build system's own schema + tests |
47
+ | platform-core `modules/`: lifecycle, grading, economy, memory, onboarding, ideas, builder-settings, sessions, autonomy, security, hall-ui, status-ui, dev-box, discord | the engine; instance flavor comes from the brand pack, not the code |
48
+ | `config/*.neutral.json`, `config/design-tokens.schema.json` | the customer-0 neutral starters + the generic contract schema |
49
+ | `CLAUDE.md`, `README`, `LICENSE`, `GOVERNANCE`, `CONTRIBUTING`, `CODE_OF_CONDUCT` | the portable methodology core + governance (R69/R70) |
50
+ | `docs/adr/`, `docs/recipes/`, `docs/design/`, `docs/architecture.md`, `docs/*-contract.md`, `docs/canonical-permissions.md`, `docs/handoff-template.md`, `docs/project-context.template.md` | sanitized methodology docs + the neutral project-context scaffold |
51
+ | `.claude/skills/` | the methodology slash-commands (hooks + settings denied) |
52
+ | Docker + repo scaffolding, `.env.local.example` | self-host scaffolding; examples only |
53
+
54
+ | Permanently excluded (denylist) | Why |
55
+ |---|---|
56
+ | `modules/game/`, `public/`, `src/world/`, `src/rooms/`, `src/preview-server.js` | customer-1 game content |
57
+ | `modules/art-pipeline/`, `modules/character-anim/`, `art/`, `scripts/art/`, `scripts/tile-*.js` | OTB art + **the ripped Pokémon FireRed reference corpus (copyright)** |
58
+ | `config/branding.json`, `config/modules.json`, `config/deploy.json`, `config/devbox-app.json`, `config/hierarchy.json`, `CODEOWNERS` | this host's identity + ops config (the `*.neutral.*` twins publish) |
59
+ | `docs/project-context.md`, `docs/lore/`, `docs/TRACKS.md`, `docs/session-logs/`, `docs/handoffs/`, `docs/reviews/`, `docs/discord/`, `blockers/`, `limitations/`, `generative-ideas.md` | instance build history + roadmap prose |
60
+ | `docs/security/`, `docs/audits/`, `docs/security-baseline.md`, `docs/routes-permissions.md` | the security/audit corpus (read-gated; attack-surface intel) |
61
+ | `infra/`, `scripts/deploy/`, `.github/`, `.husky/`, `.claude/hooks/`, `.claude/settings.json` | prod topology, deploy, CI, local gate automation (the topology subset of `PROTECTED_GLOBS`) |
62
+ | `.env`, `.env.local`, `.claude/settings.local.json`, `.claude/worktrees/` | secrets + throwaway local state |
63
+
64
+ ### 5. Deferred — excluded by default until R72 / the owner decides
65
+
66
+ Default-deny keeps these safely out of the mirror until a deliberate call is made; none is needed for the boundary to be correct:
67
+
68
+ - **The customer-0 brand pack** — `brand/cloud-bongos/` (the Bongo Buddha mascot + sky-whale art) and `config/branding.cloudbongos.json`. ADR 0065 §4 publishes `config/branding.neutral.json` as the vanilla identity; whether the Cloud Bongos *visual* brand also ships (vs. a neutral install) is a separate owner decision (large binary art + a trademark-vs-AGPL question).
69
+ - **The desktop clients** — `bongos-app/` and `devbox-app/` source (their installers already publish off-repo to a separate releases repo).
70
+ - **`modules/demo/`** — a sample module that could ship as an example.
71
+
72
+ ### 6. Granularity — subtree boundary now, file-level redaction in R72
73
+
74
+ This task draws the boundary at the **subtree** level. The *generated* export (R72) does the file-level work ADR 0065 §4 assigns it: redacting instance literals (droplet IP, `*.example.com`, the owner login, OAuth/repo bindings) from *inside* published files, and relocating module-owned tests. Known file-level follow-ups for R72: the game/art tests still under top-level `tests/` should travel with their (excluded) modules, and `.devcontainer/` + `public-landing/` need literal-redaction. R73's no-leak + lineage proof is the backstop that catches any straggler.
75
+
76
+ ### 7. The mirror repo
77
+
78
+ The public mirror is created **empty** — a `README` plus the AGPL-3.0 `LICENSE` — and is populated only by R72's delayed, redacted export. It does **not** carry source until R73 proves no-leak. The owner created it as **`cloudbongos/bongos`** in a dedicated `cloudbongos` GitHub org — brand-named (not `example-`-prefixed like the status/devbox off-repo mirrors, and not the pre-rename `medusa`) — **private for now**, to be flipped public once R73's no-leak proof lands. It is seeded with the README + the AGPL-3.0 `LICENSE` and nothing else.
79
+
80
+ ## Alternatives considered (rejected)
81
+
82
+ - **A prose-only carve-out** (just this doc, no manifest). Satisfies the literal "done when" but forces R72 to re-derive globs from prose and gives R73 nothing to assert against. The whole value of reusing `PROTECTED_GLOBS` is an executable boundary. Rejected.
83
+ - **Dump `PROTECTED_GLOBS` into the denylist.** Wrong: it would exclude the rank/permission/ship machinery that ADR 0065 §4 explicitly publishes as the methodology. The partition (topology-excluded vs methodology-published) is the necessary nuance. Rejected.
84
+ - **Denylist-first (publish everything except a blocklist).** One forgotten entry leaks a secret or the game. A publish boundary must fail safe — default-deny. Rejected.
85
+ - **A DB-stored manifest (hence the planning `needs_migration` flag).** The boundary is over *files* (globs), consumed by file-level tooling (R72/R73); there is no live state to store. No migration is needed — the reserved number goes unused.
86
+
87
+ ## Consequences
88
+
89
+ - **R72 and R73 build against one executable artifact**, not a paragraph. R72 imports `isPublishable`; R73 asserts no denied path leaked + that private↔public lineage stays consistent.
90
+ - **The carve-out cannot silently drift** from the live trust inventory — `tests/publish_manifest.mjs` (in the unit gate) fails if the partition stops covering `PROTECTED_GLOBS`.
91
+ - **No migration, no recurring cost.** This is a manifest + a doc + a test. The export pipeline's cost is evaluated under R72.
92
+ - **The deferred items (§5) remain owner decisions.** They are excluded until then, so the mirror is never *less* safe for the deferral.
@@ -0,0 +1,55 @@
1
+ # ADR 0099 — The time-delayed, redacted public-mirror export pipeline (R72)
2
+
3
+ - **Status:** Accepted — **retirement trigger fired 2026-07-03, deferred to the public-flip.** ADR 0103 §4 / R88 ([#1727](https://example.com/builders#/task/1727)) physically extracted the core into [github.com/example-owner/cloud-bongos](https://github.com/example-owner/cloud-bongos), the designated canonical public artifact. That repo is **private for now**, so this generated mirror **remains the public surface** and is **not retired**; retire (or repoint) it when `cloud-bongos` is flipped public.
4
+ - **Date:** 2026-06-30
5
+ - **Track:** internal
6
+ - **Task:** [#1211](https://example.com/builders#/task/1211) (V4.R72) — the delayed export pipeline + source-level redaction. The XL long-pole of GDS-V4 criterion **C9** (Cloud Bongos is open, free, and protected from capture).
7
+ - **Builds on:** [ADR 0098](<redacted>.md) (the publishable-subtree manifest this pipeline *consumes*), [ADR 0065](<redacted>.md) §4 (the publish boundary + the "redact instance literals" mandate), [ADR 0022](0022-secrets-policy.md) (the secret scrubber this reuses), [ADR 0029](<redacted>.md) / [#741](https://example.com/builders#/task/741) (the scoped-deploy-key mirror-push precedent).
8
+ - **Gates:** [#1212](https://example.com/builders#/task/1212) (R73 — the lineage + no-leak proof) reuses this pipeline's `findLeaks` + `.mirror-provenance.json`.
9
+
10
+ ## Context
11
+
12
+ ADR 0098 made the publish boundary executable (`scripts/gds/publish-manifest.js`, `isPublishable()`) but drew it at the **subtree** level and explicitly deferred to R72 the *file-level* work: publish a **~6-month-lagged snapshot** and **redact instance literals from inside published files**. The delay alone is not a security control — a droplet IP or domain committed seven months ago is exactly as sensitive today (§0098-6). Redaction is mandatory; the delay only shrinks the value of anything that ever slips.
13
+
14
+ The redaction surface is real, not theoretical: at build time **23** published files named the droplet IPv4, **1** named its IPv6, **~230** named the instance domain, **~50** named the owner login. Subtree exclusion cannot catch literals *inside* files the platform legitimately publishes (e.g. `docs/architecture.md`).
15
+
16
+ ## Decision
17
+
18
+ `scripts/public-mirror-export.js` (orchestration) + `scripts/gds/mirror-redact.js` (redaction library) + `.github/workflows/sync-public-mirror.yml` (schedule/transport). Seven decisions carry the weight:
19
+
20
+ ### 1. Snapshot, not history replay
21
+ Each run picks the **newest commit whose committer date is ≥ 180 days old** (`pickSnapshotCommit`) and exports that single tree. The mirror accumulates one lagged snapshot commit per run — always ~6 months behind. Rejected replaying/redacting full history: far more code + risk (rewrite every commit) for no gain the "done-when" asks for. Matches the status-mirror precedent (sync current state as commits).
22
+
23
+ ### 2. The manifest is the only allow-list
24
+ The exporter enumerates the snapshot tree (`git ls-tree -r`) and partitions it through `isPublishable()` (ADR 0098) — **no second list**. A file dropping out of the publishable set (or out of the lagged tree) disappears from the mirror on the next run.
25
+
26
+ ### 3. Two-layer redaction; the scrubber is reused, not re-typed
27
+ Instance-literal redaction (`redactText`: domain+subdomains → `example.com`, repo/db/world/company token → `example`, owner login+aliases → `example-owner`, public IPv4 **and** IPv6 → `REDACTED_IP`; localhost/RFC-1918/RFC-5737/link-local/ULA kept) **then** the ADR-0022 secret scrubber as a backstop. To reuse the proven scrubber without importing the heavyweight `ship.js`, its pure functions were extracted to `modules/security/secret-scrub.js` (`ship.js` re-exports them; `tests/scrubber_corpus.mjs` unchanged). One copy of the secret shapes, two consumers — the "imported, never re-typed" doctrine.
28
+
29
+ ### 4. Self-leak invariant
30
+ `mirror-redact.js` is itself published (under `scripts/`), so it contains **no instance literal**. Every literal is derived at runtime from `config/branding.json` (excluded from the mirror) plus caller-supplied extras. A vanilla clone redacts *its own* instance's literals with the same code. `tests/mirror_redact.mjs` reads branding at test time and asserts the redactor source contains none of this instance's literals.
31
+
32
+ ### 5. The no-leak gate is STRICTER than, and decoupled from, redaction
33
+ `findLeaks` scans for each raw sensitive literal as a **case-insensitive substring** + the IPv4/IPv6 floors — it does **not** reuse the redaction regexes. This was learned the hard way: a first cut shared a word-bounded owner rule (`\bexample-owner\b`) for both redact and detect; it silently missed `example-owner` inside a regex-literal string (`(\bexample-owner\b)` in `audit-authorship.sh`) *and the detector was blind to the miss because it used the same pattern.* Redaction may be smart (avoid over-mangling); the gate must be dumb and strict (any raw literal anywhere = fail). Owner redaction is therefore **unbounded substring** (a login is unique enough), which also covers `/Users/<login>` home paths.
34
+
35
+ ### 6. Fail-closed, atomic
36
+ All files are redacted **in memory**; `findLeaks` + `findSecretLeak` run over every redacted blob; **only if the entire set is clean** does the exporter touch the mirror filesystem (clear → write → commit → push). Any residual → publish nothing, exit non-zero, name the file+label (never the secret value), mirror untouched. Binary files are kept verbatim but still leak-scanned — a secret in a binary fails closed rather than corrupting it. An empty publishable set aborts (never wipes the mirror).
37
+
38
+ ### 7. Topology/owner extras live only in excluded files
39
+ The exact droplet IP (`DROPLET_IP`) and owner aliases beyond the GitHub login (`OWNER_ALIASES`, e.g. the real-name/home-dir username) are sourced from env set in the **workflow yaml — which `.github/` excludes from the mirror** — so they never appear in a published file. The generic public-IP floors already catch the droplet IP without knowing it; the exact value is belt-and-suspenders so the gate can assert *that* value is gone.
40
+
41
+ Transport reuses the ADR-0029/[#741](https://example.com/builders#/task/741) pattern: check out `cloudbongos/bongos` via a write-scoped deploy key (`PUBLIC_MIRROR_DEPLOY_KEY`), run the exporter with `--push`. Scheduled weekly + `workflow_dispatch`. `.mirror-provenance.json` (source SHA + committed-at + lag) is the lineage anchor R73 asserts against.
42
+
43
+ ## Consequences
44
+
45
+ - **Dormant-until-mature = a safety property.** This repo's history is < 180 days old, so the pipeline is a **no-op** ("nothing to publish yet") until ~2026-11. That keeps the mirror empty until R73's independent no-leak proof lands and the owner flips the mirror public (ADR 0098 §7) — three layers of safety: the gate must pass to push at all; the repo stays private meanwhile; R73 must pass before the public flip.
46
+ - **R73 is cheap to build.** It reuses `findLeaks` (assert no leak on the pushed tree) and `.mirror-provenance.json` (assert `source_commit` is an ancestor of private `main`; diff the mirror's `migrations/` numbering + enum values against that commit in the private repo).
47
+ - **Owner setup is required before the first real publish** — the `PUBLIC_MIRROR_DEPLOY_KEY` secret (and optional `DROPLET_IP`). Tracked as a blocker; not urgent (dormant until history matures).
48
+ - **Redaction over-redacts conservatively** (recall-first for topology): a coined instance token or a public IP that appears in generic prose is redacted. Acceptable — the mirror is meant to read as the neutral platform.
49
+
50
+ ## Alternatives considered (rejected)
51
+
52
+ - **Delay-only, no redaction.** Fails the "does NOT scrub secrets" reality; a 7-month-old droplet IP still pins prod. Rejected.
53
+ - **Share one regex set for redact + detect.** The blind-spot bug above: the gate can't catch what its own bounded rule missed. Rejected — the detector is a separate, stricter substring scan.
54
+ - **TruffleHog as the only secret check.** Strong but network-dependent and verify-only (no transform); can't run in the exporter's own deterministic self-check or the unit tests. Kept the reusable in-process scrubber as the authoritative gate; TruffleHog may layer on later.
55
+ - **Write then scan the mirror on disk.** A failed run would leave a dirty (unpushed) tree and risk a partial state. In-memory-then-write makes abort atomic. Rejected.
@@ -0,0 +1,60 @@
1
+ # ADR 0100 — Two-repo instance model: a project consumes Cloud Bongos as a versioned platform
2
+
3
+ - **Status:** Accepted — **§§1–2 superseded by [ADR 0103](<redacted>.md)** (2026-07-02 owner review: core-first extraction, and Example *does* split rather than staying coupled). §3 (per-repo GDS) and §4 (conditional mirror) remain in force.
4
+ - **Date:** 2026-07-01
5
+ - **Track:** internal
6
+ - **Task:** [#1607](https://example.com/builders#/task/1607) (BV1.R77) — the decision gate this ADR resolves.
7
+ - **Decides:** the physical-repo topology that [ADR 0062](<redacted>.md) §10 left open and [ADR 0065](<redacted>.md) §4 answered for the *open-source* surface only.
8
+ - **Builds on:** [ADR 0062](<redacted>.md) §1 (portable-core / host-instance / feature-module cut-line), [ADR 0064](<redacted>.md) (the Cloud Bongos rename), [ADR 0083](<redacted>.md) + [ADR 0093](<redacted>.md) (the module boundary + completed core-carve that make the split mechanical), [ADR 0098](<redacted>.md) (`isPublishable()` — the executable definition of "what is the core"), [ADR 0099](<redacted>.md) (the delayed mirror), [ADR 0015](<redacted>.md) (dependencies).
9
+ - **Amends:** ADR 0062 §10 (chooses a physical topology it left open); ADR 0065 §4 (puts the generated mirror on a *conditional* retirement path — §4 below).
10
+ - **Seeds:** GDS-V4 R84 → R85 → R86 (package the core → stand Mercury up on a pinned core → make `bongos upgrade` a real update channel).
11
+ - **Amended by:** [ADR 0108](<redacted>.md) — resolves §1's mechanism-neutral "installs a pinned core + layers its own content on top" into configurable-root (the core as a `node_modules` dependency + an injected instance-root), not clone-and-layer.
12
+
13
+ ## Context
14
+
15
+ ADR 0062 drew the **logical** cut-line — portable core / host instance / gated feature-modules — and deliberately left the **physical** repo topology open. cloudbongos.com ([#1206](https://example.com/builders#/task/1206)) then proved a second, non-game branded instance ships from the **same checkout** (a second process + second DB), so one repo was enough to prove the boundary. For the *open-source* release, ADR 0065 §4 chose a **generated one-way mirror** of the single private repo (delayed + redacted), explicitly *not* a fork.
16
+
17
+ Two owner priorities now push past the single-repo model:
18
+
19
+ - **Mercury** — Example' internal platform — should be "its own Cloud Bongos project": not code living inside the Off the Boats repo, and not merely another reskin of one checkout.
20
+ - **Core improvements should flow to future projects** on each project's own schedule — an explicit "update to the latest platform" capability.
21
+
22
+ The 2026-06-26 gap analysis (planning [#1604](https://example.com/builders#/task/1604)) found the logical boundary ~70% built and CI-enforced. Since then the load-bearing pieces landed: the bounded kernel ([#1570](https://example.com/builders#/task/1570)), the completed Config-B core-carve ([#1578](https://example.com/builders#/task/1578) + ADR 0093 — BONGOS-V1 C7 now satisfied), the hall-widget registry ([#1612](https://example.com/builders#/task/1612)), and core de-branding ([#1613](https://example.com/builders#/task/1613)). The boundary now holds, so a split is **mechanical, not a leap** — which is exactly the precondition this gate ([#1607](https://example.com/builders#/task/1607)) was told to wait for.
23
+
24
+ The single-repo model's one genuine virtue is **free updates**: with one copy of the code, every instance gets platform fixes the moment they land, no upgrade step. Splitting removes that property and requires new machinery — packaging the core as an installable unit, an update-consumption channel (the `bongos upgrade` CLI is a stub today, [#1203](https://example.com/builders#/task/1203)), and a GDS-topology decision across repos.
25
+
26
+ ## Decision
27
+
28
+ ### 1. The destination is two repos — a project installs Cloud Bongos as a versioned platform dependency.
29
+
30
+ A Cloud Bongos *instance* may be a **separate repository** that installs a **pinned version** of the Cloud Bongos **core** — the portable methodology + platform + neutral branding, exactly the subtree `isPublishable()` already defines (ADR 0098) — and layers its own project content, branding, and modules on top. This is the *physical* realization of ADR 0062 §1's *logical* cut-line. The single-checkout instance model (cloudbongos.com) is **not** deprecated: it stays a supported shape, and the cheaper one for a quick reskin.
31
+
32
+ ### 2. Sequenced — Mercury is the forcing function; do not design the channel up front.
33
+
34
+ We build the smallest slice that stands **Mercury up as customer 2** in its own repo on a *pinned* core, and let that first real consumer's needs define the update channel, rather than guessing. Order: package the core (R84) → stand Mercury up on a pinned core (R85) → make `bongos upgrade` a real update-consumption channel, driven by Mercury's first core bump (R86).
35
+
36
+ **Example is not split in this sequence.** It stays the single-checkout reference instance and keeps getting core updates for free, until a later, separate decision — moving a working product before the channel is proven on a greenfield one buys risk for no gain.
37
+
38
+ ### 3. GDS topology: per-repo.
39
+
40
+ Each project runs its **own** GDS — its own database, tasks, builders, versions, and credits. Mercury's builders never see Cloud Bongos platform tasks and vice versa; that separation of work is the point. A single shared GDS across repos is **rejected**: it re-couples exactly what the split exists to separate, and widens the trust/identity surface (ADR 0062 §5, [ADR 0016](<redacted>.md)). The cost — more than one GDS database to operate — is accepted as the price of clean separation.
41
+
42
+ ### 4. The generated mirror (ADR 0065 §4) is retained now, retired conditionally.
43
+
44
+ The delayed redacted mirror (ADR 0099) stays the public open-source surface **until** the Cloud Bongos core is physically extracted into its own repo. At that point the core repo becomes the canonical public artifact (secrets scrubbed, AGPL intact), and the mirror is re-evaluated for retirement or repointing — a decision deferred to *that* task, not made here. Until then ADR 0065 §4 is unchanged and in force. The AGPL-3.0 license, the non-profit/AI-first governance, and the 6-month delay window (ADR 0065 §§1–3) are **unaffected** by repo topology.
45
+
46
+ ## Alternatives considered (rejected)
47
+
48
+ - **A — stay single-repo + generated mirror (the seeded plan).** Cheapest, already built, free instant updates. Rejected as the *destination*: it structurally cannot deliver <redacted> or an update channel — a project would have to live inside the OTB repo or be a reskin, and there is nothing to "update" while everything shares one checkout. **Retained** as the model for cheap reskins and as the interim public-release mechanism (§4).
49
+ - **Two repos, one shared GDS.** Rejected — re-couples the work-tracking plane the split means to separate (§3).
50
+ - **Split Example out immediately, alongside Mercury.** Rejected — moving a live product before the channel is proven adds risk for no gain; greenfield Mercury is the safer first consumer (§2).
51
+ - **Fork / hand-maintained downstream.** Rejected in ADR 0065 §4 and still rejected — a divergent fork loses the free flow of core fixes without the discipline of a versioned dependency.
52
+
53
+ ## Consequences
54
+
55
+ - **P4 and P5 become buildable.** The R84 → R85 → R86 spine delivers Mercury (P5) and the update channel (P4). R84 auto-promotes to `ready` when this gate ([#1607](https://example.com/builders#/task/1607)) ships (ADR 0015).
56
+ - **A permanent per-project upgrade step** replaces free updates — the recurring cost the single-repo model avoided, now explicit and owned per project.
57
+ - **A larger operational footprint** (more repos, CI, at least one more GDS database) — weighed against the $5k budget and mitigated by building incrementally, driven by Mercury, not ahead of it.
58
+ - **The module boundary is now load-bearing across a repo gap.** A two-repo consumer amplifies any core↔host leak into a cross-repo break, so the ADR 0062 Path-C fitness functions ([ADR 0061](<redacted>.md)) matter more, not less.
59
+ - **Example is unaffected today** — single-checkout reference instance, free core updates, until a separate future decision.
60
+ - **No new criterion is minted by this ADR.** The seeded tasks are a distinct "done-when" from GDS-V4 C8 (single-checkout configurable instance); whether to track them under a new criterion is left to the owner (see the shipping task's notes).