@bongos/core 1.19.714 → 1.19.724

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 (422) hide show
  1. package/.bongos-core.json +488 -413
  2. package/.claude/skills/backlog-review/SKILL.md +3 -3
  3. package/.claude/skills/blocker-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-solve/SKILL.md +2 -2
  5. package/.claude/skills/builder-reauth/SKILL.md +1 -1
  6. package/.claude/skills/builder-redteam/SKILL.md +1 -1
  7. package/.claude/skills/builder-ship/SKILL.md +1 -1
  8. package/.claude/skills/builder-start/SKILL.md +1 -1
  9. package/.claude/skills/design/SKILL.md +2 -2
  10. package/.claude/skills/feedback/SKILL.md +1 -1
  11. package/.claude/skills/goal-create/SKILL.md +1 -1
  12. package/.claude/skills/goal-review/SKILL.md +2 -2
  13. package/.claude/skills/idea-triage/SKILL.md +5 -5
  14. package/.claude/skills/merge-mode/SKILL.md +4 -4
  15. package/.claude/skills/new-project/SKILL.md +17 -17
  16. package/.claude/skills/planning-session/SKILL.md +11 -11
  17. package/.claude/skills/recall/SKILL.md +2 -2
  18. package/.claude/skills/strand-fix/SKILL.md +1 -1
  19. package/.devcontainer/README.md +2 -2
  20. package/CONTRIBUTING.md +2 -2
  21. package/GOVERNANCE.md +4 -4
  22. package/clients/bongos-client/README.md +1 -1
  23. package/clients/bongos-client/bongos-client.global.js +4 -0
  24. package/clients/bongos-client/index.cjs +4 -0
  25. package/clients/bongos-client/index.d.ts +5 -0
  26. package/clients/bongos-client/index.mjs +4 -0
  27. package/config/branding.neutral.json +4 -2
  28. package/docs/adr/0001-stack-choice-single-vps.md +2 -2
  29. package/docs/adr/0002-digitalocean-over-hetzner.md +1 -1
  30. package/docs/adr/0008-google-chat-oauth-user-auth.md +1 -1
  31. package/docs/adr/0009-autotile-architecture.md +1 -1
  32. package/docs/adr/0011-terrain-id-rendering-model.md +3 -3
  33. package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +1 -1
  34. package/docs/adr/0014-families-canonical-over-vocabulary.md +1 -1
  35. package/docs/adr/0015-task-dependencies-and-auto-promotion.md +1 -1
  36. package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +1 -1
  37. package/docs/adr/0018-three-rank-model-goes-live.md +3 -3
  38. package/docs/adr/0020-security-model-public-stub.md +9 -9
  39. package/docs/adr/0021-per-builder-skill-model-preferences.md +2 -2
  40. package/docs/adr/0022-secrets-policy.md +5 -5
  41. package/docs/adr/0024-cloneable-repo-local-first-memory.md +3 -3
  42. package/docs/adr/0024-multi-agent-system-architecture.md +10 -10
  43. package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +1 -1
  44. package/docs/adr/0025-structured-criterion-task-link.md +1 -1
  45. package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +13 -13
  46. package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +14 -14
  47. package/docs/adr/0029-status-page-outage-resilience.md +1 -1
  48. package/docs/adr/0030-builders-hall-live-updates.md +1 -1
  49. package/docs/adr/0031-cloud-dev-environments-for-builders.md +7 -7
  50. package/docs/adr/0032-discord-mirror-of-gds.md +3 -3
  51. package/docs/adr/0033-discord-bot-service-principal.md +4 -4
  52. package/docs/adr/0034-thetes-graduated-newcomer-rank.md +1 -1
  53. package/docs/adr/0035-builder-onboarding-three-paths.md +4 -4
  54. package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +1 -1
  55. package/docs/adr/0037-discord-channel-management.md +1 -1
  56. package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +5 -5
  57. package/docs/adr/0039-setup-first-onboarding-ux.md +6 -6
  58. package/docs/adr/0040-remote-control-default-browser-onramp.md +3 -3
  59. package/docs/adr/0041-temporary-grader-bypass-killswitch.md +2 -2
  60. package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +5 -5
  61. package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +2 -2
  62. package/docs/adr/0044-mediterranean-palette-replacement.md +1 -1
  63. package/docs/adr/0044-per-box-live-game-preview.md +1 -1
  64. package/docs/adr/0046-sandbox-first-review-gate.md +1 -1
  65. package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +1 -1
  66. package/docs/adr/0049-split-parallel-safety-contract.md +1 -1
  67. package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +2 -2
  68. package/docs/adr/0051-full-session-transcript-corpus.md +2 -2
  69. package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +1 -1
  70. package/docs/adr/0053-scoped-dev-box-session.md +1 -1
  71. package/docs/adr/0054-session-token-reward-cost-plus.md +7 -7
  72. package/docs/adr/0055-server-mediated-branch-publish.md +2 -2
  73. package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +3 -3
  74. package/docs/adr/0057-container-cost-ledger.md +1 -1
  75. package/docs/adr/0057-discord-archon-approval-channels.md +2 -2
  76. package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +6 -6
  77. package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +11 -11
  78. package/docs/adr/0060-gds-retrieval-layer.md +3 -3
  79. package/docs/adr/0061-context-layer-decomposition.md +2 -2
  80. package/docs/adr/0062-medusa-instance-model-decoupling.md +5 -5
  81. package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +2 -2
  82. package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +3 -3
  83. package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +5 -5
  84. package/docs/adr/0066-generated-file-map-sections.md +2 -2
  85. package/docs/adr/0067-session-start-fast-forward-pull.md +1 -1
  86. package/docs/adr/0068-shared-art-key-for-newcomers.md +1 -1
  87. package/docs/adr/0069-hall-live-channel-sse-decouple.md +3 -3
  88. package/docs/adr/0070-deterministic-session-card-delivery.md +1 -1
  89. package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +2 -2
  90. package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +2 -2
  91. package/docs/adr/0072-dev-box-code-staleness-visibility.md +2 -2
  92. package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +3 -3
  93. package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +2 -2
  94. package/docs/adr/0076-in-session-deterministic-compaction.md +2 -2
  95. package/docs/adr/0077-content-addressed-llm-cache.md +2 -2
  96. package/docs/adr/0078-deterministic-first-cron.md +3 -3
  97. package/docs/adr/0079-value-gated-autonomous-engagement.md +2 -2
  98. package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +3 -3
  99. package/docs/adr/0081-tool-agnostic-design-layer.md +3 -3
  100. package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +2 -2
  101. package/docs/adr/0083-modular-architecture-strangler-build-plan.md +3 -3
  102. package/docs/adr/0085-remove-default-per-builder-spend-cap.md +2 -2
  103. package/docs/adr/0086-goal-scoped-work-hierarchy.md +15 -15
  104. package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +5 -5
  105. package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +1 -1
  106. package/docs/adr/0088-consistent-character-generative-animation.md +5 -5
  107. package/docs/adr/0089-modular-multi-model-adversarial-grader.md +15 -15
  108. package/docs/adr/0090-metic-task-authoring.md +8 -8
  109. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +3 -3
  110. package/docs/adr/0092-hosting-module-and-on-prem-target.md +11 -11
  111. package/docs/adr/0093-tranche-2-core-carve-sequence.md +5 -5
  112. package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +1 -1
  113. package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +6 -6
  114. package/docs/adr/0095-cross-agent-context-management.md +5 -5
  115. package/docs/adr/0096-require-reward-before-workable.md +5 -5
  116. package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +2 -2
  117. package/docs/adr/0097-retroactive-reward-backfill.md +4 -4
  118. package/docs/adr/0098-public-mirror-publish-manifest.md +3 -3
  119. package/docs/adr/0099-delayed-redacted-mirror-export.md +1 -1
  120. package/docs/adr/0100-two-repo-instance-model.md +6 -6
  121. package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +9 -9
  122. package/docs/adr/0102-finish-bounding-the-kernel.md +1 -1
  123. package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +6 -6
  124. package/docs/adr/0103-gdsv4-bongos-consolidation.md +3 -3
  125. package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +3 -3
  126. package/docs/adr/0105-instance-seed-migrations-out-of-core.md +2 -2
  127. package/docs/adr/0106-goal-owner-manager-authority.md +2 -2
  128. package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +6 -6
  129. package/docs/adr/0108-instance-composition-configurable-root.md +6 -6
  130. package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +3 -3
  131. package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +1 -1
  132. package/docs/adr/0111-instance-hosting-provisioning-module.md +18 -18
  133. package/docs/adr/0112-private-goals-invitations-join-requests.md +7 -7
  134. package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +1 -1
  135. package/docs/adr/0114-instance-docs-discovery-contract.md +4 -4
  136. package/docs/adr/0115-scheduled-routines-portability.md +1 -1
  137. package/docs/adr/0117-api-versioning-and-deprecation-policy.md +1 -1
  138. package/docs/adr/0118-api-contract-source-of-truth-code-first.md +1 -1
  139. package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +2 -2
  140. package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +1 -1
  141. package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +3 -3
  142. package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +1 -1
  143. package/docs/adr/0124-typed-api-response-bodies.md +2 -2
  144. package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +2 -2
  145. package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +3 -3
  146. package/docs/adr/0127-cross-box-fleet-observability.md +1 -1
  147. package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +3 -3
  148. package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +4 -4
  149. package/docs/adr/0130-provision-remote-exec-over-ssh.md +4 -4
  150. package/docs/adr/0131-rank-scoped-skill-visibility.md +2 -2
  151. package/docs/adr/0132-cohost-fleet-control-plane-migration.md +2 -2
  152. package/docs/adr/0133-github-app-manifest-onboarding-signin.md +1 -1
  153. package/docs/adr/0134-private-first-npm-distribution.md +3 -3
  154. package/docs/adr/0135-module-upstream-submission-interim-queue.md +1 -1
  155. package/docs/adr/0136-update-channel-subscription-policy.md +2 -2
  156. package/docs/adr/0137-upstream-publish-policy-manual-owner-gated.md +6 -6
  157. package/docs/adr/0138-bundled-module-deps-declared-per-module.md +4 -4
  158. package/docs/adr/0142-project-context-is-prose-only.md +2 -2
  159. package/docs/adr/0143-onboarding-repo-picker-oauth-scope.md +2 -2
  160. package/docs/adr/0144-devbox-rehome-onto-cloudbongos-plane.md +2 -2
  161. package/docs/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md +2 -2
  162. package/docs/adr/0146-configurable-reward-mode-cost-plus-only.md +4 -4
  163. package/docs/adr/0147-standalone-live-docs-regen.md +1 -1
  164. package/docs/adr/0149-bongos-dev-local-launcher.md +1 -1
  165. package/docs/adr/0150-box-first-boot-bringup-vendored-instances.md +3 -3
  166. package/docs/adr/0151-governance-permissions-as-atom-ranks-as-roles.md +20 -20
  167. package/docs/adr/0152-landing-gate-served-by-the-core-app.md +2 -2
  168. package/docs/adr/0152-metic-task-abandonment.md +7 -7
  169. package/docs/adr/0153-sequential-chain-runner.md +1 -1
  170. package/docs/adr/0154-goal-owner-criterion-authoring.md +7 -7
  171. package/docs/adr/0155-adopt-private-repo-widen-oauth-scope.md +2 -2
  172. package/docs/adr/0156-user-set-display-name-wins.md +1 -1
  173. package/docs/adr/0157-archon-is-rank-and-identity-only.md +10 -10
  174. package/docs/adr/0158-choke-point-verdict-taxonomy.md +1 -1
  175. package/docs/adr/0159-merge-gate-reconciliation.md +1 -1
  176. package/docs/adr/0160-main-audit-repo-verifiable-caller.md +1 -1
  177. package/docs/adr/0161-publish-on-merge.md +2 -2
  178. package/docs/adr/0163-legacy-display-name-resolution.md +1 -1
  179. package/docs/adr/0165-instances-hookless-by-default.md +1 -1
  180. package/docs/adr/0166-module-maintenance-and-deprecation-policy.md +3 -3
  181. package/docs/adr/0167-gate-trust-link-agpl-default.md +2 -2
  182. package/docs/adr/0167-module-catalog-source-vs-provenance.md +3 -3
  183. package/docs/adr/0169-bongos-serve-server-bring-up.md +1 -1
  184. package/docs/adr/0171-profile-rollup-join-and-consent.md +1 -1
  185. package/docs/adr/0172-editable-rank-roles-substrate-axis.md +2 -2
  186. package/docs/adr/0172-per-craft-compensation-ideator-credit-lane.md +4 -4
  187. package/docs/adr/0173-legacy-multi-ship-shortfall-not-backfilled.md +1 -1
  188. package/docs/adr/0174-government-terminology-ranks-not-roles.md +1 -1
  189. package/docs/adr/0177-goal-membership-kind.md +3 -3
  190. package/docs/adr/0178-the-copy-desk-flag-and-queue.md +1 -1
  191. package/docs/adr/0179-board-membership-predicate-grammar.md +1 -1
  192. package/docs/adr/0181-teardown-state-gate-and-address-retention.md +1 -1
  193. package/docs/adr/0182-project-visibility-two-axes.md +1 -1
  194. package/docs/adr/0183-criteria-close-themselves.md +1 -1
  195. package/docs/adr/0184-ship-requires-an-assurance.md +1 -1
  196. package/docs/adr/0185-spark-handoff-credit-split.md +1 -1
  197. package/docs/adr/0186-per-project-idea-templates.md +1 -1
  198. package/docs/adr/0187-collab-four-decisions.md +1 -1
  199. package/docs/adr/0187-oauth-handshake-cookie-lifetime.md +1 -1
  200. package/docs/adr/0188-patrol-runs-on-ci-not-the-server.md +2 -2
  201. package/docs/adr/0189-baseline-floors-and-the-freeze-detector.md +2 -2
  202. package/docs/adr/0191-majority-and-the-author-who-may-not-decide-alone.md +1 -1
  203. package/docs/adr/0192-a-category-orients-and-authorises-nothing.md +2 -2
  204. package/docs/adr/0193-pause-task-scoped-box-slices.md +1 -1
  205. package/docs/adr/0195-adr-numbers-are-checked-like-migration-numbers.md +2 -2
  206. package/docs/adr/0196-chrome-world-token-contract-and-the-landing-sheets.md +2 -2
  207. package/docs/adr/0197-the-ui-design-module.md +1 -1
  208. package/docs/adr/0198-third-party-skill-vendoring-policy.md +1 -1
  209. package/docs/adr/0203-doorway-changelog-out-of-module-api.md +2 -2
  210. package/docs/adr/0204-the-apex-is-dark-only.md +2 -2
  211. package/docs/adr/0205-federated-checkin-needs-the-hubs-own-signin-witness.md +1 -1
  212. package/docs/adr/0206-own-scoped-session-revocation-no-absolute-ceiling.md +1 -1
  213. package/docs/adr/0207-connections-implementation-departures-and-honest-limits.md +1 -1
  214. package/docs/adr/0208-application-lifecycle-the-handle-waits-and-the-vouch-has-no-minter.md +2 -2
  215. package/docs/adr/0209-one-budget-for-the-account-existence-oracle.md +1 -1
  216. package/docs/adr/0210-scouting-graduates-on-an-instance-asserted-owner-claim.md +1 -1
  217. package/docs/adr/0212-connections-on-the-profile-surface-and-addressing.md +1 -1
  218. package/docs/adr/0213-platform-terms-acceptance-is-the-hubs-own-witness.md +2 -2
  219. package/docs/adr/0215-the-recruiter-sliver-is-a-ceiling-not-a-step.md +6 -6
  220. package/docs/adr/0216-a-fake-pool-interpreter-must-fail-loudly-not-silently-ignore.md +2 -2
  221. package/docs/adr/0217-rank-gates-inviting-not-viewing.md +1 -1
  222. package/docs/adr/0218-the-apex-root-web-surface.md +2 -2
  223. package/docs/adr/0219-a-look-is-a-branding-pack-the-style-library.md +1 -1
  224. package/docs/adr/0220-an-in-house-rebuilt-skill-is-a-first-party-skill.md +1 -1
  225. package/docs/adr/0221-the-impeccable-method-is-one-skill-with-sub-command-playbooks.md +2 -2
  226. package/docs/adr/0222-the-image-family-under-the-hero-only-rule.md +2 -2
  227. package/docs/adr/0223-the-detector-is-two-tiers-in-the-kit.md +3 -3
  228. package/docs/adr/0224-module-skills-reach-the-core-checkout-as-untracked-self-ignored-copies.md +1 -1
  229. package/docs/adr/0225-privacy-suppresses-cross-project-surfaces-only.md +1 -1
  230. package/docs/adr/0226-one-stale-timer-reporting-degrades-enforcement-refuses.md +1 -1
  231. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  232. package/docs/adr/0230-a-look-skill-is-a-composition-grammar-the-palette-is-the-pack.md +1 -1
  233. package/docs/adr/0231-the-style-session-an-owner-authors-a-look-inside-the-contract.md +2 -2
  234. package/docs/adr/0232-rot-is-derived-not-swept-and-water-is-the-only-new-verb.md +2 -2
  235. package/docs/adr/0233-a-copy-proposal-is-a-task-carrying-a-patch.md +2 -2
  236. package/docs/adr/0234-idea-routing-capture-time-promotion-landing-matrix-homeless-inbox.md +2 -2
  237. package/docs/adr/0235-a-fix-category-is-kindbug-under-a-goal-no-column-required.md +11 -11
  238. package/docs/adr/0236-many-ideas-one-task-the-lineage-key-is-the-pair.md +5 -5
  239. package/docs/adr/0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md +5 -5
  240. package/docs/adr/0238-the-join-door-is-a-provisioning-settings-policy-key.md +1 -1
  241. package/docs/adr/0239-a-recommendation-is-a-table-that-carries-its-own-reason.md +4 -4
  242. package/docs/adr/0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md +4 -4
  243. package/docs/adr/0241-the-artist-gate-is-a-per-project-deploy-gate-that-reads-a-state.md +1 -1
  244. package/docs/adr/0242-a-cascade-is-a-declaration-table-on-the-event-that-already-exists.md +2 -2
  245. package/docs/adr/0243-a-bundle-adjustment-belongs-to-the-bundle-not-the-advice-about-it.md +4 -4
  246. package/docs/adr/0244-a-catalog-search-is-a-view-over-the-rows-never-an-edit-to-the-selection.md +3 -3
  247. package/docs/adr/0245-the-way-back-into-an-optional-step-is-that-step-s-own-answer-route.md +7 -7
  248. package/docs/adr/0246-catalog-membership-is-a-projection-not-a-federation-side-effect.md +1 -1
  249. package/docs/adr/0247-the-join-door-is-one-composed-answer-and-dark-matter-has-no-live-verdict-yet.md +2 -2
  250. package/docs/adr/0248-a-hub-project-s-owner-is-the-provisioning-row-carried-on-a-port.md +3 -3
  251. package/docs/adr/0249-the-invite-step-is-the-done-panel-s-first-act-not-a-rail-step.md +3 -3
  252. package/docs/adr/0250-strict-versioning-the-version-boundary-is-the-scope-gate.md +6 -6
  253. package/docs/adr/0251-a-suggestion-of-who-to-invite-is-a-recruiting-surface-and-owes-the-opt-out.md +5 -5
  254. package/docs/adr/0252-the-self-hosted-visibility-report-is-a-pull-and-auto-appear-buys-a-retraction-lever.md +19 -19
  255. package/docs/adr/0253-the-takedown-lever-has-two-writers-and-provenance-is-a-column.md +2 -2
  256. package/docs/adr/0254-a-relayed-link-is-contained-downward-or-it-is-not-published.md +6 -6
  257. package/docs/adr/0255-a-public-lists-ordering-is-part-of-its-payload.md +2 -2
  258. package/docs/adr/0256-the-visibility-ceiling-is-the-sign-in-gate-too-and-the-reader-moves-to-the-composer.md +3 -3
  259. package/docs/adr/0257-auth-resolves-before-the-hall-mounts-anything.md +1 -1
  260. package/docs/adr/0258-the-public-cli-is-a-generated-client-package-not-the-published-core.md +1 -1
  261. package/docs/adr/0259-a-projects-departure-from-the-public-list-is-public.md +7 -7
  262. package/docs/adr/0260-the-application-is-the-consent-and-the-echo-is-the-gate.md +4 -4
  263. package/docs/adr/0261-a-preselect-always-carries-a-reason-the-bundle-summary-is-the-floor.md +1 -1
  264. package/docs/adr/0262-a-bug-never-lands-in-the-inbox.md +1 -1
  265. package/docs/adr/0263-how-a-version-closes.md +3 -3
  266. package/docs/adr/0264-the-ten-working-areas.md +3 -3
  267. package/docs/adr/0265-work-with-no-goal-and-the-order-the-cut-needs.md +5 -5
  268. package/docs/adr/0266-the-board-room-is-its-own-surface-reachable-by-whoever-may-vote.md +2 -2
  269. package/docs/adr/0267-unanimity-and-the-revise-and-re-sit-loop.md +1 -1
  270. package/docs/adr/0268-the-constitution-comes-from-two-roots.md +3 -3
  271. package/docs/adr/0269-the-cli-session-store-is-host-keyed-at-a-fixed-anchor.md +1 -1
  272. package/docs/adr/0270-rank-floor-derives-without-a-prediction.md +2 -2
  273. package/docs/adr/0271-the-ideator-surface-is-two-halves.md +3 -3
  274. package/docs/adr/0272-a-craft-is-an-identity-not-a-toolchain.md +4 -4
  275. package/docs/adr/0273-hall-nav-can-gate-on-a-permission.md +1 -1
  276. package/docs/adr/0274-one-kernel-three-role-packs.md +1 -1
  277. package/docs/adr/0275-one-source-for-a-written-role-responsibility.md +1 -1
  278. package/docs/adr/0276-the-skill-listing-budget-cannot-hold-every-trigger.md +1 -1
  279. package/docs/adr/0277-a-box-is-in-use-only-while-a-human-is-attached.md +1 -1
  280. package/docs/adr/0278-a-gated-project-still-takes-applications.md +2 -2
  281. package/docs/adr/0279-an-upgrade-is-proven-by-the-served-version-not-the-health-check.md +1 -1
  282. package/docs/adr/0280-the-unattended-lane-may-drive-a-co-tenant-because-the-roster-is-the-decision.md +1 -1
  283. package/docs/adr/0281-an-instance-identity-is-its-own-unix-account-and-pg-role.md +2 -2
  284. package/docs/adr/README.md +294 -294
  285. package/docs/api/openapi.json +72 -5
  286. package/docs/api-reference.md +8 -2
  287. package/docs/architecture.md +22 -22
  288. package/docs/branding-contract.md +5 -5
  289. package/docs/canonical-permissions.md +22 -22
  290. package/docs/copy-inventory.md +15 -13
  291. package/docs/copy-registry.json +35 -17
  292. package/docs/design/hall-direction-v2.md +3 -3
  293. package/docs/design/landing-page-direction-v2.md +1 -1
  294. package/docs/design/projects-hub-direction-v2.md +1 -1
  295. package/docs/file-map.md +3 -1
  296. package/docs/module-api-changelog.md +36 -1
  297. package/docs/modules-contract.md +25 -25
  298. package/docs/onboarding/browser-terminal-guide.md +1 -1
  299. package/docs/onboarding/diagrams/README.md +3 -3
  300. package/docs/onboarding/drachmae-and-karma.md +13 -13
  301. package/docs/onboarding/primer.md +7 -7
  302. package/docs/packs/artist.md +1 -1
  303. package/docs/packs/ideator.md +1 -1
  304. package/docs/project-context.template.md +3 -3
  305. package/docs/recipes/builder-box-lifecycle.md +5 -5
  306. package/docs/recipes/claude-design-loop.md +1 -1
  307. package/docs/recipes/core-release-pipeline.md +55 -14
  308. package/docs/recipes/figma-design-loop.md +1 -1
  309. package/docs/recipes/gds-db-backup.md +2 -2
  310. package/docs/recipes/instance-deploy.md +2 -2
  311. package/docs/recipes/instance-service-restart.md +3 -3
  312. package/docs/recipes/local-dev.md +2 -2
  313. package/docs/recipes/managed-settings-remote-control.md +3 -3
  314. package/docs/recipes/memory-backup.md +4 -4
  315. package/docs/recipes/memory-sync-conflicts.md +2 -2
  316. package/docs/recipes/multi-builder-merge.md +2 -2
  317. package/docs/recipes/ops-gotchas.md +4 -4
  318. package/docs/recipes/overnight-builder.md +1 -1
  319. package/docs/recipes/packaging-the-core.md +6 -6
  320. package/docs/recipes/private-npm-distribution.md +5 -5
  321. package/docs/recipes/search-index-ingestion.md +3 -3
  322. package/docs/recipes/self-host.md +5 -5
  323. package/docs/recipes/server-bring-up.md +1 -1
  324. package/docs/recipes/ship-and-regrade.md +2 -2
  325. package/docs/recipes/standalone-live-docs.md +1 -1
  326. package/docs/recipes/ui-look-before-you-ship.md +1 -1
  327. package/docs/recipes/upgrading-the-core.md +2 -2
  328. package/docs/recipes/work-on-a-task-from-your-dev-box.md +6 -6
  329. package/docs/research/cursor-competitive-analysis.md +3 -3
  330. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +7 -7
  331. package/migrations/core_240_artist_gate_indexes.sql +48 -0
  332. package/migrations/core_240_goal_members_drop_legacy_role.sql +79 -0
  333. package/modules/dev-box/app/src/vendor/bongos-client.cjs +4 -0
  334. package/modules/hall-ui/public/watch.css +6 -0
  335. package/modules/hall-ui/public/watch.js +52 -6
  336. package/modules/lifecycle/cascade.js +37 -9
  337. package/modules/lifecycle/db-claims.js +5 -2
  338. package/modules/lifecycle/db-goals.js +4 -3
  339. package/modules/lifecycle/db-overrides.js +117 -4
  340. package/modules/lifecycle/db-tasks.js +63 -0
  341. package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +12 -4
  342. package/modules/lifecycle/module.json +2 -1
  343. package/modules/lifecycle/pg-constraint-fail.js +49 -0
  344. package/modules/lifecycle/routes/artist-gate.js +101 -0
  345. package/modules/lifecycle/routes/claims.js +13 -1
  346. package/modules/lifecycle/routes/lifecycle.js +6 -0
  347. package/modules/lifecycle/routes/task-write-routes.js +7 -0
  348. package/modules/lifecycle/routes/tasks.js +24 -0
  349. package/modules/lifecycle/task-classifier.js +10 -1
  350. package/modules/lifecycle/tests/cascade.mjs +43 -0
  351. package/modules/provisioning/provisioning.js +79 -3
  352. package/modules/provisioning/routes/provisioning.js +6 -1
  353. package/modules/provisioning/tests/provisioning.mjs +8 -8
  354. package/modules/security/secret-scrub.js +40 -4
  355. package/modules/status-ui/public/README.md +1 -1
  356. package/modules/ui-design/docs/design-contract.md +2 -2
  357. package/modules/ui-design/kit/README.md +1 -1
  358. package/modules/ui-design/kit/serve.js +1 -0
  359. package/modules/ui-design/skills/README.md +6 -6
  360. package/modules/ui-design/skills/brandkit/SKILL.md +1 -1
  361. package/modules/ui-design/skills/design-taste-frontend/SKILL.md +1 -1
  362. package/modules/ui-design/skills/design-taste-frontend-v1/SKILL.md +1 -1
  363. package/modules/ui-design/skills/gpt-taste/SKILL.md +1 -1
  364. package/modules/ui-design/skills/high-end-visual-design/SKILL.md +1 -1
  365. package/modules/ui-design/skills/image-to-code/SKILL.md +1 -1
  366. package/modules/ui-design/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  367. package/modules/ui-design/skills/imagegen-frontend-web/SKILL.md +1 -1
  368. package/modules/ui-design/skills/impeccable/SKILL.md +1 -1
  369. package/modules/ui-design/skills/industrial-brutalist-ui/SKILL.md +1 -1
  370. package/modules/ui-design/skills/minimalist-ui/SKILL.md +1 -1
  371. package/modules/ui-design/skills/redesign-existing-projects/SKILL.md +1 -1
  372. package/modules/ui-design/skills/stitch-design-taste/SKILL.md +1 -1
  373. package/modules/ui-design/skills/style/SKILL.md +2 -2
  374. package/modules/ui-design/styles/README.md +3 -3
  375. package/modules/ui-design/styles/blueprint/DESIGN.md +1 -1
  376. package/modules/ui-design/styles/chrome-world/DESIGN.md +1 -1
  377. package/package-lock.json +2 -2
  378. package/package.json +1 -1
  379. package/scripts/gds/audit-rank-roles.js +172 -0
  380. package/scripts/gds/backfill-task-rewards.js +9 -4
  381. package/scripts/gds/build-cli-package.js +1 -0
  382. package/scripts/gds/claim.js +94 -9
  383. package/scripts/gds/fitness.js +8 -8
  384. package/scripts/gds/go-live.js +139 -5
  385. package/scripts/gds/land-watch.js +13 -5
  386. package/scripts/gds/mirror-redact.js +13 -2
  387. package/scripts/gds/package-core.js +11 -3
  388. package/scripts/gds/release.js +55 -0
  389. package/scripts/gds/ship-land.js +10 -2
  390. package/scripts/gds/ship-regen.js +41 -8
  391. package/scripts/gds/start.js +7 -4
  392. package/scripts/gds/worktree-claim-guard.js +27 -1
  393. package/scripts/public-mirror-export.js +17 -4
  394. package/src/bongos/api-errors.js +9 -0
  395. package/src/bongos/artist-gate.js +204 -0
  396. package/src/branding.js +15 -0
  397. package/src/module-api.js +34 -1
  398. package/tests/api_path_404.mjs +28 -0
  399. package/tests/artist_gate.mjs +234 -0
  400. package/tests/artist_gate_release.mjs +283 -0
  401. package/tests/artist_gate_route.mjs +174 -0
  402. package/tests/box_scope_predicate.mjs +117 -0
  403. package/tests/claim_error_surface.mjs +163 -1
  404. package/tests/cli_exit_no_abort.mjs +256 -3
  405. package/tests/credit_log_single_writer.mjs +94 -0
  406. package/tests/currency_label.mjs +11 -4
  407. package/tests/go_live.mjs +144 -0
  408. package/tests/helpers.mjs +8 -0
  409. package/tests/main_worktree_busy_reason.mjs +167 -0
  410. package/tests/membership_kind_lockstep.mjs +88 -0
  411. package/tests/mirror_redact.mjs +14 -0
  412. package/tests/module_api.mjs +6 -0
  413. package/tests/provision_settings_apply.mjs +13 -5
  414. package/tests/provisioning_settings.mjs +11 -7
  415. package/tests/provisioning_settings_apply.mjs +4 -4
  416. package/tests/provisioning_settings_env.mjs +59 -7
  417. package/tests/public_mirror_export.mjs +12 -0
  418. package/tests/rank_roles_audit.mjs +114 -0
  419. package/tests/scrubber_corpus.mjs +70 -2
  420. package/tests/start_rebase_warning.mjs +50 -0
  421. package/tests/task_field_bounds_match_db.mjs +140 -0
  422. package/tests/watch_roster_self_row.mjs +289 -0
@@ -7,8 +7,8 @@
7
7
  - **Deciders:** Lars (Archon), Claude
8
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
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.
10
+ - **Builds on:** [ADR 0062](0062-medusa-instance-model-decoupling.md) (core↔host instance model), [ADR 0108](0108-instance-composition-configurable-root.md) (the core as a versioned npm dependency — "the same self-host artifact"), [ADR 0065](0065-agpl-nonprofit-ai-first-governance.md) §2 (managed hosting is a service *on top of* the same AGPL artifact), [ADR 0031](0031-cloud-dev-environments-for-builders.md) (the dev-box lifecycle — the reusable provisioning substrate + trust-boundary pattern), [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the module system this ships as), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (server-enforced trust boundary the module must never weaken), [ADR 0100](0100-two-repo-instance-model.md) §3 (per-repo GDS — locked; a managed fleet sits *above* it).
11
+ - **Relationship to [ADR 0092](0092-hosting-module-and-on-prem-target.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](0107-module-upstreaming-contribution-to-core-catalog.md) §Context), this module takes the distinct key **`provisioning`**; ADR 0092 keeps `hosting`. This ADR does **not** re-open or supersede 0092.
12
12
 
13
13
  ---
14
14
 
@@ -18,16 +18,16 @@
18
18
 
19
19
  **What already exists (the reusable substrate).**
20
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.)
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](0062-medusa-instance-model-decoupling.md) §2).
22
+ - **"The same self-host artifact" is defined.** [ADR 0108](0108-instance-composition-configurable-root.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
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.
24
+ - **Programmatic infra provisioning already works — for dev boxes.** The dev-box lifecycle ([ADR 0031](0031-cloud-dev-environments-for-builders.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](0016-trust-boundary-server-enforced-permissions.md), [ADR 0031](0031-cloud-dev-environments-for-builders.md) §9.4).
26
+ - **The module contract is settled** ([`docs/modules-contract.md`](../modules-contract.md), [ADR 0083](0083-modular-architecture-strangler-build-plan.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
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.
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](0100-two-repo-instance-model.md) §3), so "instances Cloud Bongos operates" would be a new operator layer *above* the individual GDS DBs.
29
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.**
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](0031-cloud-dev-environments-for-builders.md) in favour of snapshot-and-park with fixed cost ≈ $0. A hosting module inherits that DNA: **near-zero fixed cost when idle.**
31
31
 
32
32
  ---
33
33
 
@@ -48,7 +48,7 @@ A new, portable, **`default:false`** module `modules/provisioning/` (`coreVersio
48
48
  - Optionally a hall **`uiSection`** (an "Instances" panel — own-scoped for owners, fleet view for Archon), reusing the dev-box UI pattern.
49
49
  - A **port it provides**, e.g. `provisioning.instanceState`, so other code can read instance status via `seams.resolveOptional` without importing this module.
50
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).
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](0100-two-repo-instance-model.md) §3).
52
52
 
53
53
  ### 2. The web tier enqueues intents; a control-plane runner holds the tokens
54
54
 
@@ -63,7 +63,7 @@ The runner automates the [`cloudbongos-standup.md`](../recipes/cloudbongos-stand
63
63
  | Step | Automatable? | How |
64
64
  |---|---|---|
65
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)). |
66
+ | Database | **Yes** | `createdb <inst>` + GDS-only `migrate.sh` (`MEDUSA_GDS_ONLY=1`, instance seeds off — [ADR 0105](0105-instance-seed-migrations-out-of-core.md)). |
67
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
68
  | Process/service | **Yes** | Install + enable a per-instance systemd unit (the `cloudbongos.service` template). |
69
69
  | DNS | **Yes** | Cloudflare A-record UPSERT via the shared client (§2/§4). |
@@ -80,13 +80,13 @@ The runner automates the [`cloudbongos-standup.md`](../recipes/cloudbongos-stand
80
80
 
81
81
  ### 5. The self-host vs managed split
82
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*").
83
+ **Both run the identical `@cloudbongos/core` artifact ([ADR 0108](0108-instance-composition-configurable-root.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](0065-agpl-nonprofit-ai-first-governance.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
84
 
85
85
  | Dimension | **Self-host** | **Managed** (idea 303) |
86
86
  |---|---|---|
87
87
  | Artifact | identical `@cloudbongos/core` (pinned npm dep) | identical |
88
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) |
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](0100-two-repo-instance-model.md) §3) |
90
90
  | The `provisioning` module | same module, enabled, configured with the owner's target | same module, target = Cloud Bongos infra |
91
91
  | Updates | owner runs `bongos upgrade` | operator drives `bongos upgrade` across the fleet (same channel) |
92
92
  | Billing | owner pays their own cloud bill directly | Cloud Bongos meters → invoices → collects (**deferred**, §6) |
@@ -108,9 +108,9 @@ Inherit the budget DNA. **Default to the cheapest shape** — a co-tenant proces
108
108
 
109
109
  ## Alternatives considered
110
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.
111
+ - **Reuse the `hosting` key / fold into [ADR 0092](0092-hosting-module-and-on-prem-target.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](0107-module-upstreaming-contribution-to-core-catalog.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](0016-trust-boundary-server-enforced-permissions.md)/[ADR 0031](0031-cloud-dev-environments-for-builders.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](0031-cloud-dev-environments-for-builders.md) already declined. Systemd-timer-drained intents keep idle fixed cost ≈ $0.
114
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
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
116
  - **Build managed first.** Rejected — it depends on unshipped Mercury + the upgrade channel, and idea 303 was always the optional later layer.
@@ -123,8 +123,8 @@ Inherit the budget DNA. **Default to the cheapest shape** — a co-tenant proces
123
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
124
  - **`bongos init` gains an infra arm** — its infra answers flow into a provisioning request instead of only filing manual kickoff tasks.
125
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
- - **A provisioned instance loads its OWN branding pack** ([task 1003740](https://cloudbongos.com/builders#/task/1003740)). Provisioning originally pinned every instance's pack to the shared, committed neutral starter, because the co-tenant model of the day ran ONE checkout for all instances and differentiated them purely by env. Under [ADR 0108](<redacted>.md) that is no longer true — each instance has its own checkout, its own `config/branding.json` written at init, and runs `node_modules/@bongos/core`. The pin outlived its premise, and because `src/branding.js`'s env overrides carry domains, `auth.idp` and landing but **never `identity.productName`**, every hosted instance served the platform's name as its own: `GET /api/gds/instance` on hermeslines-marketing, mercury and demo all answered "Cloud Bongos" while their own packs on disk said otherwise. `bongos login <instance>` therefore greeted a newcomer with the wrong project at the moment they were deciding whether to trust it, and nothing looked — a healthy instance passes `/healthz` while lying about who it is. Provisioning now writes no branding-file pin at all, so `src/branding.js`'s default (`<instanceRoot>/config/branding.json`, falling back to neutral when absent) applies; standup gained an identity probe beside the healthz one, which **warns** rather than fails, since an owner may legitimately name a project after the platform.
126
+ - **Licensing unchanged** — managed is a service on the same AGPL artifact ([ADR 0065](0065-agpl-nonprofit-ai-first-governance.md) §2); no open-core, no relicensing.
127
+ - **A provisioned instance loads its OWN branding pack** ([task 1003740](https://cloudbongos.com/builders#/task/1003740)). Provisioning originally pinned every instance's pack to the shared, committed neutral starter, because the co-tenant model of the day ran ONE checkout for all instances and differentiated them purely by env. Under [ADR 0108](0108-instance-composition-configurable-root.md) that is no longer true — each instance has its own checkout, its own `config/branding.json` written at init, and runs `node_modules/@bongos/core`. The pin outlived its premise, and because `src/branding.js`'s env overrides carry domains, `auth.idp` and landing but **never `identity.productName`**, every hosted instance served the platform's name as its own: `GET /api/gds/instance` on hermeslines-marketing, mercury and demo all answered "Cloud Bongos" while their own packs on disk said otherwise. `bongos login <instance>` therefore greeted a newcomer with the wrong project at the moment they were deciding whether to trust it, and nothing looked — a healthy instance passes `/healthz` while lying about who it is. Provisioning now writes no branding-file pin at all, so `src/branding.js`'s default (`<instanceRoot>/config/branding.json`, falling back to neutral when absent) applies; standup gained an identity probe beside the healthz one, which **warns** rather than fails, since an owner may legitimately name a project after the platform.
128
128
  - **Follow-up tasks seeded** under BONGOS-V1 / goal 26 (idempotent seeder `scripts/gds/seed-provisioning-tasks.js`, `source_ref = <redacted>*`):
129
129
  1. **Scaffold the `provisioning` module** — manifest + `provisioning_*` tables + the web-tier intent/state routes (own + Archon), no token handling. *(buildable now)*
130
130
  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)*
@@ -4,7 +4,7 @@
4
4
  - **Date:** 2026-07-03
5
5
  - **Deciders:** jaxri (Metic, owner request), Claude
6
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)).
7
+ **Builds on / amends:** [ADR 0086](0086-goal-scoped-work-hierarchy.md) (goal-scoped work hierarchy — this ADR adds a privacy dimension + the self-service membership queue its §3 deferred), [ADR 0106](0106-goal-owner-manager-authority.md) (goal owner/manager authority — the exact authority this ADR reuses for who may invite/approve), [ADR 0016](0016-trust-boundary-server-enforced-permissions.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
8
 
9
9
  **Track:** `internal` (GDS / methodology — a Cloud Bongos platform capability).
10
10
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  ## Context
14
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.
15
+ Goals are shared, module-scoped workspaces ([ADR 0086](0086-goal-scoped-work-hierarchy.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](0106-goal-owner-manager-authority.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
16
 
17
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
18
 
@@ -24,8 +24,8 @@ One product decision was made explicitly with the requester: **private means joi
24
24
 
25
25
  ### 1. Visibility (task 1951)
26
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)
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](0083-modular-architecture-strangler-build-plan.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](0106-goal-owner-manager-authority.md)). (task 1952)
29
29
 
30
30
  ### 2. The membership-request queue (task 1951)
31
31
 
@@ -42,7 +42,7 @@ One table, both directions, distinguished by `kind`:
42
42
 
43
43
  ### 3. Routes (task 1952) — every wall in-handler, pinned `any-builder`
44
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):
45
+ Following the [ADR 0106](0106-goal-owner-manager-authority.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
46
 
47
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
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).
@@ -60,8 +60,8 @@ The membership add on accept/approve is atomic with the resolve: `resolveMembers
60
60
  ## Consequences
61
61
 
62
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.
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](0106-goal-owner-manager-authority.md)).
64
+ - **Protected-scope goals are unchanged** — their stronger Archon-mediation ([ADR 0086](0086-goal-scoped-work-hierarchy.md) §3) still governs; `visibility` is orthogonal and additive on top.
65
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
66
 
67
67
  ## Alternatives considered
@@ -1,7 +1,7 @@
1
1
  # ADR 0113 — Per-builder art sandbox (task 885): descope to the Studio only, superseded by ADR 0044/0052
2
2
 
3
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/`).
4
+ **Context:** [task 885](https://example.com/builders#/task/885) ("Per-builder art sandbox + sprite studio"), goal 25 (builder experience). Companion to [ADR 0044](0044-per-box-live-game-preview.md) (per-box live game preview), [ADR 0052](0052-sandbox-for-everyone-game-only-preview.md) (game-only preview entry, every rank), and [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the game's carve into `modules/game/`).
5
5
  **Status:** Accepted.
6
6
  **Track:** `internal` (builder experience / dev box).
7
7
 
@@ -2,14 +2,14 @@
2
2
 
3
3
  **Date:** 2026-07-04
4
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).
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](0062-medusa-instance-model-decoupling.md) (core↔host split), [ADR 0109](0109-self-describing-openapi-and-hosted-docs.md) (self-describing OpenAPI + hosted `/docs`), and [ADR 0029](0029-status-page-outage-resilience.md) (off-box status page).
6
6
 
7
7
  ## Problem
8
8
 
9
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
10
 
11
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.
12
+ - `/docs` + `/docs/openapi.json` — the rendered API reference + machine spec ([ADR 0109](0109-self-describing-openapi-and-hosted-docs.md)), served on the instance's own origin.
13
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
14
 
15
15
  ## Decision
@@ -19,7 +19,7 @@ Pin a three-layer docs-discovery contract. Every layer is derivable from config
19
19
  1. **Config is the source of truth.** `config/branding.json` `domains` carries the surfaces:
20
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
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.
22
+ - `domains.statusOrigin` — the **status page**: the off-box fallback for project state when the hall is down ([ADR 0029](0029-status-page-outage-resilience.md)), though it does not render full docs.
23
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
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
25
 
@@ -29,4 +29,4 @@ Pin a three-layer docs-discovery contract. Every layer is derivable from config
29
29
  - **`docs/branding-contract.md`** documents the docs-discovery contract so a fresh instance knows these `domains.*` fields are load-bearing, not decorative.
30
30
  - **CLAUDE.md's preamble references this ADR** instead of hand-waving a single config key.
31
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.
32
+ - **Portability, not behavior.** No endpoint semantics change; the index adds fields (back-compatible). The [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) trust boundary is untouched — the index names only public locations and remains unauthenticated.
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Date:** 2026-07-04
4
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).
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](0062-medusa-instance-model-decoupling.md) (core↔host split) and [ADR 0024](0024-multi-agent-system-architecture.md) (the MAS the routines belong to).
6
6
 
7
7
  ## Problem
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Date:** 2026-07-04
4
4
  **Status:** Accepted (policy; R05 of goal 36).
5
- **Context:** [task 1992](https://builders.example.com#/task/1992) (BONGOS-V1, goal 36 "Robust, versioned, easy-to-call public API", criterion `api-versioning`). This is the **policy**; the mount + aliasing that implements it is R06 ([task 1993](https://builders.example.com#/task/1993)). Builds on the API-prefix chokepoint ([`src/gds/api-prefix.js`](../../src/gds/api-prefix.js), task 1918/1919), the self-describing OpenAPI + hosted `/docs` ([ADR 0109](<redacted>.md)), and the docs-discovery contract ([ADR 0114](<redacted>.md)).
5
+ **Context:** [task 1992](https://builders.example.com#/task/1992) (BONGOS-V1, goal 36 "Robust, versioned, easy-to-call public API", criterion `api-versioning`). This is the **policy**; the mount + aliasing that implements it is R06 ([task 1993](https://builders.example.com#/task/1993)). Builds on the API-prefix chokepoint ([`src/gds/api-prefix.js`](../../src/gds/api-prefix.js), task 1918/1919), the self-describing OpenAPI + hosted `/docs` ([ADR 0109](0109-self-describing-openapi-and-hosted-docs.md)), and the docs-discovery contract ([ADR 0114](0114-instance-docs-discovery-contract.md)).
6
6
 
7
7
  ## Problem
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Date:** 2026-07-04
4
4
  **Status:** Accepted (spike; R07 of goal 36).
5
- **Context:** [task 1994](https://builders.example.com#/task/1994) (BONGOS-V1, goal 36, criteria `api-client-sdk` + `api-validation`). The spike that shapes the SDK (R08–R10) and validation (R11–R12): does the OpenAPI spec become the **source** (schema-first — author schemas, generate routes + validation + client), or stay **generated from code** (code-first) with codegen layered on? Builds on the self-describing OpenAPI generator ([ADR 0109](<redacted>.md), `scripts/gds/gen-api-docs.js`) and the error envelope ([ADR 0116](<redacted>.md)).
5
+ **Context:** [task 1994](https://builders.example.com#/task/1994) (BONGOS-V1, goal 36, criteria `api-client-sdk` + `api-validation`). The spike that shapes the SDK (R08–R10) and validation (R11–R12): does the OpenAPI spec become the **source** (schema-first — author schemas, generate routes + validation + client), or stay **generated from code** (code-first) with codegen layered on? Builds on the self-describing OpenAPI generator ([ADR 0109](0109-self-describing-openapi-and-hosted-docs.md), `scripts/gds/gen-api-docs.js`) and the error envelope ([ADR 0116](0116-api-error-envelope-and-code-taxonomy.md)).
6
6
 
7
7
  ## What exists today
8
8
 
@@ -33,7 +33,7 @@ Re-couple reward and queue-access to **landed code**, in four parts.
33
33
  1. **Pay on land, not on confirm.** Move BOTH reward writes from the `confirmed`
34
34
  transition to the `shipped` (merged-to-`main`) transition:
35
35
  - the per-task credit (`insertMultipliedConfirmCredit` + the idea-promotion bonus), and
36
- - the cost-plus session-token reward ([ADR 0054](<redacted>.md)).
36
+ - the cost-plus session-token reward ([ADR 0054](0054-session-token-reward-cost-plus.md)).
37
37
 
38
38
  The award becomes idempotent on ship (`credit_log.reason = 'task.shipped'`, guarded by a
39
39
  uniqueness check per task, mirroring today's confirm-time guard). **The happy path barely
@@ -43,7 +43,7 @@ Re-couple reward and queue-access to **landed code**, in four parts.
43
43
  2. **A stalled land becomes the builder's own chore (`needs_rebase`).** The
44
44
  `publish-reconciler` already detects why a confirmed task won't land — `merge_conflict`,
45
45
  a failing required check against current `main`, or no pushed branch. After the normal
46
- auto-land grace (the reconciler's existing retries + the [ADR 0082](<redacted>.md)
46
+ auto-land grace (the reconciler's existing retries + the [ADR 0082](0082-server-side-merge-conflict-auto-resolution.md)
47
47
  generated-file self-heal) is exhausted, it flags the task `needs_rebase = true`, attributed
48
48
  to the **claim holder** (the builder who did the work — the same attribution rule as
49
49
  `confirmTask`, task 661). This is a signal, not a status change: the task stays `confirmed`
@@ -5,7 +5,7 @@
5
5
  - **Track:** internal (a portable Cloud Bongos platform capability)
6
6
  - **Task:** [#1986](https://example.com/builders#/task/1986) (BONGOS-V1, goal 35 — *Project creation flow*, the `adopt-existing-repo` criterion) — "SCOPE what an adopt mode must do; deliver an ADR + a task breakdown. Do NOT build adopt-mode here."
7
7
  - **Deciders:** Lars (Archon), Claude
8
- - **Builds on:** [ADR 0108](<redacted>.md) (configurable-root / core-as-npm-dep — the "layer, don't clone" substrate), [ADR 0111](<redacted>.md) (the `provisioning` module + the greenfield `bongos init` → provisioning-request wiring), [ADR 0062](<redacted>.md) (core↔host instance model), [ADR 0100](<redacted>.md) (two-repo instance model), [ADR 0105](<redacted>.md) (instance seeds out of core migrations), [ADR 0016](<redacted>.md) (server-enforced trust boundary), [ADR 0083](<redacted>.md) + [ADR 0108](<redacted>.md) §5 (module system + cross-repo migration namespacing).
8
+ - **Builds on:** [ADR 0108](0108-instance-composition-configurable-root.md) (configurable-root / core-as-npm-dep — the "layer, don't clone" substrate), [ADR 0111](0111-instance-hosting-provisioning-module.md) (the `provisioning` module + the greenfield `bongos init` → provisioning-request wiring), [ADR 0062](0062-medusa-instance-model-decoupling.md) (core↔host instance model), [ADR 0100](0100-two-repo-instance-model.md) (two-repo instance model), [ADR 0105](0105-instance-seed-migrations-out-of-core.md) (instance seeds out of core migrations), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (server-enforced trust boundary), [ADR 0083](0083-modular-architecture-strangler-build-plan.md) + [ADR 0108](0108-instance-composition-configurable-root.md) §5 (module system + cross-repo migration namespacing).
9
9
  - **Raised while** abandoning task 1689 (2026-07-04): the standalone two-repo model is already proven by Emersonian Circles (task 1917), so the missing piece is not *"can core run standalone"* but *"how does an owner who **already has a repo** adopt it."*
10
10
 
11
11
  ---
@@ -3,8 +3,8 @@
3
3
  - **Status:** Accepted
4
4
  - **Date:** 2026-07-05
5
5
  - **Track:** internal
6
- - **Completes:** [ADR 0110](<redacted>.md) — the diagram half it explicitly **deferred** ("the diagrams need verified headless-Chromium handling"). This ADR records that verified handling and lands the untrack.
7
- - **Builds on:** [ADR 0094](<redacted>.md) (gitignored artifact rebuilt at deploy), [ADR 0063](<redacted>.md) / [ADR 0062](<redacted>.md) §8 (the nav-doc generators ADR 0110 already migrated)
6
+ - **Completes:** [ADR 0110](0110-untrack-whole-file-generated-nav-docs.md) — the diagram half it explicitly **deferred** ("the diagrams need verified headless-Chromium handling"). This ADR records that verified handling and lands the untrack.
7
+ - **Builds on:** [ADR 0094](0094-repo-atlas-self-drawing-codebase-map.md) (gitignored artifact rebuilt at deploy), [ADR 0063](0063-generated-repo-map-symbol-skeleton.md) / [ADR 0062](0062-medusa-instance-model-decoupling.md) §8 (the nav-doc generators ADR 0110 already migrated)
8
8
  - **Task:** [#2027](https://example.com/builders#/task/2027) (consolidated the duplicate [#1928](https://example.com/builders#/task/1928))
9
9
 
10
10
  ## Context
@@ -33,7 +33,7 @@ Apply the ADR 0110 model to the diagram **renders**, with a host-provisioned bro
33
33
 
34
34
  - The diagram-render branch-collision class is eliminated at the source; render-capable ships drop a bookkeeping commit.
35
35
  - **Accepted staleness:** the served images are fresh only *after deploy* (or a box-fetch tick), not at merge — tolerant by nature for a human onboarding page; the LOUD `::ERROR::` is the alarm if a deploy render breaks, and the nightly drift cron is the belt-and-braces.
36
- - **Operational coupling:** the prod droplet must keep Google Chrome installed. `deploy-prod.sh` is the hand-maintained `~/deploy.sh` mirror ([ADR 0042](<redacted>.md)/[0043](<redacted>.md)), so landing this requires an operator to (a) install Chrome (done) and (b) reinstall the updated `deploy.sh`. If Chrome is ever removed, the render step fails LOUD and the drift cron flags staleness — the page keeps its last-deployed images (no `git reset` wipes an untracked file that was just re-rendered) until the next successful deploy.
36
+ - **Operational coupling:** the prod droplet must keep Google Chrome installed. `deploy-prod.sh` is the hand-maintained `~/deploy.sh` mirror ([ADR 0042](0042-builder-self-deploy-ci-auto-merge.md)/[0043](0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md)), so landing this requires an operator to (a) install Chrome (done) and (b) reinstall the updated `deploy.sh`. If Chrome is ever removed, the render step fails LOUD and the drift cron flags staleness — the page keeps its last-deployed images (no `git reset` wipes an untracked file that was just re-rendered) until the next successful deploy.
37
37
  - **Fresh pristine checkout / core package:** a bare `git clone` that never deploys lacks the images (same accepted trade-off ADR 0110 notes for the nav docs). `docs/onboarding/diagrams/` is not in the core publish allowlist, so nothing changes for packaged core.
38
38
 
39
39
  ## Alternatives considered
@@ -4,7 +4,7 @@
4
4
  - **Date:** 2026-07-05
5
5
  - **Track:** internal (dev-box lifecycle)
6
6
  - **Task:** [#837](https://example.com/builders#/task/837) — "SPIKE: don't lose uncommitted work when a dev box is reclaimed (idle sweep deprovisions, no snapshot)."
7
- - **Builds on:** [ADR 0031](<redacted>.md) (cloud dev environments), [ADR 0071](<redacted>.md) (confirm-before-destroyed + drift reconcile — the closest prior art; hardens droplet *truthfulness*, not data preservation), [ADR 0043](<redacted>.md) (git/SSH trust boundary — relevant because the fix widens a box credential's scope).
7
+ - **Builds on:** [ADR 0031](0031-cloud-dev-environments-for-builders.md) (cloud dev environments), [ADR 0071](0071-box-confirm-before-destroyed-and-drift-reconcile.md) (confirm-before-destroyed + drift reconcile — the closest prior art; hardens droplet *truthfulness*, not data preservation), [ADR 0043](0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md) (git/SSH trust boundary — relevant because the fix widens a box credential's scope).
8
8
 
9
9
  ## Problem
10
10
 
@@ -1,8 +1,8 @@
1
1
  # ADR 0124 — Typed API response bodies (infer the success shape from `res.json`)
2
2
 
3
3
  **Date:** 2026-07-05
4
- **Status:** Accepted (follow-up to [ADR 0118](<redacted>.md); goal 36 `api-client-sdk`).
5
- **Context:** [task 2061](https://builders.example.com#/task/2061) (BONGOS-V1), promoted from idea 519. [ADR 0118](<redacted>.md) / task 2050 typed every **request** body field-level from each route's `validate()` schema. Success **responses** stayed the `ApiResponse` (`= any`) alias: routes declare no response schema, so the generator had nothing to type them from — a caller got zero autocomplete or safety on what a call returns.
4
+ **Status:** Accepted (follow-up to [ADR 0118](0118-api-contract-source-of-truth-code-first.md); goal 36 `api-client-sdk`).
5
+ **Context:** [task 2061](https://builders.example.com#/task/2061) (BONGOS-V1), promoted from idea 519. [ADR 0118](0118-api-contract-source-of-truth-code-first.md) / task 2050 typed every **request** body field-level from each route's `validate()` schema. Success **responses** stayed the `ApiResponse` (`= any`) alias: routes declare no response schema, so the generator had nothing to type them from — a caller got zero autocomplete or safety on what a call returns.
6
6
 
7
7
  ## Problem
8
8
 
@@ -1,7 +1,7 @@
1
1
  # ADR 0125 — The control plane scaffolds + pushes a standalone instance's repo
2
2
 
3
3
  **Date:** 2026-07-05
4
- **Status:** Accepted (implements goal 35's `project-creation-flow` criterion; builds on [ADR 0108](<redacted>.md) + [ADR 0111](<redacted>.md)).
4
+ **Status:** Accepted (implements goal 35's `project-creation-flow` criterion; builds on [ADR 0108](0108-instance-composition-configurable-root.md) + [ADR 0111](0111-instance-hosting-provisioning-module.md)).
5
5
  **Context:** [task 2055](https://builders.example.com#/task/2055) (BONGOS-V1) — greenfield onboarding gap 3/4, found in the 2026-07-05 end-to-end standup attempt (task 2052).
6
6
 
7
7
  ## Problem
@@ -25,7 +25,7 @@ It is **idempotent** (skips once the repo carries a `package.json`) and **dry-ru
25
25
 
26
26
  ## Consequences
27
27
 
28
- - **`deploy-instance.sh` already existed** at `scripts/deploy/deploy-instance.sh` (added by [ADR 0108](<redacted>.md) §4 / task 1884 — the task-2055 description predated it). It is the *ongoing* consumer deploy (git pull → `npm ci` → three-root migrate → restart), installed as an instance's own `~/deploy.sh`; the provisioner does the *first-time* standup inline. No duplicate at `infra/` was created.
28
+ - **`deploy-instance.sh` already existed** at `scripts/deploy/deploy-instance.sh` (added by [ADR 0108](0108-instance-composition-configurable-root.md) §4 / task 1884 — the task-2055 description predated it). It is the *ongoing* consumer deploy (git pull → `npm ci` → three-root migrate → restart), installed as an instance's own `~/deploy.sh`; the provisioner does the *first-time* standup inline. No duplicate at `infra/` was created.
29
29
  - A fresh empty GitHub repo now goes from "requested" to "installable + bootable" with **no manual clone/scaffold** — closing the init→provision dead-end.
30
30
  - The control plane gains a new responsibility (pushing to owner repos). Bounded by the per-repo deploy-key grant above.
31
31
 
@@ -4,9 +4,9 @@
4
4
 
5
5
  ## Context
6
6
 
7
- cloudbongos.com (Customer 0, the vanilla dogfood instance — [ADR 0062](<redacted>.md) §2, [`docs/recipes/cloudbongos-standup.md`](../recipes/cloudbongos-standup.md)) ran as a **co-tenant on the OTB game droplet** (`REDACTED_IP`): same checkout, port 3002, its own `cloudbongos` DB. The token-holding **control plane** lived on that same box — `/etc/example/box.env` holds the account's DigitalOcean token **and** the Cloudflare token, drained by `scripts/gds/provision.js` (the instance provisioner, [ADR 0111](<redacted>.md)) and `scripts/gds/box.js` (dev boxes).
7
+ cloudbongos.com (Customer 0, the vanilla dogfood instance — [ADR 0062](0062-medusa-instance-model-decoupling.md) §2, [`docs/recipes/cloudbongos-standup.md`](../recipes/cloudbongos-standup.md)) ran as a **co-tenant on the OTB game droplet** (`REDACTED_IP`): same checkout, port 3002, its own `cloudbongos` DB. The token-holding **control plane** lived on that same box — `/etc/example/box.env` holds the account's DigitalOcean token **and** the Cloudflare token, drained by `scripts/gds/provision.js` (the instance provisioner, [ADR 0111](0111-instance-hosting-provisioning-module.md)) and `scripts/gds/box.js` (dev boxes).
8
8
 
9
- That co-location is the weak point in the trust posture: the powerful, account-wide cloud tokens sat on the **same machine** as the game and any co-hosted third-party instance (`emersonian-circles.`, `staging.`). A compromise of any co-hosted workload could reach <redacted> and droplet creation. The existing plan ([ADR 0100](<redacted>.md)/[0108](<redacted>.md), spine R84→R89) only separated cloudbongos.com as a *side effect* of the deferred "Example split" (R89, [#1728](https://example.com/builders#/task/1728)), keeping it co-tenant "for cost" until then.
9
+ That co-location is the weak point in the trust posture: the powerful, account-wide cloud tokens sat on the **same machine** as the game and any co-hosted third-party instance (`emersonian-circles.`, `staging.`). A compromise of any co-hosted workload could reach <redacted> and droplet creation. The existing plan ([ADR 0100](0100-two-repo-instance-model.md)/[0108](0108-instance-composition-configurable-root.md), spine R84→R89) only separated cloudbongos.com as a *side effect* of the deferred "Example split" (R89, [#1728](https://example.com/builders#/task/1728)), keeping it co-tenant "for cost" until then.
10
10
 
11
11
  The owner elected to pull the **infrastructure** separation forward, explicitly accepting a second droplet's cost, for the security division.
12
12
 
@@ -17,7 +17,7 @@ Run cloudbongos.com on its **own dedicated droplet** that is also the **sole tok
17
17
  - **New droplet** `cloudbongos` — DigitalOcean `REDACTED_IP`, nyc3, `s-1vcpu-2gb` ($12/mo), Ubuntu 24.04, tagged `cloudbongos-control` (deliberately **not** `PROVISION_TAG`, so the provisioning reconciler never treats the control plane as a disposable instance).
18
18
  - **Structural SSH separation** — reached only via a dedicated `cloudbongos_ed25519` key, distinct from the example box's key.
19
19
  - **Own stack** — Node 22 / PostgreSQL 16 / Caddy, IPv6 egress disabled (so the IPv4-locked Cloudflare token can never be spuriously rejected — `checkDnsTokenScope` uses plain `fetch` with no `-4`, unlike `infra/box-dns-cloudflare.sh`).
20
- - **Holds the tokens** — `/etc/cloudbongos/box.env` (mode 600) carries a **new account-wide Cloudflare token** (Edit-zone-DNS, all zones, IP-locked to `REDACTED_IP`) + the DigitalOcean token. This is the box that provisions instance subdomains for the hosting/provisioning module ([ADR 0111](<redacted>.md) §2 — tokens on the control plane, never the web tier; mirrors [ADR 0031](<redacted>.md) §6).
20
+ - **Holds the tokens** — `/etc/cloudbongos/box.env` (mode 600) carries a **new account-wide Cloudflare token** (Edit-zone-DNS, all zones, IP-locked to `REDACTED_IP`) + the DigitalOcean token. This is the box that provisions instance subdomains for the hosting/provisioning module ([ADR 0111](0111-instance-hosting-provisioning-module.md) §2 — tokens on the control plane, never the web tier; mirrors [ADR 0031](0031-cloud-dev-environments-for-builders.md) §6).
21
21
  - **The co-hosting box** (the former OTB droplet, `REDACTED_IP`) stays as-is for the game + co-hosted project instances; the cloudbongos co-tenant unit was removed.
22
22
 
23
23
  The checkout is still a clone of `example-owner/example` running `src/platform-server.js` with `GDS_BRANDING_FILE=config/branding.cloudbongos.json` (a **lift-and-shift**, not the ADR 0108 pinned-`@cloudbongos/core` standalone model — that remains the longer-term shape).
@@ -11,7 +11,7 @@ platform API**, not any single game — so the dashboards are *platform* observa
11
11
  and belong on the **cloudbongos** domain, watching **every** instance, not a
12
12
  project-specific one.
13
13
 
14
- Then [ADR 0126](<redacted>.md) moved
14
+ Then [ADR 0126](0126-dedicated-cloudbongos-control-plane-droplet.md) moved
15
15
  cloudbongos.com onto a dedicated **control-plane droplet** (REDACTED_IP) that
16
16
  holds the account-wide Cloudflare token and serves `*.cloudbongos.com`. That split
17
17
  the fleet across two droplets:
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Context
6
6
 
7
- [ADR 0111](<redacted>.md) built `scripts/gds/provision.js` — the control-plane runner that drains `provisioning_intents` and composes the [cloudbongos-standup](../recipes/cloudbongos-standup.md) runbook (createdb → GDS-only migrate → per-instance `/etc/<slug>/web.env` → systemd unit → per-instance Caddy snippet → `/healthz`). It was written injectable + dry-run-default and unit-tested, **but never run end-to-end** — every existing co-located instance (`emersonian-circles`, the vanity doors) was hand-wired by an operator. The 2026-07-05 first real greenfield standup attempt ([#2053](https://example.com/builders#/task/2053)–[#2056](https://example.com/builders#/task/2056)) surfaced three ops gaps. Two were resolved on-box (Cloudflare token scope → [ADR 0126](<redacted>.md); the Caddy on-demand-TLS global that the live `/etc/caddy/Caddyfile` lacked). This ADR is the third, load-bearing one.
7
+ [ADR 0111](0111-instance-hosting-provisioning-module.md) built `scripts/gds/provision.js` — the control-plane runner that drains `provisioning_intents` and composes the [cloudbongos-standup](../recipes/cloudbongos-standup.md) runbook (createdb → GDS-only migrate → per-instance `/etc/<slug>/web.env` → systemd unit → per-instance Caddy snippet → `/healthz`). It was written injectable + dry-run-default and unit-tested, **but never run end-to-end** — every existing co-located instance (`emersonian-circles`, the vanity doors) was hand-wired by an operator. The 2026-07-05 first real greenfield standup attempt ([#2053](https://example.com/builders#/task/2053)–[#2056](https://example.com/builders#/task/2056)) surfaced three ops gaps. Two were resolved on-box (Cloudflare token scope → [ADR 0126](0126-dedicated-cloudbongos-control-plane-droplet.md); the Caddy on-demand-TLS global that the live `/etc/caddy/Caddyfile` lacked). This ADR is the third, load-bearing one.
8
8
 
9
9
  `provision-intent-runner.service` runs as **`User=lars`** (a non-root user). But every mutating step assumed a privilege the runner does not have when driven headlessly:
10
10
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  Two things additionally made a naive "just add `sudo`" fix silently fail: the unit set **`NoNewPrivileges=true`** (which sets `PR_SET_NO_NEW_PRIVS` and *blocks the setuid `sudo` binary from escalating at all*), and `sudo` resets the environment (so a bare `sudo -u postgres PGDATABASE=x ./migrate.sh` would have `sudo` parse `PGDATABASE=x` as a command).
16
16
 
17
- The whole point is that this runner must NOT bake operator identity into behavior ([ADR 0016](<redacted>.md)), tests must stay hermetic (no shell/DB/network), and the same code drives co-tenant, standalone, and (via cloud-init) dedicated shapes.
17
+ The whole point is that this runner must NOT bake operator identity into behavior ([ADR 0016](0016-trust-boundary-server-enforced-permissions.md)), tests must stay hermetic (no shell/DB/network), and the same code drives co-tenant, standalone, and (via cloud-init) dedicated shapes.
18
18
 
19
19
  ## Decision
20
20
 
@@ -39,7 +39,7 @@ Add a single config knob, **`PROVISION_SUDO=1`** (alias `PROVISION_PRIVILEGED=1`
39
39
  - **The dedicated-droplet cloud-init path is deliberately unchanged** (`dedicatedUserData`). It runs as root on a fresh droplet — a different privilege + file-perms model — and is out of the co-tenant/standalone scope this task exercised; escalating it is a separate change.
40
40
  - **Follow-ups noted from the standup:** the live `/etc/caddy/Caddyfile` drifts from `infra/Caddyfile` with no auto-sync (a deploy-time reconcile is worth considering); the migrate-as-postgres readable-checkout precondition should be asserted by the box provisioning, not just documented.
41
41
 
42
- > **Followed up 2026-09-12 by [ADR 0281](<redacted>.md)** (task [1003369](https://cloudbongos.com/builders#/task/1003369)), which takes the last alternative below from the other end: the *instance* now holds per-instance DB credentials (its own password-authed role) rather than the runner holding app creds. **This ADR is unchanged** — the runner still escalates via `sudo -u postgres` for `createdb`/`migrate`, and `PROVISION_SUDO` still means exactly what it means here.
42
+ > **Followed up 2026-09-12 by [ADR 0281](0281-an-instance-identity-is-its-own-unix-account-and-pg-role.md)** (task [1003369](https://cloudbongos.com/builders#/task/1003369)), which takes the last alternative below from the other end: the *instance* now holds per-instance DB credentials (its own password-authed role) rather than the runner holding app creds. **This ADR is unchanged** — the runner still escalates via `sudo -u postgres` for `createdb`/`migrate`, and `PROVISION_SUDO` still means exactly what it means here.
43
43
 
44
44
  ## Alternatives considered
45
45
 
@@ -1,10 +1,10 @@
1
1
  # ADR 0129 — cloudbongos.com control-plane box deploys by a pull timer, not the CI push
2
2
 
3
- **Status:** Accepted — implemented 2026-07-05 (task [#2064](https://example.com/builders#/task/2064)). Follows [ADR 0126](<redacted>.md).
3
+ **Status:** Accepted — implemented 2026-07-05 (task [#2064](https://example.com/builders#/task/2064)). Follows [ADR 0126](0126-dedicated-cloudbongos-control-plane-droplet.md).
4
4
 
5
5
  ## Context
6
6
 
7
- The 2026-07-05 dedicated-droplet migration ([ADR 0126](<redacted>.md), task [#2063](https://example.com/builders#/task/2063)) moved cloudbongos.com onto its own box (`REDACTED_IP`, checkout `/home/lars/cloudbongos`, `cloudbongos.service`, port 3002). The co-hosting box (`REDACTED_IP`) still auto-deploys **example.com** via [`.github/workflows/deploy-prod.yml`](../../.github/workflows/deploy-prod.yml) (SSH → `~/deploy.sh` on merge to `main`, [ADR 0042](<redacted>.md)). That path only touches the co-hosting box. **Nothing pulled `main` onto the new box**, so cloudbongos.com served its boot-time code and drifted — ADR 0126 §Consequences flagged this as task 2064.
7
+ The 2026-07-05 dedicated-droplet migration ([ADR 0126](0126-dedicated-cloudbongos-control-plane-droplet.md), task [#2063](https://example.com/builders#/task/2063)) moved cloudbongos.com onto its own box (`REDACTED_IP`, checkout `/home/lars/cloudbongos`, `cloudbongos.service`, port 3002). The co-hosting box (`REDACTED_IP`) still auto-deploys **example.com** via [`.github/workflows/deploy-prod.yml`](../../.github/workflows/deploy-prod.yml) (SSH → `~/deploy.sh` on merge to `main`, [ADR 0042](0042-builder-self-deploy-ci-auto-merge.md)). That path only touches the co-hosting box. **Nothing pulled `main` onto the new box**, so cloudbongos.com served its boot-time code and drifted — ADR 0126 §Consequences flagged this as task 2064.
8
8
 
9
9
  The task allowed either extending the CI push workflow to also target the new box, **or** a pull-based timer on the box.
10
10
 
@@ -18,7 +18,7 @@ Deploy the control-plane box with a **pull-based systemd timer**, not by extendi
18
18
  ### Why pull, not CI push
19
19
 
20
20
  1. **Blast radius.** The dedicated box exists to shrink the cloud-token / prod-SSH-key exposure (ADR 0126). Extending CI would require storing **this box's** prod SSH key as a GitHub Actions secret — more secret sprawl, against the migration's whole grain. A pull uses the box's **existing** GitHub deploy key (`git@github-deploy:…`), so no new secret leaves the box and the shared `deploy-prod.yml` is untouched.
21
- 2. **Convention.** It matches the self-healing `*-runner.timer` units already in `infra/` (e.g. `provision-intent-runner.timer`), and the deploy self-installs its own unit changes on the next run (the [ADR 0110](<redacted>.md) self-heal pattern) — no manual re-install.
21
+ 2. **Convention.** It matches the self-healing `*-runner.timer` units already in `infra/` (e.g. `provision-intent-runner.timer`), and the deploy self-installs its own unit changes on the next run (the [ADR 0110](0110-untrack-whole-file-generated-nav-docs.md) self-heal pattern) — no manual re-install.
22
22
  3. **Cost of staleness is low.** Worst case is one tick (~2 min) behind `main` for a Customer-0 dogfood instance. The idle-tick cost is a single `git fetch` + SHA compare (the no-op fast path).
23
23
 
24
24
  ### Two deliberate divergences from `deploy-prod.sh`
@@ -30,5 +30,5 @@ Deploy the control-plane box with a **pull-based systemd timer**, not by extendi
30
30
 
31
31
  - cloudbongos.com now tracks `main` within ~2 min of a merge, with no new GitHub secret and no change to the shared prod deploy.
32
32
  - **One-time bootstrap is unavoidable** (the box can't install its own first deploy automation): an operator installs `/home/lars/deploy.sh` + the two units over SSH once — see [`docs/recipes/cloudbongos-standup.md`](../recipes/cloudbongos-standup.md) §"Deploy automation". After that it self-heals.
33
- - When cloudbongos.com moves to the pinned-`@cloudbongos/core` standalone model ([ADR 0108](<redacted>.md)), this script is the seam that converts `git reset --hard` → `git pull` + `npm ci` (the [`deploy-instance.sh`](../../scripts/deploy/deploy-instance.sh) shape) — a one-file change, not a new pipeline.
33
+ - When cloudbongos.com moves to the pinned-`@cloudbongos/core` standalone model ([ADR 0108](0108-instance-composition-configurable-root.md)), this script is the seam that converts `git reset --hard` → `git pull` + `npm ci` (the [`deploy-instance.sh`](../../scripts/deploy/deploy-instance.sh) shape) — a one-file change, not a new pipeline.
34
34
  - Does not affect task [#2065](https://example.com/builders#/task/2065) (stripping cloud tokens off the co-hosting box); that is orthogonal.
@@ -1,12 +1,12 @@
1
1
  # ADR 0130 — provision.js remote-exec over SSH: the control plane orchestrates co-tenant workloads on the co-hosting box
2
2
 
3
- **Status:** Accepted — code implemented 2026-07-05 (task [#2065](https://example.com/builders#/task/2065)); **activation (SSH trust + token rotation) is a sequenced owner-op**, see §Activation. Follows [ADR 0126](<redacted>.md).
3
+ **Status:** Accepted — code implemented 2026-07-05 (task [#2065](https://example.com/builders#/task/2065)); **activation (SSH trust + token rotation) is a sequenced owner-op**, see §Activation. Follows [ADR 0126](0126-dedicated-cloudbongos-control-plane-droplet.md).
4
4
 
5
- > **Superseded in part by [ADR 0132](<redacted>.md)** (task 2071). The remote-exec *mechanism* here stands, but activation found the co-hosting box runs **five** token-consuming runners (not one), each reading its queue from a **localhost-only** Postgres. So the migration also needs an SSH DB tunnel + control-plane variants of all five runners, and the runner unit named below (`provision-intent-runner-cloudbongos.*`) is replaced by `cohost-provision-intent-runner.*`. **Follow ADR 0132's §Activation, not the §Config + runner move step here.**
5
+ > **Superseded in part by [ADR 0132](0132-cohost-fleet-control-plane-migration.md)** (task 2071). The remote-exec *mechanism* here stands, but activation found the co-hosting box runs **five** token-consuming runners (not one), each reading its queue from a **localhost-only** Postgres. So the migration also needs an SSH DB tunnel + control-plane variants of all five runners, and the runner unit named below (`provision-intent-runner-cloudbongos.*`) is replaced by `cohost-provision-intent-runner.*`. **Follow ADR 0132's §Activation, not the §Config + runner move step here.**
6
6
 
7
7
  ## Context
8
8
 
9
- [ADR 0126](<redacted>.md) moved cloudbongos.com onto its own dedicated droplet that is also the **sole token-holding control plane** (`/etc/cloudbongos/box.env` holds the account-wide DigitalOcean + Cloudflare tokens). But it left the **co-hosting box** (`REDACTED_IP`) still holding its own DO token + a narrow Cloudflare token, used by two control-plane duties that still run *there*:
9
+ [ADR 0126](0126-dedicated-cloudbongos-control-plane-droplet.md) moved cloudbongos.com onto its own dedicated droplet that is also the **sole token-holding control plane** (`/etc/cloudbongos/box.env` holds the account-wide DigitalOcean + Cloudflare tokens). But it left the **co-hosting box** (`REDACTED_IP`) still holding its own DO token + a narrow Cloudflare token, used by two control-plane duties that still run *there*:
10
10
 
11
11
  - `box.js` — dev-box lifecycle (create/destroy droplets, DNS).
12
12
  - `provision.js` + `provision-intent-runner` — instance provisioning for co-tenant instances (`emersonian-circles.`, `staging.`) that **run on the co-hosting box**.
@@ -26,7 +26,7 @@ Add a **remote-exec-over-SSH path** to `provision.js` (`scripts/gds/provision.js
26
26
  - the **Cloudflare DNS hook** (`BOX_DNS_HOOK`) — the whole point is that the co-hosting box has no token;
27
27
  - the **standalone repo scaffold** (`git clone` / `package-core` / `bongos init` / `git push`).
28
28
 
29
- `sudo` (from `PROVISION_SUDO`, [ADR 0128](<redacted>.md)) composes cleanly: for a remote step the `sudo` runs on the co-hosting box (as its passwordless-sudo user). Co-tenant A records point at `PROVISION_PUBLIC_IP` = the **co-hosting box's** IP (where the co-tenant actually runs), which is the "point `PROVISION_PUBLIC_IP` appropriately" clause of the task.
29
+ `sudo` (from `PROVISION_SUDO`, [ADR 0128](0128-provisioning-runner-privilege-and-db-auth-model.md)) composes cleanly: for a remote step the `sudo` runs on the co-hosting box (as its passwordless-sudo user). Co-tenant A records point at `PROVISION_PUBLIC_IP` = the **co-hosting box's** IP (where the co-tenant actually runs), which is the "point `PROVISION_PUBLIC_IP` appropriately" clause of the task.
30
30
 
31
31
  ### `box.js` needs no code change
32
32
 
@@ -9,7 +9,7 @@
9
9
 
10
10
  Task 1650 asks that a builder's Claude session list **only** the skills their live rank can use. Today every session lists every skill, so a lower-rank builder can invoke a gated skill (e.g. `/planning-session`, `/blocker-review`) and only gets stopped partway through — a confusing dead-end.
11
11
 
12
- **This is UX decluttering, not a permission boundary.** Authority is already enforced two ways that stay exactly as-is: the server's `requireRank` (→ 403, [ADR 0016](<redacted>.md)) and each gated skill's own early rank self-check. Hiding a skill from the menu removes a dead-end; it grants and removes nothing. The task's assumed mechanism was **a `SessionStart` hook that filters the skill list by the rank we fetch at session start** (we already run such a hook, `.claude/hooks/session-start.js`).
12
+ **This is UX decluttering, not a permission boundary.** Authority is already enforced two ways that stay exactly as-is: the server's `requireRank` (→ 403, [ADR 0016](0016-trust-boundary-server-enforced-permissions.md)) and each gated skill's own early rank self-check. Hiding a skill from the menu removes a dead-end; it grants and removes nothing. The task's assumed mechanism was **a `SessionStart` hook that filters the skill list by the rank we fetch at session start** (we already run such a hook, `.claude/hooks/session-start.js`).
13
13
 
14
14
  ## Finding (the spike result)
15
15
 
@@ -44,4 +44,4 @@ Either way, the **server rank gate and the per-skill self-checks stay** — cons
44
44
 
45
45
  - Claude Code docs: *Extend Claude with skills* (skill listing, `skillOverrides`, `Skill(...)` permissions), *Hooks* (`SessionStart` `additionalContext`/`reloadSkills`; no runtime settings mutation), *Configure permissions* (`Skill(name)` deny rules).
46
46
  - Local: `.claude/hooks/session-start.js` (where rank is fetched today), `.claude/settings.json` (hooks/permissions wiring).
47
- - [ADR 0016](<redacted>.md) — server-enforced permissions (the real gate this UX never replaces).
47
+ - [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) — server-enforced permissions (the real gate this UX never replaces).
@@ -1,10 +1,10 @@
1
1
  # ADR 0132 — Migrating the co-hosting fleet to the control plane over an SSH DB tunnel
2
2
 
3
- **Status:** Accepted — repo half implemented 2026-07-05 (task [#2071](https://example.com/builders#/task/2071)); **units ship additive + not-enabled — activation is a sequenced operator-op** (see §Activation). Extends [ADR 0130](<redacted>.md); completes the "zero cloud tokens on the co-hosting box" goal of [ADR 0126](<redacted>.md) (task 2065 / blocker 64).
3
+ **Status:** Accepted — repo half implemented 2026-07-05 (task [#2071](https://example.com/builders#/task/2071)); **units ship additive + not-enabled — activation is a sequenced operator-op** (see §Activation). Extends [ADR 0130](0130-provision-remote-exec-over-ssh.md); completes the "zero cloud tokens on the co-hosting box" goal of [ADR 0126](0126-dedicated-cloudbongos-control-plane-droplet.md) (task 2065 / blocker 64).
4
4
 
5
5
  ## Context
6
6
 
7
- [ADR 0130](<redacted>.md) shipped the *code* to run `provision.js` from the control plane and remote-exec box steps over SSH. But when we went to actually strip the tokens (blocker 64), the endgame proved **not a switch-flip**. Three findings:
7
+ [ADR 0130](0130-provision-remote-exec-over-ssh.md) shipped the *code* to run `provision.js` from the control plane and remote-exec box steps over SSH. But when we went to actually strip the tokens (blocker 64), the endgame proved **not a switch-flip**. Three findings:
8
8
 
9
9
  1. **The co-hosting box (`REDACTED_IP`) runs FIVE token-consuming timers, not one.** ADR 0130 addressed only `provision-intent-runner`. The other four are the whole `box.js` **dev-box lifecycle**: `box-intent-runner` (provision/wake, 1-min), `box-idle-suspend` (15-min), `box-drift-reconcile` (hourly), `box-dormant-reclaim` (daily). Each needs the DO token; none were migrated.
10
10
  2. **Every runner reads its work-queue from the *local* `example` Postgres, which is firewalled to localhost** (`pg_hba`: `host … 127.0.0.1/32 scram-sha-256`; `:5432` is closed to the network — the correct posture). A runner moved to the control plane cannot reach the `box_intents` / `provisioning_intents` queues remotely. This is the real obstacle ADR 0130 did not solve: it moved *box-step execution*, not *queue reading*.
@@ -13,7 +13,7 @@ The last human friction in greenfield onboarding was wiring GitHub sign-in. The
13
13
 
14
14
  Use GitHub's **App Manifest flow** — the only real automation path GitHub offers. Instead of a hand-built OAuth App, the owner registers a GitHub **App** from a **pre-filled manifest**: one click, approve on GitHub, and GitHub hands *us* the credentials. Sign-in works unchanged because a GitHub App's user-to-server token hits the same `GET /user` the OAuth-app flow used; GitHub simply ignores the extra `scope` param for Apps, and we only use the token once at sign-in to identify the user before minting our own `builder_session` (so the App token's expiry is irrelevant).
15
15
 
16
- **The flow spans the trust boundary ([ADR 0111](<redacted>.md) §2 / [ADR 0016](<redacted>.md)) — deliberately:**
16
+ **The flow spans the trust boundary ([ADR 0111](0111-instance-hosting-provisioning-module.md) §2 / [ADR 0016](0016-trust-boundary-server-enforced-permissions.md)) — deliberately:**
17
17
 
18
18
  1. **Web tier** (the mothership hall, where the signed-in owner requested the instance) — `POST /api/bongos/provisioning/instances/:id/github-app` (own-scoped) mints a one-time `state` token, stores a `provisioning_oauth_manifests` row (status `pending`, TTL 30 min), and returns the pre-filled manifest + the GitHub form-POST target. The browser POSTs the manifest to GitHub.
19
19
  2. **GitHub** creates the App and redirects the owner's browser to the **mothership** callback `GET /api/bongos/provisioning/github-app/callback?code=&state=` (public — a browser redirect with no session; the unguessable single-use `state` is the authorization, exactly as GitHub's own conversion `code` is "the code IS the auth"). The callback stores the `code`, flips the row to `code_received`, and shows a "finishing setup" page.
@@ -4,7 +4,7 @@
4
4
  - **Date:** 2026-07-07
5
5
  - **Deciders:** example-owner (owner/Archon), Claude. Owner asked to have the npm/CLI onboarding commands ready but kept private pre-launch, choosing paid private npm over the free GitHub Packages option.
6
6
  - **Task:** [#2089](https://example.com/builders#/task/2089) (publish path + private config) · [#2092](https://example.com/builders#/task/2092) (the `@cloudbongos` → `@bongos` scope rename + first real publish) · **Goal:** 35 (project-creation flow), criterion 165.
7
- - **Refines:** [#2025](https://example.com/builders#/task/2025) (the 2026-07-04 *public* unscoped `cloudbongos` decision — now the launch-time go-public step, not superseded) · **Builds on:** [ADR 0108](<redacted>.md) (core-as-npm-dep), [#2053](https://example.com/builders#/task/2053) (vendored-tarball install).
7
+ - **Refines:** [#2025](https://example.com/builders#/task/2025) (the 2026-07-04 *public* unscoped `cloudbongos` decision — now the launch-time go-public step, not superseded) · **Builds on:** [ADR 0108](0108-instance-composition-configurable-root.md) (core-as-npm-dep), [#2053](https://example.com/builders#/task/2053) (vendored-tarball install).
8
8
 
9
9
  ## Context
10
10
 
@@ -27,12 +27,12 @@ Publish **`@bongos/core`** and **`@bongos/client`** as **scoped, private** npm p
27
27
  > mercury, charter, demo) found no dependency on it; the only matches were its own manifest. Everyone
28
28
  > who needs the generated client **vendors a copy** — `modules/dev-box/app/src/vendor/bongos-client.cjs`,
29
29
  > and `build-cli-package.js` into `@cloudbongos/cli`, which as a *public* package could not have
30
- > depended on a private one anyway ([ADR 0258](<redacted>.md)).
30
+ > depended on a private one anyway ([ADR 0258](0258-the-public-cli-is-a-generated-client-package-not-the-published-core.md)).
31
31
  > A stale generated client that nobody installs is worse than none: the only thing it could do is
32
32
  > mislead someone into pinning a client 500 versions behind the routes.
33
33
  >
34
34
  > The owner removed it from the registry. The **generated artifact stays** and still regenerates
35
- > ([ADR 0118](<redacted>.md)) — `clients/bongos-client/` and
35
+ > ([ADR 0118](0118-api-contract-source-of-truth-code-first.md)) — `clients/bongos-client/` and
36
36
  > `gen-api-client.js` earn their place. What is retired is only the claim that it is a package: the
37
37
  > generator no longer emits a `publishConfig`, and its README now documents vendoring instead of
38
38
  > `npm install`. **This ADR's core half is unaffected.**