@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,87 @@
1
+ # ADR 0108 — Instance composition topology: configurable-root (the core is consumed as a versioned npm dependency)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-07-03
5
+ - **Track:** internal
6
+ - **Task:** [#1870](https://example.com/builders#/task/1870) (BV1.R115) — the decision this ADR records.
7
+ - **Decides:** *how* a consumer instance physically composes with the extracted Cloud Bongos core — the composition **mechanism** that [ADR 0062](<redacted>.md) §10, [ADR 0100](<redacted>.md) §1, and [ADR 0103](<redacted>.md) §2 each left open. Those ADRs decided the repo *count* (two), the *order* (core-first), and per-repo GDS; they are deliberately mechanism-neutral ("installs a pinned core + layers its own content on top"), and [ADR 0103](<redacted>.md)'s R88 execution record explicitly deferred "the topology/instance paths the scaffold populates on `init`." This ADR resolves that deferral.
8
+ - **Replaces:** the never-shipped clone-and-layer draft of this same ADR number. A 2026-07-03 owner review rejected clone-and-layer in favour of the scalable model below — optimising for upgrade economics + a real product boundary over near-term least-resistance. (No supersession machinery: the draft never merged.)
9
+ - **Builds on:** [ADR 0062](<redacted>.md) §1 (core/host cut-line), [ADR 0098](<redacted>.md) (`isPublishable()` — now "the core *package* contents"), [ADR 0100](<redacted>.md) §§3–4 (per-repo GDS + conditional mirror, both retained), [ADR 0103](<redacted>.md) (core-first extraction; R88 shipped → `cloud-bongos`), [ADR 0105](<redacted>.md) (the `migrations/instance/` split), [ADR 0083](<redacted>.md)/[ADR 0061](<redacted>.md) (the module boundary + fitness functions), [ADR 0082](<redacted>.md).
10
+ - **Informs:** [#1689](https://example.com/builders#/task/1689) (R85 — Mercury, the first real consumer + the contract's validator), [#1690](https://example.com/builders#/task/1690) (R86 — the `bongos upgrade` channel), [#1728](https://example.com/builders#/task/1728) (R89 — the Example split), plus the net-new workstreams enumerated in §Consequences.
11
+
12
+ ## Context
13
+
14
+ [ADR 0103](<redacted>.md) extracted the Cloud Bongos core into its own repo (R88, [#1727](https://example.com/builders#/task/1727), shipped 2026-07-03) and committed Mercury (R85) and Example (R89) to becoming *consumer repos on a pinned core*. It left the composition **mechanism** open. Two shapes were possible:
15
+
16
+ - **Clone-and-layer** — the consumer repo *is* the pinned core tree materialised at its **root**, host content layered on top; the core keeps sitting at repo-root, so its pervasive repo-root path assumptions keep working unchanged.
17
+ - **Configurable-root** — the core is installed as a **versioned dependency** (`@cloudbongos/core` in `node_modules/`) and resolves host content through an **injected instance-root**, so it no longer assumes it lives at the repo root.
18
+
19
+ A 2026-07-03 owner review chose **configurable-root**, explicitly weighting **scalability over least-resistance**. The decisive arguments: upgrades become an **O(1)-per-instance version bump** instead of an O(instances × drift) source merge; the core↔host boundary is enforced by the **packaging** (editing `node_modules` is obviously wrong and install-clobbered) rather than by convention + CI that *will* erode across many AI-agent builders and many instances; a dependency forces a **real public API/contract** on the core (the discipline that lets a platform serve many consumers without breaking them); instance repos stay **small and legible** (host content only); and "root is a parameter" is the precondition for any future **multi-instance / hosted** offering. Clone-and-layer dead-ends every one of those and would need this same refactor later anyway — under more pressure, on more instances, and on a live product.
20
+
21
+ A five-surface sweep ([#1870](https://example.com/builders#/task/1870)) established the real blast radius, and it is **lopsided**: the runtime-library change is small and already half-scaffolded; the genuine work and risk live in *delivery and operations*. The evidence:
22
+
23
+ - **The entrypoint seam already exists.** Three boot paths ship today — `server.js` (game + platform), `src/platform-server.js` (platform-only, zero game code), `src/preview-server.js` (game-only). The platform is exposed as `mountInternalSurfaces(app)` / `buildPlatformApp()` — ready-made core-package exports. The game is a seam-registered module, not wired into core boot.
24
+ - **The core runtime is thin.** Core deps are `express` + `pg` (+ an `undici` pin). The five Colyseus/Phaser libs are game-only; `discord.js`/`sharp` are optional-module.
25
+ - **The data/boundary partition is already single-sourced.** `publish-manifest.js`'s `isPublishable()` is the one authority; `package-core` consumes it (no second list); fitness Check 16 already hard-fails a core file that `require()`s an instance-excluded config (the R88 boot crash).
26
+ - **The module loader is already two-roots-capable.** `discoverModules({roots})` iterates a roots array and errors on cross-root key collisions; only `DEFAULT_ROOTS` is hardcoded.
27
+ - **Only ~8–11 files** resolve *instance* content off a `__dirname/../..` root and actually break under packaging (`branding.js`, `modules.js`, `hierarchy-config.js`, `pool.js`, the design adapter, `loader.js`, `serve-internal.js`, `migrate.sh`, `bin/bongos.js`, + a couple of scripts). The existing `src/instance-config.js` already solves the *sibling-identity* problem (config dir + env prefix) with a "OTB pins its values → zero change; vanilla → neutral" discipline — it is the template and the home for the fix.
28
+ - **The runtime substrate for a vanilla boot already exists** — `docker-compose` + `platform-server.js` boot GDS-only via `PG*` env, and `selfhost-boot.yml` CI proves a fresh empty Postgres boots vanilla with zero instance-data leakage.
29
+
30
+ The friction, instead, is concentrated in three places (detailed in §Consequences): the `.claude/` methodology surface cannot live in `node_modules`; deploy today is a `git reset --hard` on a shared checkout; and two independently-versioned repos will collide on migration numbering.
31
+
32
+ ## Decision
33
+
34
+ ### 1. The core is consumed as a versioned npm dependency; host content resolves through an injected instance-root.
35
+
36
+ Introduce two resolvers in the existing `src/instance-config.js`, extending its established zero-risk pattern from `~/.config` to the in-repo roots:
37
+
38
+ - **`resolveInstanceRoot()`** → where **host** content lives (`config/`, instance `modules/`, `migrations/instance/`, instance identity). Precedence: `<PREFIX>_INSTANCE_ROOT` env → a `bongos.config` pointer → `process.cwd()`.
39
+ - **`resolveCoreRoot()`** → where the **core package's own** files live (core `modules/`, core `migrations/`, the `infra/` installers, the neutral config defaults). When packaged: the `node_modules` package dir; today: `path.resolve(__dirname, '..')`.
40
+
41
+ The two directions are **opposite and both load-bearing**: config resolves from the *instance* root (with the `*.neutral.json` default in the *core* root); the `infra/bongos-install.{sh,ps1}` files that `serve-internal.js` serves resolve from the *core* root. A naive "use the instance-root everywhere" breaks the installers — this distinction is the crux of the `serve-internal` fix.
42
+
43
+ **Today both resolvers return the current repo root** (because `process.cwd()` === `__dirname/../..` === repo root in the single checkout), so routing the ~8–11 sites through them is **byte-identical for the live instance** — verified by the existing suite + a vanilla boot. Packaging later flips `resolveCoreRoot()` to the `node_modules` dir; the split becomes real with **no further per-site edits**.
44
+
45
+ ### 2. `package-core` emits a real, installable npm package.
46
+
47
+ `isPublishable()` stays the single definition of "the core" — now "the package contents." `package-core` additionally: synthesises a `package/`-rooted `package.json` (`name` `@cloudbongos/core`, `version` = `CORE_VERSION`, `main` → `platform-server.js`, `exports` for `mountInternalSurfaces`/`buildPlatformApp`/the module-API, `bin` → `bongos`), **prunes** the game/art deps (leaving `express`/`pg`/`undici`), and ships a pruned lockfile. Today it ships the repo's game-heavy `package.json` verbatim under a `cloudbongos-core/` tar root — neither is package-installable.
48
+
49
+ ### 3. The `.claude/` methodology surface is materialised into the instance, not resolved from `node_modules`.
50
+
51
+ Claude Code discovers `.claude/settings.json`, `hooks/`, and `skills/` from the **project root**, never from a dependency — so `bongos init`/`upgrade` must **materialise `.claude/` into the instance repo**, and the ~30 skills + the `settings.json` hooks must be rewritten from `node scripts/gds/…` to the **`bongos` bin** (which already resolves the heavy CLI — `ship.js`, the grader, `src/bongos/*` — inside the package). This formalises a split the publish boundary already encodes (skills ship in the core; hooks + `settings.json` are "topology"). The materialisation step is **net-new** — `init` writes only `config/` today.
52
+
53
+ ### 4. `bongos upgrade` (R86) is a dependency version bump, not a snapshot-merge.
54
+
55
+ Upgrading = bump the pin in `package.json`/lockfile → `npm ci` → migrate → restart. Deploy shifts from the droplet `git reset --hard origin/main` model to **`git pull` the instance repo → `npm ci` (installs the pinned core) → migrate core + instance → start `platform-server.js` with the instance-root**. The Docker/`platform-server`/`selfhost-boot` substrate already models this shape.
56
+
57
+ ### 5. Cross-repo migration numbering gets an explicit namespacing discipline.
58
+
59
+ `migrate.sh`'s basename merge-sort already orders files from arbitrary directories correctly (and keys idempotency on basename), so feeding it **three roots** (core-package / instance / module) works mechanically. But two independently-versioned repos both adding `NNN_*.sql` **will collide** on the shared `schema_migrations` stem key. Core migrations therefore get a core-owned namespace/prefix distinct from instance migrations, plus a lineage/numbering-divergence check (reuse the public mirror's existing pattern). Fitness Check 11's "additive + namespaced" rule extends to cover this.
60
+
61
+ ### 6. Land incrementally and Mercury-first, so live prod is de-risked.
62
+
63
+ - **Step 1 lands now, zero-behaviour-change:** the two resolvers (defaulting to repo-root) + routing the ~8–11 sites through them. Good hygiene even if no split ever happened; verified against the suite + a vanilla boot.
64
+ - **Steps 2–3** (real package + `.claude/` materialisation) prove out on **greenfield Mercury (R85)** — the first consumer defines the contract.
65
+ - **R86** makes `bongos upgrade` a real version-bump channel, driven by Mercury's first core bump.
66
+ - **Example splits last (R89)** — and the trust-boundary-adjacent path sites (`route-rank-check.js`, `routes/backup.js`, `routes/builders.js`) plus the two-root awareness the guardrails need (see §Consequences) get a **security review** before they touch live prod.
67
+
68
+ ## Alternatives considered
69
+
70
+ - **Clone-and-layer (the prior draft of this ADR).** Cheapest now, proven by the two proofs (cloudbongos.com reskin + the `package-core` tree snapshot), zero core-path changes. **Rejected as the destination:** merge-based upgrades don't scale across many instances × core versions; the boundary is convention + CI and rots under scale; there is no forcing function for a clean core API; and it dead-ends any multi-instance/hosted future — needing this exact refactor later regardless, under worse conditions. **Retained** only as the cheap single-checkout reskin shape (cloudbongos.com).
71
+ - **Git submodule for the core.** Rejected — still lands the core at a subpath (so it still needs configurable-root; it doesn't avoid the refactor) and adds the submodule UX tax on an AI-agent-first builder base.
72
+ - **One monorepo with an internal `core/` + `instances/` cut.** Already rejected in [ADR 0103](<redacted>.md) — the core never becomes a separately shippable product.
73
+
74
+ ## Consequences
75
+
76
+ **More work now — the "pain" is real and concentrated in three net-new workstreams plus a cross-cutting guardrail fix:**
77
+
78
+ 1. **`.claude/` materialisation + invocation rewrite** (§3). `bongos init`/`upgrade` must copy `.claude/` into the instance and rewrite ~30 skills + the `settings.json` hooks to the `bongos` bin. This is what makes an installed instance actually usable by AI agents; it does not exist today.
79
+ 2. **Deploy conversion** (§4). `git reset --hard` → `npm ci`-of-the-pinned-core; `ship.js` (~151 KB, a monorepo-coupled deploy tool) needs rework; and the **shared-checkout dual-instance deploy** (example + cloudbongos.com on one tree — already the reason cloudbongos.com runs stale) must be cut *in tandem* with standing up the npm-install flow, or cloudbongos.com breaks.
80
+ 3. **Cross-repo migration numbering** (§5) — the deepest design risk; needs the namespacing + lineage discipline before two repos version independently.
81
+ 4. **The guardrails become two-root-aware.** `fitness.js`, `gen-repo-map.js`, and `gen-file-map.js` each hardcode `REPO_ROOT = __dirname/../..` and walk one tree; once the core is in `node_modules`, the core↔host boundary check, the CLAUDE.md-budget check, the nested-doc-presence check, and the two generators would inspect the wrong tree. They must learn the core-root/instance-root split — this is the mechanism [ADR 0062](<redacted>.md) §9 / [ADR 0061](<redacted>.md) rely on to keep the boundary from rotting, so it matters *more* under a real repo gap, not less.
82
+
83
+ **But the runtime-library half is small and de-risked:** ~8–11 readers through the resolvers, and the entrypoint seam, the two-roots loader, the single-sourced `isPublishable()` partition, and the Docker/vanilla-boot substrate all already exist. Step 1 is byte-identical for prod, which lets the risky part land reversibly and early.
84
+
85
+ **Docs to amend** (none *superseded* — this ADR resolves the mechanism they deferred, so they get cross-refs, not reversals): `docs/file-map.md` (present the tree as two — core-package vs instance), `docs/architecture.md` (repo + deploy), `docs/recipes/packaging-the-core.md` + `docs/recipes/self-host.md` (npm consumption + mount targets), [ADR 0105](<redacted>.md) (three-root migrations), `docs/modules-contract.md` (two-root discovery); cross-refs in [ADR 0062](<redacted>.md)/[0100](<redacted>.md)/[0103](<redacted>.md)/[0098](<redacted>.md), `docs/branding-contract.md`, and `CLAUDE.md` (whose nested-doc discovery model assumes core dirs sit at the instance root — they will live in the package). Keep within the CLAUDE.md 300-line / 42 KB fitness ceiling — relocate detail here, don't expand CLAUDE.md.
86
+
87
+ **Commitments:** R85 is built as `npm install`-of-the-core + configurable-root (and becomes the contract's validator); R86 is a version-bump channel; R89 keeps the risky path/guardrail/trust-boundary changes behind a security review. **No migration, no new criterion** minted by this ADR; recorded against goal 26 (Cloud Bongos productization and self-host).
@@ -0,0 +1,44 @@
1
+ # ADR 0109 — The GDS API is self-describing: generated OpenAPI 3.1 + a hosted `/docs` site
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-07-03
5
+ - **Track:** internal
6
+ - **Task:** [#1918](https://example.com/builders#/task/1918) (BONGOS-V1) — Part A of the API-docs + `/api/gds`→`/api/bongos` rename plan.
7
+ - **Decides:** how the GDS API is documented so an AI agent (or any tool) can read it, and where that documentation is hosted.
8
+ - **Builds on:** [ADR 0016](<redacted>.md) (server-enforced ranks — the gate each endpoint carries), [ADR 0063](<redacted>.md) (the "generate, don't hand-maintain, enforce with `--check`" pattern this copies), [ADR 0062](<redacted>.md) §3 (branding-injected served HTML), [ADR 0108](<redacted>.md) (two-root generator conventions).
9
+ - **Informs:** the `/api/gds` → `/api/bongos` URL + naming rename (Part B), which flips the single `src/bongos/api-prefix.js` constant this ADR introduces.
10
+
11
+ ## Context
12
+
13
+ The GDS API had **no machine-readable contract**. The only endpoint doc was `docs/routes-permissions.md` — a hand-maintained mirror that, by its own admission, drifted from the code (it claimed "154 registrations" against a live ~199). An AI agent hitting the API had nothing standard to consult, and every regeneration of the surface widened the gap. The prompter's ask: *"the GDS API needs to be better documented for AI to read"* and *"host this on cloudbongos.com/docs like others do."*
14
+
15
+ Two things were already true and shaped the answer:
16
+
17
+ 1. **A route-introspection engine already exists and is CI-enforced.** `src/bongos/route-rank-check.js` (`discoverRouteFiles` + `classifyText` + `classifyRank`) already enumerates every endpoint — method, path, rank gate, source file — across core + every module, because the ship-time rank gate ([ADR 0016](<redacted>.md)) depends on it. It is the natural, non-drifting backbone for docs.
18
+ 2. **A generator pattern is established** ([ADR 0063](<redacted>.md)): a deterministic file-reader with a `--check` mode wired into `fitness.js` and auto-regenerated at ship. Docs generated the same way cannot rot.
19
+
20
+ ## Decision
21
+
22
+ **1. Generate an OpenAPI 3.1 spec from the live routes.** A new `scripts/gds/gen-api-docs.js` reuses `route-rank-check.js` to emit `docs/api/openapi.json` (the industry-standard format every tool — Postman, Swagger, Redoc, LLM tool-callers — already reads), plus a generated `docs/api-reference.md`. Each operation carries its rank in an `x-rank` extension + a `security` reference, its path params, and — best-effort from the route's `validateOrRespond` schema — its request-body field names. Endpoints whose body has no validator are marked `x-body-undocumented` and **counted**, so the gap is visible rather than silently absent. The old `docs/routes-permissions.md` is replaced by a generated pointer stub.
23
+
24
+ **2. Host a rendered docs site at `/docs`.** A vendored Redoc bundle (`public-docs/`, self-hosted — no CDN, matching the `/vendor/*` convention and staying CSP-safe) renders the spec. `serve-internal.js` serves `GET /docs` (branding-injected), `GET /docs/openapi.json` (CORS-open so external tools + AI can fetch it), and `GET /docs/redoc.standalone.js` — in the **shared** `mountInternalSurfaces`, so **every instance is self-documenting for free** and `cloudbongos.com/docs` is the advertised canonical URL. No Caddy change: the `cloudbongos.com` block already proxies non-gate paths to the platform process.
25
+
26
+ **3. Make the API self-discoverable.** `GET /api/gds` (the base path) returns a small JSON index pointing at `/docs` + the spec, and the API-shaped 404 hint now names `/docs` — so an agent that hits the API bare finds the contract on its own.
27
+
28
+ **4. Introduce a single prefix chokepoint.** `src/bongos/api-prefix.js` exports `API_PREFIX` (still `/api/gds`), consumed by the mount, the generator, the discovery route, and `context-pack.js`. This is deliberately the seam Part B flips to `/api/bongos` (adding `/api/gds` to `LEGACY_API_PREFIXES` for the permanent dual-mount) — turning a ~1,158-literal rename into a one-line change.
29
+
30
+ **5. Enforce freshness.** `gen-api-docs.js --check` (which also structurally validates the spec is OpenAPI 3.1) is wired into `fitness.js` and regenerated at ship, exactly like the repo-map / session-index / file-map generators. `npm run docs:api:lint` runs the full standard `@redocly/cli` lint on demand (kept out of the critical path to avoid a heavy dependency; the spec validates clean, zero warnings).
31
+
32
+ ## Alternatives considered
33
+
34
+ - **A hand-written/OpenAPI-by-annotation spec (JSDoc `@openapi`).** Rejected: it reintroduces exactly the drift that killed `routes-permissions.md`. Generating from the enforced route set is the only non-rotting option.
35
+ - **Swagger UI instead of Redoc.** Either works over the same spec; Redoc is a single MIT bundle with a cleaner default read view. The renderer is a presentation choice — the *contract* (openapi.json) is the deliverable, and it is renderer-agnostic.
36
+ - **A CDN-hosted renderer.** Rejected: the codebase self-hosts all assets (no CSP today, but one "may be added later") and a self-hosted instance may be air-gapped. Vendoring (~1 MB) is the convention-matching, portable choice.
37
+ - **`@redocly/cli` as a hard CI dependency.** Rejected for the critical path: it is a large dependency tree in a deliberately lean, bootstrapped project. A dependency-free built-in structural validator runs in `fitness`; the full standard lint is available via `npm run docs:api:lint`.
38
+
39
+ ## Consequences
40
+
41
+ - The API is now documented in a standard, tool-consumable format that cannot drift from the code, and is browsable by humans + AI at a stable URL on every instance.
42
+ - `docs/routes-permissions.md` is retired to a stub; references were re-pointed at `docs/api-reference.md`.
43
+ - Best-effort body extraction leaves 21 write endpoints with undocumented bodies (no validator schema) — a visible, counted backlog; adding a `validateOrRespond` schema surfaces them automatically.
44
+ - Part B (the URL rename) is now a one-line flip of `src/bongos/api-prefix.js` + the dual-mount, with the docs regenerating to the new canonical prefix for free.
@@ -0,0 +1,49 @@
1
+ # ADR 0110 — Move whole-file generated navigation docs off the git graph; regenerate as deploy/box outputs
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-07-03
5
+ - **Track:** internal
6
+ - **Builds on:** [ADR 0094](<redacted>.md) (the `gen-atlas.js` precedent — a gitignored artifact rebuilt on every deploy), [ADR 0063](<redacted>.md) (`gen-repo-map.js`), [ADR 0062](<redacted>.md) §8 (`gen-session-index.js`), [ADR 0082](<redacted>.md) (the reactive `otb-regen` heal — kept, not replaced), [ADR 0055](<redacted>.md) (server-mediated publish — untouched)
7
+ - **Task:** [#1926](https://example.com/builders#/task/1926)
8
+ - **Supersedes (in part):** the "regenerated + committed at ship" contract for `docs/repo-map.md` and `docs/session-log-index.md` (ADR 0063 / ADR 0062 §8). The nested-block half of that contract stands.
9
+
10
+ ## Context
11
+
12
+ Every `/builder-ship` regenerated and **committed** up to four generated artifacts onto the shipping builder's feature branch — `docs/repo-map.md`, `docs/session-log-index.md`, the OpenAPI docs, and (render-capable ships) the diagrams — plus the file-map. Because these are rebuilt deterministically from the whole tree, two builders working in parallel produce *different* copies and their branches **collide on nearly every merge**. ADR 0082 built a reactive heal (the `otb-regen` merge driver + a server-side resolver) that untangles these collisions after the fact — but it treats the *symptom*. As the platform pushes toward multi-builder parallelism (BONGOS-V1), the healing cost grows with the number of concurrent branches, and a confirmed PR can still stall waiting on the ~5-minute reconciler.
13
+
14
+ The owner asked to remove the **dependency at the source**, not keep patching the collision. A design workflow (2026-07-03, 11 agents, adversarially reviewed) mapped the artifacts and found they split cleanly into two kinds:
15
+
16
+ - **Whole-file generated** — every byte is machine-owned (`docs/repo-map.md`, `docs/session-log-index.md`, the OpenAPI spec + reference, the diagram renders). A file like this need not live in git at all.
17
+ - **Hybrid** — hand-written prose with a generator-owned block between markers (the three nested `CLAUDE.md` symbol blocks; the `CLAUDE.md` §13 "recent sessions" snippet; `docs/file-map.md`'s two sections). These **cannot** leave git without deleting the human prose.
18
+
19
+ The `gen-atlas.js` precedent (ADR 0094) already proved the pattern for the whole-file kind: gitignore the artifact and regenerate it server-side on every deploy into the served directory — untracked, so `git reset --hard` never wipes it and no branch can ever diff it. The deploy-prod.sh atlas comment even names this as "the model the doc generators migrate onto."
20
+
21
+ ## Decision
22
+
23
+ Apply the atlas pattern to the two **whole-file navigation** artifacts — `docs/repo-map.md` and `docs/session-log-index.md` — in this pass. (The OpenAPI spec and the diagram renders are deferred to follow-up tasks: the spec has external consumers and wants a bounded freshness bot; the diagrams need verified headless-Chromium handling. `docs/file-map.md` is hybrid and stays as-is.)
24
+
25
+ 1. **Untrack + gitignore** `docs/repo-map.md` and `docs/session-log-index.md` (`git rm --cached` + `.gitignore`). They can no longer appear in a branch diff, so the collision class is gone at the source.
26
+ 2. **Regenerate at deploy** — `scripts/deploy/deploy-prod.sh` runs both pure-JS generators beside `gen-atlas.js`, best-effort, and **LOUD on failure** (`::ERROR::` → journald) so a broken generator surfaces instead of silently serving a stale/absent map (this advances goal 24 / criterion `gcarry-pipe-loud`).
27
+ 3. **Regenerate at box-source-fetch** — `infra/box-source-fetch.sh` regenerates them after the credential scrub so a fresh dev-box clone has them for the `/dev` skill and the §13 links (additive, best-effort, never touches the security path).
28
+ 4. **Split the CI freshness gate.** Both generators are **dual-duty** — each also refreshes a *tracked* block (the nested `CLAUDE.md` symbol blocks; the `CLAUDE.md` §13 snippet). The old `--check` bundled the whole file and the block into one exit code, so naively relaxing it would silently drop the block gate too (the adversarial review's fatal flaw). Instead each generator now exposes `--check-block` (tracked block only) and `--check-whole` (the gitignored whole file); `fitness.js` gates the **block bucket HARD** via `--check-block`. The whole-file freshness moves from a merge-time invariant to a deploy-time one.
29
+ 5. **Ship-time regen keeps only the tracked blocks.** `ship.js`'s `regenerateRepoMap`/`regenerateSessionIndex` still run the generator (which writes the gitignored whole file harmlessly) but drop the gitignored paths from their `git add`/`git status` lists — an explicit `git add <ignored path>` **aborts the whole command** (exit 1), which would have dropped the nested-block commit.
30
+
31
+ ## Why this is safe — and never worse than today
32
+
33
+ - **No bot ever commits to `main`; the trust boundary is untouched.** The whole files are written as untracked files on the droplet after `git reset --hard`, exactly like `atlas.json` — no push credential, no branch-protection bypass, zero change to ADR 0016/0043/0055. No `.github/workflows/` file is added (the server App token can't land those).
34
+ - **The reactive heal is retained, not deleted.** `git-merge-regen.js`, its `REGENERABLE` set, the `.gitattributes` drivers, and the ADR 0082 server resolver are **unchanged**. Once the two files are gitignored they simply never appear in a diff, so the driver is a harmless never-triggered backstop for them — and it still actively heals the hybrid docs (`file-map.md`, nested `CLAUDE.md`) that remain tracked. During the transition it also still covers any in-flight branch that already committed the old files.
35
+ - **The block gate stays hard.** A code change that didn't regenerate its nested block, or a session change that didn't regenerate the §13 snippet, still fails its PR via `--check-block`. Only *whole-file* drift is no longer gated (there's nothing committed to gate).
36
+
37
+ ## Consequences
38
+
39
+ - The `repo-map.md` / `session-log-index.md` collision class — a recurring multi-builder merge cost (the PR #167 lineage) — is eliminated at the source. Ship drops up to two bookkeeping commits per session.
40
+ - **Accepted staleness:** the *served/on-disk* whole files are fresh only *after deploy* (or a box-fetch tick), not at merge. For navigation indexes this is tolerant by nature — worst case an agent's symbol map is a few minutes stale. A generator that breaks at deploy leaves a stale/absent file with no *blocking* backstop; the LOUD `::ERROR::` line is the alarm (mandatory, not optional).
41
+ - **Transition wrinkle:** a branch that already committed either file before this lands will hit a one-time modify/delete conflict on its next merge with `main` (resolve = keep deleted). New branches never touch the files.
42
+ - **Fresh pristine checkout:** a bare `git clone` that never runs a generator lacks the two files, so a markdown link to them (e.g. the CLAUDE.md nav row, the §13 snippet's "full history" link) points at an absent path *there only*. Nothing hard-checks links in that state; every real environment (box, deploy) regenerates them. `docs-entropy` (a scheduled scanner, not a CI gate) runs where they exist.
43
+ - The generated-artifact set is now defined per-bucket; adding a future gitignored generated file means: `.gitignore` + a deploy-prod.sh regen line + a box-source-fetch line + a `--check-block`/`--check-whole` split if it is dual-duty.
44
+
45
+ ## Alternatives considered
46
+
47
+ - **Post-main regen bot / cron that re-commits the files** (the owner's two original ideas) — rejected as the *primary* mechanism: both keep the files in git, weaken the freshness gate for every content PR, burn CI on regen PRs, and (there is no GitHub webhook in this codebase) can only poll anyway. "Don't commit the file" is strictly simpler than "automate re-committing it." The bounded bot survives only for the API spec (a follow-up task), which has external consumers.
48
+ - **Strengthen the reactive heal only** (ADR 0082++) — rejected: makes conflicts invisible, not absent; the per-branch bookkeeping commits and the heal latency remain, and the cost grows with parallelism.
49
+ - **Trim `docs/repo-map.md` from `REGENERABLE`/`.gitattributes`** — deferred: it would force a rewrite of `tests/git_merge_regen.mjs` (which uses repo-map as its canonical whole-file heal fixture) for no real gain, since a gitignored file never reaches the driver anyway. Leaving the entries in place is the lower-risk transition posture.
@@ -0,0 +1,135 @@
1
+ # ADR 0111 — Instance hosting + domains as a Cloud Bongos module: the `provisioning` module boundary + the self-host / managed split
2
+
3
+ - **Status:** Accepted (boundary + split decided with the owner; build is task-pending — see §Consequences for the seeded tasks)
4
+ - **Date:** 2026-07-03
5
+ - **Track:** internal (a portable Cloud Bongos platform capability)
6
+ - **Task:** [#1485](https://example.com/builders#/task/1485) (BONGOS-V1, goal 26 — *Cloud Bongos productization and self-host*) — "spec the module boundary + the self-host vs managed split **before** tasking."
7
+ - **Deciders:** Lars (Archon), Claude
8
+ - **Consolidates:** idea [#345](https://example.com/builders#/idea/345) (owner — *"offer hosting + domain services directly as a module when people start a Cloud Bongos project… configured with the API"*) + idea [#303](https://example.com/builders#/idea/303) (owner, deferred from the 2026-06-17 planning — *optional managed-hosting layer: operate branded instances for owners, push updates centrally, same self-host artifact*).
9
+ - **Decides:** (1) that "hosting + domains" ships as a **new `provisioning` module** (NOT the ADR 0092 `hosting` key — see disambiguation below), and its boundary; (2) how the web tier provisions real infra **without holding cloud credentials**; (3) what "provision an instance" composes; (4) domain + TLS handling; (5) the **self-host vs managed split** — both run the identical artifact, and what actually differs; (6) the cost posture; (7) sequencing.
10
+ - **Builds on:** [ADR 0062](<redacted>.md) (core↔host instance model), [ADR 0108](<redacted>.md) (the core as a versioned npm dependency — "the same self-host artifact"), [ADR 0065](<redacted>.md) §2 (managed hosting is a service *on top of* the same AGPL artifact), [ADR 0031](<redacted>.md) (the dev-box lifecycle — the reusable provisioning substrate + trust-boundary pattern), [ADR 0083](<redacted>.md) (the module system this ships as), [ADR 0016](<redacted>.md) (server-enforced trust boundary the module must never weaken), [ADR 0100](<redacted>.md) §3 (per-repo GDS — locked; a managed fleet sits *above* it).
11
+ - **Relationship to [ADR 0092](<redacted>.md) (name-collision, resolved):** ADR 0092's `hosting` module answers *"where do compute/storage **workloads** run"* (LLM inference, imagegen, embeddings, training, blob storage — brokered to a target such as the warehouse GPU box). **This ADR is a different layer:** *"stand up + operate a whole Cloud Bongos **instance's own infrastructure** — server, database, domain, DNS, TLS."* Same English word "hosting", two concerns. To avoid the "contribution seam" naming-collision lesson ([ADR 0107](<redacted>.md) §Context), this module takes the distinct key **`provisioning`**; ADR 0092 keeps `hosting`. This ADR does **not** re-open or supersede 0092.
12
+
13
+ ---
14
+
15
+ ## Context
16
+
17
+ **What the ideas ask for.** Today, standing up a Cloud Bongos instance still leaves the owner with an irreducibly-manual infrastructure checklist. Idea 345 wants those steps offered *as a module, configured via the API*, so an owner doesn't manage infra by hand. Idea 303 wants an optional layer where Cloud Bongos *operates* branded instances for owners and pushes updates centrally — explicitly on the *same self-host artifact*.
18
+
19
+ **What already exists (the reusable substrate).**
20
+
21
+ - **The instance model is real and proven.** cloudbongos.com is a live second instance (shipped 2026-06-21): its own database, its own process/port, neutral branding, zero game code, **$0/mo extra** because it co-tenants the existing $14/mo droplet ([`docs/recipes/cloudbongos-standup.md`](../recipes/cloudbongos-standup.md)). An instance = a branding pack + enabled modules + owner/repo/OAuth binding + its own DB ([ADR 0062](<redacted>.md) §2).
22
+ - **"The same self-host artifact" is defined.** [ADR 0108](<redacted>.md): the core is packaged as `@cloudbongos/core` (`scripts/gds/package-core.js`, `core_version 1.14.0`, pinned by `tree_sha256`) and consumed as a versioned npm dependency via `resolveCoreRoot()`/`resolveInstanceRoot()` in `src/instance-config.js`. Central updates = `bongos upgrade` (a version-pin bump → `npm ci` → migrate → restart) — **O(1) per instance, not an O(instances × drift) merge**. (`bongos upgrade` is a stub until R86; the channel is specified, not yet exercised.)
23
+ - **`bongos init` scaffolds a project** (`scripts/gds/init.js`): an interview writes lean `config/branding.json` / `config/modules.json` / `config/hierarchy.json` overrides, materialises `.claude/`, seeds a first version + goal, and — critically — files the **irreducibly-manual owner steps as tracked kickoff tasks** rather than pretending launch is one command: register a GitHub OAuth app, first owner sign-in (seats the founding Archon), confirm the repo binding, and "production topology: TLS, real origins, managed Postgres." **That kickoff list is precisely the surface this module automates.**
24
+ - **Programmatic infra provisioning already works — for dev boxes.** The dev-box lifecycle ([ADR 0031](<redacted>.md)) creates/parks/wakes/destroys DigitalOcean droplets (`modules/dev-box/do-api.js`, DO API v2, dry-run by default), manages Cloudflare DNS records (`infra/box-dns-cloudflare.sh` — UPSERT + a blackhole-on-retire that avoids NXDOMAIN caching), boots servers unattended via cloud-init, and prices resources from a `SIZE_CATALOG` cost ledger. **This is the exact machinery a hosting module needs**, one layer up (a whole instance instead of a builder's box).
25
+ - **The trust-boundary + intent-queue pattern is established and non-negotiable.** Real-money / infra mutations **never** touch the internet-facing web process. The web route only **enqueues an intent** (`box_intents`); a separate **control-plane runner** (`scripts/gds/box.js`, driven by a systemd timer) is the *sole holder* of the cloud provider tokens, which live in a chmod-600 `/etc/<inst>/box.env` loaded via `EnvironmentFile=` — structurally out of reach of the web tier ([ADR 0016](<redacted>.md), [ADR 0031](<redacted>.md) §9.4).
26
+ - **The module contract is settled** ([`docs/modules-contract.md`](../modules-contract.md), [ADR 0083](<redacted>.md)): `module.json` manifest, `default:false` optional modules, one-way import boundary (a module reaches core only through `src/module-api.js`; never another module), rank-gated write routes (fitness-enforced), and module-owned namespaced migrations.
27
+
28
+ **The gaps (net-new work).** No single command turns the [`cloudbongos-standup.md`](../recipes/cloudbongos-standup.md) runbook into an automated provision. No **domain purchase/registration** capability exists (only DNS-*record* management on existing zones). Per-apex **TLS** is a manual Cloudflare Origin-Cert console step (the least-automated leg). There is no per-instance managed-DB provisioning at scale, no **billing/metering** (only a box *cost ledger*), and no **central fleet control plane** — per-repo GDS is locked ([ADR 0100](<redacted>.md) §3), so "instances Cloud Bongos operates" would be a new operator layer *above* the individual GDS DBs.
29
+
30
+ **The budget DNA that constrains this.** $5K total for build + first year; cheapest-viable-by-default; any high fixed monthly cost needs an ADR + a cheaper fallback ([CLAUDE.md §4](../../CLAUDE.md)). The project has twice rejected always-on control planes on cost grounds — Coder and a container pool were both declined in [ADR 0031](<redacted>.md) in favour of snapshot-and-park with fixed cost ≈ $0. A hosting module inherits that DNA: **near-zero fixed cost when idle.**
31
+
32
+ ---
33
+
34
+ ## Decision
35
+
36
+ ### 1. Ship it as a new `provisioning` module — the boundary
37
+
38
+ A new, portable, **`default:false`** module `modules/provisioning/` (`coreVersion: "^1.14.0"`), scaffolded with `bongos module new provisioning`. It **owns the web-tier request + state surface** for standing up and operating instance infrastructure, and nothing more.
39
+
40
+ **It owns:**
41
+ - **Tables** (namespaced `provisioning_*`, additive-only, in `modules/provisioning/migrations/provisioning_NNN_*.sql`):
42
+ - `provisioning_instances` — one row per instance the owner is provisioning/operating: owner, target ref, hosting shape (co-tenant | dedicated droplet), domain, DB name, allocated port, tier, lifecycle status, cost estimate.
43
+ - `provisioning_intents` — the enqueue queue (the `box_intents` analogue) the control-plane runner drains.
44
+ - `provisioning_events` — an append-only audit/log of provisioning actions.
45
+ - **HTTP routes** (`contributes.routes`, mounted under `/api/bongos` + the `/api/gds` alias), each self-rank-gated:
46
+ - own-scoped: create a provisioning request, read own instance state/cost, request teardown;
47
+ - Archon-scoped: the fleet roster + cost ledger + force actions (the `/boxes` Archon precedent).
48
+ - Optionally a hall **`uiSection`** (an "Instances" panel — own-scoped for owners, fleet view for Archon), reusing the dev-box UI pattern.
49
+ - A **port it provides**, e.g. `provisioning.instanceState`, so other code can read instance status via `seams.resolveOptional` without importing this module.
50
+
51
+ **It does NOT own** (hard boundary — the trust-boundary rule, §2): the cloud provider tokens, the code that calls DigitalOcean/Cloudflare/a registrar, or any privileged shell/SSH. Those live only on the control plane. It also does not own the *game*, *branding*, or *the instance's own GDS data* — an instance provisioned by this module is a normal Cloud Bongos instance with its own DB ([ADR 0100](<redacted>.md) §3).
52
+
53
+ ### 2. The web tier enqueues intents; a control-plane runner holds the tokens
54
+
55
+ Mirror the dev-box split exactly. A provisioning API call **writes a `provisioning_intents` row and returns** — it never calls a cloud API. A new control-plane CLI **`scripts/gds/provision.js`** (a sibling of `box.js`, deliberately *outside* the module import boundary so it may reuse control-plane code directly) is the **sole token-holder**; a systemd timer runs `provision.js run-intents --apply` on the control plane. Tokens live in the existing chmod-600 `/etc/<inst>/box.env` (or a sibling), loaded via `EnvironmentFile=`, **never** in the web process. The runner is **idempotent + dry-run-by-default** (the `box.js` / `do-api.js` posture), with fleet tagging + drift reconciliation so a leaked droplet/DNS record is detectable.
56
+
57
+ **Shared provider clients, no module→module import.** The DigitalOcean v2 client (`do-api.js`) and the Cloudflare DNS logic (`box-dns-cloudflare.sh`) that `provision.js` needs currently live inside `modules/dev-box/`. Because a module may not import another module, and both `box.js` and `provision.js` are control-plane CLIs (which *may* require code directly), the build extracts these into a **shared control-plane location** both CLIs use (a `scripts/gds/` or `infra/` client), rather than duplicating them. This is a small, mechanical refactor that leaves dev-box behaviour byte-identical.
58
+
59
+ ### 3. What "provision an instance" composes
60
+
61
+ The runner automates the [`cloudbongos-standup.md`](../recipes/cloudbongos-standup.md) runbook into one idempotent flow. Each step is classified by how automatable it is:
62
+
63
+ | Step | Automatable? | How |
64
+ |---|---|---|
65
+ | Server (co-tenant process **or** a dedicated droplet) | **Yes** | Co-tenant: allocate a port + DB on an existing box (the cloudbongos.com shape, $0 extra). Dedicated: `do-api.js` `createDroplet` + cloud-init (the box precedent). |
66
+ | Database | **Yes** | `createdb <inst>` + GDS-only `migrate.sh` (`MEDUSA_GDS_ONLY=1`, instance seeds off — [ADR 0105](<redacted>.md)). |
67
+ | App config + secrets | **Yes** | Write `config/branding.json`/`modules.json`/`hierarchy.json` (from the init spec) + a per-instance `/etc/<inst>/web.env` (chmod 600). |
68
+ | Process/service | **Yes** | Install + enable a per-instance systemd unit (the `cloudbongos.service` template). |
69
+ | DNS | **Yes** | Cloudflare A-record UPSERT via the shared client (§2/§4). |
70
+ | TLS | **Yes** (new approach) | Caddy on-demand ACME for the new host (§4) — removes the manual Origin-Cert leg. |
71
+ | Reverse proxy | **Yes** | Add the Caddy site block + reload. |
72
+ | **GitHub OAuth app** | **Assisted** | GitHub has no clean API to *create* an OAuth app; the runner generates exact instructions + captures the client id/secret the owner pastes back. Stays a guided step. |
73
+ | **First owner sign-in** | **Manual** | A human must sign in once to seat the founding Archon (config alone seats no one). Inherent. |
74
+ | **Domain registration** | **Deferred** | See §4 — bring-your-own-domain first; registrar-API purchase is a later task. |
75
+
76
+ ### 4. Domains: bring-your-own first; TLS via on-demand ACME
77
+
78
+ - **V1 = bring-your-own-domain.** The owner already owns a domain (or a delegated zone); the module manages **DNS records** on it via the shared Cloudflare client (the box precedent). **Domain *purchase/registration*** via a registrar API is genuinely net-new and is **deferred to its own later task** — it is not on the V1 critical path.
79
+ - **TLS via Caddy on-demand ACME (Let's Encrypt) for provisioned hosts**, instead of per-apex Cloudflare Origin Certs. The existing example.com/cloudbongos.com apexes keep their Origin Certs unchanged; **newly provisioned** hosts get automatic certificates with no manual console step. This directly eliminates "the single least-automated leg" the standup runbook calls out. (On-demand TLS must be allow-listed to hostnames the module actually provisioned, so it can't be abused to mint certs for arbitrary names.)
80
+
81
+ ### 5. The self-host vs managed split
82
+
83
+ **Both run the identical `@cloudbongos/core` artifact ([ADR 0108](<redacted>.md)).** Managed is not a fork, not open-core, not a proprietary layer — it is self-host + (a) the provisioning module pointed at Cloud Bongos's own infra, and (b) a central operator driving the *existing* `bongos upgrade` channel. This is exactly the posture [ADR 0065](<redacted>.md) §2 already recorded ("*a service offered on top of the same AGPL artifact — it does not change the artifact's license or the non-profit posture*").
84
+
85
+ | Dimension | **Self-host** | **Managed** (idea 303) |
86
+ |---|---|---|
87
+ | Artifact | identical `@cloudbongos/core` (pinned npm dep) | identical |
88
+ | Whose cloud account/tokens | the **owner's** (their DO/Cloudflare/registrar tokens, held on **their** control plane) | **Cloud Bongos's** tokens on Cloud Bongos infra |
89
+ | Control plane | the owner's own (their box runs `provision.js`) | a **central fleet control plane** — greenfield; sits *above* per-instance GDS DBs ([ADR 0100](<redacted>.md) §3) |
90
+ | The `provisioning` module | same module, enabled, configured with the owner's target | same module, target = Cloud Bongos infra |
91
+ | Updates | owner runs `bongos upgrade` | operator drives `bongos upgrade` across the fleet (same channel) |
92
+ | Billing | owner pays their own cloud bill directly | Cloud Bongos meters → invoices → collects (**deferred**, §6) |
93
+ | Licensing | AGPL; owner owes source to *their* users only if they modify + serve | AGPL; operator owes source (satisfied by the public mirror) |
94
+ | Buildable | **now**, on the shipped configurable-root substrate | **after** Mercury (R85) + a real `bongos upgrade` (R86) |
95
+
96
+ **The one-sentence rule:** *self-host and managed run the same artifact and the same provisioning module; the only differences are **whose credentials** the control plane holds and **who operates** it.*
97
+
98
+ ### 6. Cost posture
99
+
100
+ Inherit the budget DNA. **Default to the cheapest shape** — a co-tenant process + DB on an existing droplet ($0 new spend, the cloudbongos.com model) — and only graduate an instance to a dedicated droplet when justified. Idle dedicated instances follow the **snapshot-and-park** precedent (fixed cost ≈ $0). Reuse the `SIZE_CATALOG` per-size USD table for **cost visibility** in `provisioning_instances`. **Billing/metering/invoicing is out of scope for the module's first cut** and is a separate deferred track (it also depends on the V3 Stripe work); the managed layer needs it, self-host does not.
101
+
102
+ ### 7. Sequencing
103
+
104
+ - **Self-host provisioning is buildable now** — the configurable-root substrate (ADR 0108 W1–W4) and the box lifecycle are shipped. The module + runner + DNS/TLS + `bongos init` wiring do not wait on anything.
105
+ - **The managed layer is deferred** (idea 303 was always "post-C8, optional"). It is gated on **R85 (Mercury — the first real second-repo consumer on a pinned core; [#1689](https://example.com/builders#/task/1689))** proving the two-repo path end-to-end, and **R86 (a real `bongos upgrade` channel; [#1690](https://example.com/builders#/task/1690))**. The managed *fleet control plane* is itself a spec-first task, not a straight build.
106
+
107
+ ---
108
+
109
+ ## Alternatives considered
110
+
111
+ - **Reuse the `hosting` key / fold into [ADR 0092](<redacted>.md).** Rejected — 0092 is compute/storage *workload* brokering; conflating "where my inference runs" with "where my instance runs" would muddy both boundaries (the [ADR 0107](<redacted>.md) naming-collision lesson). Distinct `provisioning` key.
112
+ - **Provision directly from the web tier (let it hold DO/CF tokens).** Rejected — violates the [ADR 0016](<redacted>.md)/[ADR 0031](<redacted>.md) trust boundary. The intent-queue + control-plane runner is mandatory, not stylistic.
113
+ - **A full standing control plane per the Coder model.** Rejected on cost — the exact trade [ADR 0031](<redacted>.md) already declined. Systemd-timer-drained intents keep idle fixed cost ≈ $0.
114
+ - **Per-apex Cloudflare Origin Certs (automate the console step).** Rejected in favour of Caddy on-demand ACME — less bespoke, no Cloudflare-console dependency, and it removes the manual leg outright. Existing apexes keep their Origin Certs.
115
+ - **Domain purchase in V1.** Deferred — bring-your-own-domain covers the common case; registrar-API integration is additive and shouldn't gate the module.
116
+ - **Build managed first.** Rejected — it depends on unshipped Mercury + the upgrade channel, and idea 303 was always the optional later layer.
117
+
118
+ ---
119
+
120
+ ## Consequences
121
+
122
+ - **Unblocks the self-host productization arm of goal 26** — the manual [`cloudbongos-standup.md`](../recipes/cloudbongos-standup.md) checklist becomes an owner-driven, API-configured flow (idea 345 delivered), with the two irreducibly-human steps (OAuth-app creation, first sign-in) clearly demarcated.
123
+ - **The trust boundary is preserved** — the internet-facing process gains a provisioning surface but still holds no cloud credentials; all real infra mutation stays on the control plane.
124
+ - **`bongos init` gains an infra arm** — its infra answers flow into a provisioning request instead of only filing manual kickoff tasks.
125
+ - **Deferred / risks:** the **managed fleet control plane** is genuinely greenfield and sits above the locked per-repo GDS model — it needs its own spec once Mercury lands. **Billing/metering** is greenfield (no capability today). **Domain registration** is deferred. On-demand TLS must be hostname-allow-listed to what was actually provisioned. `bongos upgrade` is still a stub (R86).
126
+ - **Licensing unchanged** — managed is a service on the same AGPL artifact ([ADR 0065](<redacted>.md) §2); no open-core, no relicensing.
127
+ - **Follow-up tasks seeded** under BONGOS-V1 / goal 26 (idempotent seeder `scripts/gds/seed-provisioning-tasks.js`, `source_ref = <redacted>*`):
128
+ 1. **Scaffold the `provisioning` module** — manifest + `provisioning_*` tables + the web-tier intent/state routes (own + Archon), no token handling. *(buildable now)*
129
+ 2. **Extract the shared DO + Cloudflare control-plane clients** so `box.js` and `provision.js` reuse them without a module→module import (dev-box byte-identical). *(buildable now; enables 3)*
130
+ 3. **`scripts/gds/provision.js` control-plane runner + systemd timer** — drains `provisioning_intents`; composes server→DB→migrate→env→service→Caddy→healthz; idempotent, dry-run-default, drift-reconciling. *(deps: 1, 2)*
131
+ 4. **Automated DNS + Caddy on-demand ACME TLS** for a provisioned host. *(deps: 2, 3)*
132
+ 5. **Wire provisioning into `bongos init`** — infra answers → a provisioning request; keep OAuth-app + first-sign-in as guided/manual. *(deps: 1, 3)*
133
+ 6. **Hall UI "Instances" panel** — own-scoped for owners, Archon fleet view + cost. *(deps: 1)*
134
+ 7. **Spec the managed fleet control plane** (idea 303) — the central operator above per-instance GDS that stands up branded instances on Cloud Bongos infra and drives `bongos upgrade` across the fleet. *(spec-first; gated on R85 [#1689](https://example.com/builders#/task/1689) + R86 [#1690](https://example.com/builders#/task/1690))*
135
+ 8. **Managed billing/metering** — meter provisioned resources → invoice → payment. *(deferred; deps: 7)*
@@ -0,0 +1,72 @@
1
+ # 0112 — Private goals: a visibility flag + a two-sided membership-request queue (invitations + join-requests)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-07-03
5
+ - **Deciders:** jaxri (Metic, owner request), Claude
6
+
7
+ **Builds on / amends:** [ADR 0086](<redacted>.md) (goal-scoped work hierarchy — this ADR adds a privacy dimension + the self-service membership queue its §3 deferred), [ADR 0106](<redacted>.md) (goal owner/manager authority — the exact authority this ADR reuses for who may invite/approve), [ADR 0016](<redacted>.md) (server-enforced rank boundary — unchanged). Reuses the approval-queue shape of `access_requests` ([`modules/onboarding/routes/access-requests.js`](../../modules/onboarding/routes/access-requests.js)).
8
+
9
+ **Track:** `internal` (GDS / methodology — a Cloud Bongos platform capability).
10
+
11
+ ---
12
+
13
+ ## Context
14
+
15
+ Goals are shared, module-scoped workspaces ([ADR 0086](<redacted>.md)). Today a *normal* (non-protected-scope) goal is **open-join**: `POST /goals/:id/join` adds anyone who asks. Protected-scope goals are already Archon-mediated. There was no middle ground — no way for a goal's own owner/manager ([ADR 0106](<redacted>.md)) to say "this is a curated group; ask to join, or wait to be invited." ADR 0086 §3 explicitly deferred the self-service "request → approve" queue ("it co-evolves with that ADR"); this is that ADR for the normal-goal case.
16
+
17
+ The owner request (2026-07-03): let a goal manager **make a goal private and invite builders**, let any builder **request to join**, gate approval to the goal's **owner/manager (or an Archon)**, and surface both sides in a **home-page inbox**.
18
+
19
+ One product decision was made explicitly with the requester: **private means join-gated, not hidden.** A private goal still appears in the goals list with its title + progress; "private" controls who may *join*, not who may *see*. This keeps the change small and additive — no membership filter has to thread through the goals list, goal detail, roadmap, work board, and task queries (the "fully hidden" alternative, rejected below).
20
+
21
+ ## Decision
22
+
23
+ **A goal gains a `visibility` of `public` (default) or `private`. On a private goal, non-members cannot self-join — they are INVITED (and accept) or they REQUEST to join (and an owner/manager/Archon approves). Both directions are rows in one new `goal_membership_requests` queue, and each builder's actionable slice of that queue is their home-page inbox.**
24
+
25
+ ### 1. Visibility (task 1951)
26
+
27
+ - `goals.visibility text NOT NULL DEFAULT 'public' CHECK (visibility IN ('public','private'))` — a purely additive column (core migration `core_188_…`, because `goals` is a **core-owned** table; [ADR 0083](<redacted>.md) §Decision 5). Every existing goal defaults to `public` = today's behaviour, so nothing changes until a manager flips it.
28
+ - `PATCH /goals/:id/visibility { visibility }` — the owner, a manager, or an Archon (the `authorizeGoalManagement` gate, [ADR 0106](<redacted>.md)). (task 1952)
29
+
30
+ ### 2. The membership-request queue (task 1951)
31
+
32
+ One table, both directions, distinguished by `kind`:
33
+
34
+ | `kind` | who opens it | who resolves it | on accept/approve |
35
+ |---|---|---|---|
36
+ | `invite` | owner \| manager \| Archon, targeting `builder_id` | **only the target** (`builder_id`) — accept / decline | membership added |
37
+ | `request` | the builder themselves | owner \| manager \| Archon — approve / deny | membership added |
38
+
39
+ `goal_membership_requests(id, goal_id, builder_id, kind, status, note, created_by, resolved_by, timestamps)`, `status ∈ {pending, accepted, rejected, cancelled}`. A **partial unique index on `(goal_id, builder_id) WHERE status='pending'`** means one open ask per person+goal (the `access_requests` precedent) — an invite and a request can't both be open, and neither piles up duplicates. Resolved rows stay as the audit trail and never block a later re-ask.
40
+
41
+ **An invitation is consented, not a force-add.** It creates a *pending* row the invitee accepts from their inbox — distinct from the existing `POST /goals/:id/members` (kept byte-identical), which is the immediate owner/manager/Archon add. "Invite" is the new consented path; "add member" is the old direct one.
42
+
43
+ ### 3. Routes (task 1952) — every wall in-handler, pinned `any-builder`
44
+
45
+ Following the [ADR 0106](<redacted>.md) precedent (the wall is the in-handler pure ordered gate, not a rank middleware; each route pinned in `route-rank-check` so an accidental `requireRank` re-gate or a gate removal is a red build):
46
+
47
+ - `POST /goals/:id/join` — **changed**: on a `private` goal, a non-member who isn't owner/manager/Archon is refused `409 goal_private` ("request to join or wait for an invite") instead of being added. Public + protected-scope behaviour unchanged.
48
+ - `POST /goals/:id/requests { note? }` — a builder asks to join (refused on a public non-protected goal — just join — and if already a member).
49
+ - `POST /goals/:id/invitations { builder_id, note? }` — owner/manager/Archon opens a pending invite (protected-scope keeps the Archon-only + Metic+-target rule).
50
+ - `POST /goals/:id/requests/:reqId/respond { action: approve|deny }` — owner/manager/Archon; approve → add member.
51
+ - `POST /goals/:id/invitations/:reqId/respond { action: accept|decline }` — **only the target** may resolve their own invite; accept → add member.
52
+ - `GET /goals/inbox` — the caller's `{ invitations, joinRequests, myPendingRequests }` (task 1954's home widget + task 1953's goals page read it). Mounted before `GET /goals/:id` so `inbox` isn't captured as an id (the `/goals/reorder` precedent).
53
+
54
+ The membership add on accept/approve is atomic with the resolve: `resolveMembershipRequest` only moves a row **from `pending`**, so a re-submitted resolve can't double-add.
55
+
56
+ ### 4. The inbox scope (task 1954)
57
+
58
+ `listInboxFor(builderId)` returns three buckets: invitations addressed to me, join-requests on goals I **own or manage** (`goals.created_by = me` OR a `goal_members 'lead'` row), and my own outstanding requests. Requests only ever exist on a private goal someone made private — so an owner/manager always exists and a request never lands in nobody's inbox. An Archon can still approve any request via the route; the inbox stays scoped to what a builder owns/manages so it doesn't drown an Archon in every goal's queue.
59
+
60
+ ## Consequences
61
+
62
+ - **Additive + reversible.** Default `public` means zero behaviour change on every existing goal; the whole feature is dark until a manager flips a goal private. Each of the four build phases (schema, API, goals-page UI, home inbox) ships independently.
63
+ - **Reuses the existing authority model wholesale** — no new notion of "who runs a goal"; invitations/approvals gate on the same owner/manager/Archon as role changes and conflict resolution ([ADR 0106](<redacted>.md)).
64
+ - **Protected-scope goals are unchanged** — their stronger Archon-mediation ([ADR 0086](<redacted>.md) §3) still governs; `visibility` is orthogonal and additive on top.
65
+ - **Private = join-gated, not hidden.** A non-member can still see a private goal's title + progress. If true concealment is ever wanted it needs its own ADR (a membership filter across list/detail/roadmap/board/tasks) — deliberately **not** built now.
66
+
67
+ ## Alternatives considered
68
+
69
+ - **Fully hidden private goals (invisible to non-members) — rejected** (owner). Stronger privacy, but forces a membership filter through the goals list, goal detail, roadmap, work board, and every task query — a large surface for a feature whose ask is "control who joins." Join-gating delivers the intent with a purely additive change.
70
+ - **Invite = immediate add (no accept step) — rejected.** The owner asked for an inbox that *accepts* invitations, so an invite is consented (pending until the invitee accepts). The immediate-add path already exists as `POST /goals/:id/members` and is kept.
71
+ - **Two separate tables (invitations, join_requests) — rejected.** They share the same lifecycle (pending → accepted/rejected/cancelled), the same partial-unique "one open ask per person+goal" rule, and feed the same inbox. One table with a `kind` discriminator is less machinery and makes the mutual-exclusion index trivial.
72
+ - **Requests allowed on public goals — rejected.** A public goal is open-join; a request there is redundant. Requests are the private-goal path; the route refuses a request on a public non-protected goal.
@@ -0,0 +1,41 @@
1
+ # ADR 0113 — Per-builder art sandbox (task 885): descope to the Studio only, superseded by ADR 0044/0052
2
+
3
+ **Date:** 2026-07-03
4
+ **Context:** [task 885](https://example.com/builders#/task/885) ("Per-builder art sandbox + sprite studio"), goal 25 (builder experience). Companion to [ADR 0044](<redacted>.md) (per-box live game preview), [ADR 0052](<redacted>.md) (game-only preview entry, every rank), and [ADR 0083](<redacted>.md) (the game's carve into `modules/game/`).
5
+ **Status:** Accepted.
6
+ **Track:** `internal` (builder experience / dev box).
7
+
8
+ ## Problem
9
+
10
+ Task 885 was filed 2026-06-09 with a full 8-part build plan: a walkable single-player preview reached by skipping the multiplayer connect, a static file server + systemd unit for `sandbox-<login>.example.com`, a `cf-tunnel.js` multi-ingress change, box-provisioning wiring, a "reset to main" script, and a sprite/animation studio — plus retiring the frozen `staging.example.com` environment as "Part C".
11
+
12
+ By the time this session picked the task up (2026-07-03), the plan had gone stale on two independent axes:
13
+
14
+ 1. **Most of it already shipped, differently, one day later.** ADR 0044 (2026-06-10, task [#897](https://example.com/builders#/task/897)) already gives every full-clone box a live `sandbox-<login>.example.com` — not a static-file simplification, but the box's own real game server (`box-game-preview.service`, degraded-DB, real Colyseus rooms) over the same Cloudflare named tunnel the terminal already uses. ADR 0052 (2026-06-13, task [#1001](https://example.com/builders#/task/1001)/[#1002](https://example.com/builders#/task/1002)) then widened it to every rank via a dedicated game-only entry (`src/preview-server.js`) and put the game paths in the starter sparse clone. So task 885's Part A1 (walkable preview) and Part B (static server + systemd unit + `cf-tunnel.js` multi-ingress + provisioning wiring) describe infrastructure that exists already, under a different, better design (a real multiplayer world instead of an offline single-player mode) and a different hostname/tunnel mechanism than the one it proposed building.
15
+ 2. **The repo moved underneath it.** The game client the plan's touches\[\] pointed at (`public/game/scenes/WorldScene.js`, `public/game/player/Player.js`, `src/bongos/cf-tunnel.js`, `src/bongos/routes/box.js`, `src/bongos/boxes.js`) was carved into modules under ADR 0083/0093: the game now lives at `modules/game/public/game/...`, the tunnel CLI at `scripts/gds/cf-tunnel.js`, and the box routes/db at `modules/dev-box/{boxes.js,routes/box.js}`. None of the file paths in the original breakdown table resolve today.
16
+
17
+ Separately, task 885's Part C ("retire the frozen staging env") directly contradicts a standing decision: `docs/recipes/staging-environment.md` records a deliberate **defer-not-delete** call from 2026-05-29 — staging was frozen (not torn down) specifically because re-provisioning it later costs real time, and the environment costs ~$0/mo idle. Task 885 re-proposing its removal, a week later, with no reference to that decision, is exactly the kind of drift this ADR exists to catch before code gets written against it.
18
+
19
+ ## Decision
20
+
21
+ **Descope task 885 to the one part of its plan that is still real, unbuilt, and non-duplicative: the sprite/animation Studio.** Everything else in the original breakdown is either already shipped (Parts A1/B, under ADR 0044/0052) or conflicts with a standing decision (Part C, staging) and is dropped from this task's scope without re-litigating it here.
22
+
23
+ The Studio — a sprite/animation reviewer at `/studio` (pick a sprite, play its walk cycle, flip direction, step frames, zoom, swap background) — has no existing equivalent. It gets built as a *viewer that imports the game's own code*, attached to the **existing** sandbox rather than a new one:
24
+
25
+ - It layers onto `modules/game/public/` as a static page (`studio.html` + `game/studio/studio.js`), served automatically by the `express.static(GAME_PUBLIC, …)` mount both `server.js` and `src/preview-server.js` already have — no new server, tunnel, or systemd unit. The precedent is `/art` (task 1262's generated-art gallery), already living in `src/preview-server.js` as an explicit route; `/studio` needs no explicit route at all since it's a static page, not a per-request render.
26
+ - It auto-discovers sprites from `/assets/tiles/manifest.json` (the same cache `tilePalette.js:preloadTilePalette` already loads) and uses the game's own key helpers (`PLAYER_DIRS`/`WALK_FRAMES`/`playerTextureKey`/`playerWalkTextureKey` in `modules/game/public/game/player/playerSprite.js`) so new sprites need zero studio edits.
27
+ - The one shared extraction task 885 correctly identified is still needed: the right-facing mirror logic in `Player._applyIdleTexture`/`_applyWalkTexture` (`modules/game/public/game/player/Player.js:59-79`) becomes `modules/game/public/game/player/spriteFacing.js`, called by both `Player.js` and the studio — a behavior-preserving refactor, not new logic.
28
+
29
+ This is filed as [a single new child task](https://example.com/builders#/task/885) under 885 rather than the original 8, since the remaining scope is small enough not to need a multi-task breakdown.
30
+
31
+ ## Consequences
32
+
33
+ - No duplicate sandbox mechanism, no `cf-tunnel.js` change, no new systemd unit, no provisioning rewiring — the existing ADR 0044/0052 sandbox is left alone.
34
+ - Staging stays frozen-not-deleted, unchanged from the 2026-05-29 decision; if retiring it is still wanted, that needs its own task that references (and explicitly overrides, with reasoning) that decision — not a drive-by line item in an unrelated epic.
35
+ - The Studio ships as a small, self-contained addition: two new static files + one extraction + (if wanted) a prod-only gate so `/studio` doesn't show up as a public game page — left to the child task's judgment, since the `/art` precedent already runs unguarded on the sandbox and the studio is no more sensitive.
36
+ - Future planning-session epics that embed a multi-task breakdown table should be re-validated against current `git log`/file layout before their child tasks are minted, not executed mechanically — this is the second time in this repo a stale breakdown table was caught only by checking the live repo first (companion precedent: the ADR 0088 dependency backfill session).
37
+
38
+ ## Alternatives considered
39
+
40
+ - **Execute the original 8-task breakdown as written** — rejected: would build a second, weaker sandbox mechanism (static files, offline single-player) alongside the real one (live degraded-DB multiplayer) that already serves the same hostname, and would reopen the staging-retirement decision without cause.
41
+ - **Silently drop task 885** — rejected: the Studio idea is genuinely good and still unbuilt; dropping the whole task would lose it.
@@ -0,0 +1,32 @@
1
+ # ADR 0114 — Instance docs-discovery contract (how an agent finds its hall + docs from config alone)
2
+
3
+ **Date:** 2026-07-04
4
+ **Status:** Accepted.
5
+ **Context:** [task 2005](https://builders.example.com#/task/2005) (BONGOS-V1, from the 2026-07-04 CLAUDE.md review, bullet 6). Companion to [ADR 0062](<redacted>.md) (core↔host split), [ADR 0109](<redacted>.md) (self-describing OpenAPI + hosted `/docs`), and [ADR 0029](<redacted>.md) (off-box status page).
6
+
7
+ ## Problem
8
+
9
+ CLAUDE.md tells an agent to "read docs on your instance's builders' hall (`domains.buildersOrigin`)," but nothing *pins* how a fresh, self-hosted instance's agent reliably locates its doc surfaces. The pointer was one line of prose citing one config key — hand-waving, not a contract. A second instance standing up on its own domain needs to resolve "where are my hall, my rendered docs, my status page?" **from config alone, with no hard-coded `example` anywhere.** Today the pieces exist but were never named together as the discovery contract:
10
+
11
+ - `config/branding.json` `domains.{publicOrigin,buildersOrigin,statusOrigin}` — the config source of truth.
12
+ - `/docs` + `/docs/openapi.json` — the rendered API reference + machine spec ([ADR 0109](<redacted>.md)), served on the instance's own origin.
13
+ - `GET <publicOrigin>/api/bongos` (and the permanent `/api/gds` alias) — the machine-discovery index (task 1918), CORS-open + unauthenticated, which answered with `docs`/`openapi` pointers but **not** the hall or status origins.
14
+
15
+ ## Decision
16
+
17
+ Pin a three-layer docs-discovery contract. Every layer is derivable from config or from a single unauthenticated call — no host is ever hard-coded.
18
+
19
+ 1. **Config is the source of truth.** `config/branding.json` `domains` carries the surfaces:
20
+ - `domains.buildersOrigin` — the **builders' hall**: the canonical doc-reading surface (task/idea/blocker refs render as working links; the primer + generated diagrams + repo docs render there).
21
+ - `domains.publicOrigin` — the **instance origin**: `/docs` renders the API reference and `/docs/openapi.json` is the machine-readable OpenAPI 3.1 spec.
22
+ - `domains.statusOrigin` — the **status page**: the off-box fallback for project state when the hall is down ([ADR 0029](<redacted>.md)), though it does not render full docs.
23
+ 2. **The machine-discovery index is the zero-config entry point.** `GET <publicOrigin>/api/bongos` (and the permanent `/api/gds` alias) returns a small JSON map that now advertises the doc surfaces themselves — `hall`, `status`, and `public` origins alongside `docs`/`openapi`. An agent or client that knows only *one* origin (or reaches the API root by accident) can bootstrap every other doc surface from that single response, with no config file and no hard-coded host.
24
+ 3. **Resolution order for an agent.** (a) Read `config/branding.json` `domains` when the checkout is present; (b) otherwise `GET <origin>/api/bongos` and read `hall`/`status`/`docs`; (c) the hall is the canonical doc surface, the status page the outage fallback, `/docs` the API reference. `github.com` is the code host only — never the doc-reading surface (a bare `#NNN` mis-autolinks there).
25
+
26
+ ## Consequences
27
+
28
+ - **The discovery index gains `hall`/`status`/`public`** (`src/bongos/serve-internal.js`). This is the concrete "resolve with no hard-coded example" guarantee: the values come from `branding().domains`, so a second instance's index advertises *its* origins automatically.
29
+ - **`docs/branding-contract.md`** documents the docs-discovery contract so a fresh instance knows these `domains.*` fields are load-bearing, not decorative.
30
+ - **CLAUDE.md's preamble references this ADR** instead of hand-waving a single config key.
31
+ - **No new required config field** — the contract formalizes the existing `domains.{publicOrigin,buildersOrigin,statusOrigin}` keys. `buildersOrigin`/`statusOrigin` stay optional in the contract (an instance may ship without a hall/status surface); when absent the index returns `null` for that pointer and the agent falls back to `/docs` on `publicOrigin`.
32
+ - **Portability, not behavior.** No endpoint semantics change; the index adds fields (back-compatible). The [ADR 0016](<redacted>.md) trust boundary is untouched — the index names only public locations and remains unauthenticated.
@@ -0,0 +1,31 @@
1
+ # ADR 0115 — Scheduled-routines portability (self-host + multi-builder)
2
+
3
+ **Date:** 2026-07-04
4
+ **Status:** Accepted (contract; spike deliverable).
5
+ **Context:** [task 2014](https://builders.example.com#/task/2014) (BONGOS-V1, from the 2026-07-04 CLAUDE.md review, bullet 241). The ~17 autonomous cron routines under [`.claude/scheduled-tasks/`](../../.claude/scheduled-tasks/) (`overnight-builder`, `idea-triage-nightly`, `overnight-code-review`, `bfg`, `security-review-weekly`, box lifecycle, audits, newcomer restock, …) were written for *this* instance. A self-hosted, multi-builder instance needs a defined model for which run instance-wide vs per-builder, how a fresh instance inherits/configures them, and what a builder gets by default. Companion to [ADR 0062](<redacted>.md) (core↔host split) and [ADR 0024](<redacted>.md) (the MAS the routines belong to).
6
+
7
+ ## Problem
8
+
9
+ The routines are instance-agnostic in intent but were authored against OTB: their prose cites `example.com` API bases and `~/.config/otb` paths, and there was **no declared model** for how they scale to multiple builders or scaffold onto a fresh instance. Two questions were open: (1) in a multi-builder world, does a routine run once for the instance or once per builder? (2) how does a fresh instance inherit + configure the set, and what does an individual builder get by default?
10
+
11
+ ## Decision
12
+
13
+ **Every scheduled routine is INSTANCE-WIDE — one scheduled run per instance, never one cron per builder.** A routine's *per-builder effect* (the BFG scores each builder; `newcomer-floor` restocks per discipline; `overnight-builder` may claim on any builder's behalf) comes from **iterating the builder set inside the routine body**, not from N per-builder schedules. This keeps scheduling O(1) in builders and the trust surface single (one control-plane scheduler, one autonomy gate), not O(builders).
14
+
15
+ The contract is made concrete + configurable by a **manifest**, [`config/scheduled-routines.json`](../../config/scheduled-routines.json), declaring per routine:
16
+
17
+ - `scope` — always `instance-wide` in v1 (the model above); `builderAware: true` marks the ones whose *body* iterates builders.
18
+ - `enabled` — the default-on/off for a fresh instance. **Read-only hygiene/ops routines default ON** (box lifecycle, audits, drift checks, newcomer restock, peer-vote tally, dep/security audits). **Autonomous build routines default OFF** (`overnight-builder`, `overnight-code-review`, `idea-triage-nightly`) — they carry `requiresAutonomy: true` and are a no-op until the instance arms `<PREFIX>_AUTONOMY_ENABLED` (matching today's default-unset OTB behavior). The BFG's cross-builder WRITE (Part C) stays independently gated by `BFG_WRITE_ENABLED` + a provisioned principal token.
19
+ - `cadence` — a scheduler hint (hourly/daily/nightly/weekly/on-merge); the actual cron lives in the operator's scheduler config.
20
+ - `requiresAutonomy` — whether the routine is inert until the autonomy flag is armed.
21
+
22
+ **Inheritance.** The routines ship in the core template (`.claude/scheduled-tasks/`); a fresh instance inherits the whole set + this manifest. The operator opts in/out and sets cadence **in the manifest**, without editing a routine. A vanilla instance therefore boots with the safe subset (read-only ops on, autonomous build off).
23
+
24
+ **What a builder gets by default.** Builders do **not** schedule their own routines in v1 — these are instance/ops-level. A builder's *involvement* is governed by their per-builder settings (autonomy opt-in, `wandering`, model allocation), not by this manifest. Per-builder scheduling is explicitly out of scope for v1 (a future extension could let a builder opt a builder-aware routine in/out for themselves).
25
+
26
+ ## Consequences
27
+
28
+ - **`config/scheduled-routines.json` is the portability surface** — the single place an operator configures the routine fleet; the scheduler + a future `bongos init` read it to decide what to arm.
29
+ - **Portability debt flagged, not fully paid here (spike scope):** several routine `SKILL.md` files hardcode `example.com` / `~/.config/otb` in prose. The contract requires routines to resolve instance identity from config (`branding().domains`, the instance config dir) rather than hardcode it; genericizing all ~17 prose files is a **follow-up** (a mechanical sweep), captured as its own task — not part of this decision.
30
+ - **No behavior change today.** OTB keeps running every routine exactly as before; the manifest simply records the model it already follows (instance-wide) and the safe defaults. The `requiresAutonomy` routines remain OFF (OTB has not armed autonomy).
31
+ - **CLAUDE.md §12** references this contract + the manifest instead of just naming "~17 routines."