@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
@@ -5,13 +5,13 @@
5
5
  - **Deciders:** Lars Kristensen (Archon), Claude
6
6
  - **Track:** `internal` (GDS)
7
7
  - **Context tasks:** GDS-V4 **[#515](https://example.com/builders#/task/515)** (the capability umbrella) · **[#539](https://example.com/builders#/task/539)** (this design task — ADR + task breakdown only, no implementation; mirrors the design-only shape of [#441](<redacted>.md)).
8
- - **Extends:** [ADR 0024 — Multi-Agent System architecture](<redacted>.md) (the BFG is its Phase 6) · [ADR 0026 — The BFG charter](<redacted>.md) (this adds a **new capability cluster, 6D**, to the BFG's "best building experience" objective) · [ADR 0016 — Trust boundary](<redacted>.md) (narrowly extended — session detail now lives server-side and is BFG-readable across builders) · [ADR 0022 — Secrets policy](0022-secrets-policy.md) (scrubbing on upload). Touches `credit_log` (example), `karma_log`, `builders` (rank + tenure), `task_grades` (the upsert-unique gap), `session_logs`.
8
+ - **Extends:** [ADR 0024 — Multi-Agent System architecture](0024-multi-agent-system-architecture.md) (the BFG is its Phase 6) · [ADR 0026 — The BFG charter](0026-bfg-memory-hygiene-and-cross-builder-learning.md) (this adds a **new capability cluster, 6D**, to the BFG's "best building experience" objective) · [ADR 0016 — Trust boundary](0016-trust-boundary-server-enforced-permissions.md) (narrowly extended — session detail now lives server-side and is BFG-readable across builders) · [ADR 0022 — Secrets policy](0022-secrets-policy.md) (scrubbing on upload). Touches `credit_log` (example), `karma_log`, `builders` (rank + tenure), `task_grades` (the upsert-unique gap), `session_logs`.
9
9
 
10
10
  ## Context
11
11
 
12
12
  On **2026-06-01** Lars asked for a manual evaluation of the **[#506](https://example.com/builders#/task/506)** session — a one-line welcome-copy fix that burned ~90% of its tokens on process ceremony + footgun recovery rather than the actual change. The post-mortem ([session log](../session-logs/<redacted>.md)) produced three concrete systemic fixes — **[#513](https://example.com/builders#/task/513)** (trivial-diff fast-path for the grader), **[#514](https://example.com/builders#/task/514)** (self-explaining API error hints), **[#468](https://example.com/builders#/task/468)** (a stale smoke assertion) — plus a security finding (`#526`).
13
13
 
14
- Lars wants that analysis **automated and run across every session**, to surface systemic build-process waste — and, as the inverse, to mine *top performers'* sessions for transferable good practice (the [ADR 0026](<redacted>.md) §6B objective). This ADR is the design; [#506](https://example.com/builders#/task/506) is the **hand-labeled seed/validation corpus**.
14
+ Lars wants that analysis **automated and run across every session**, to surface systemic build-process waste — and, as the inverse, to mine *top performers'* sessions for transferable good practice (the [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) §6B objective). This ADR is the design; [#506](https://example.com/builders#/task/506) is the **hand-labeled seed/validation corpus**.
15
15
 
16
16
  ### The substrate problem (and the decision that resolves it)
17
17
 
@@ -22,7 +22,7 @@ The two candidate data sources don't overlap:
22
22
 
23
23
  Two earlier framings were put to Lars and rejected (see Alternatives): a local-only `/session-review` slash command, and a server-side analyzer. **Lars's decision** resolves the substrate problem directly:
24
24
 
25
- > **At ship time, upload the session's details to the server.** The BFG then runs as a **local Claude Code instance** (as it already does for hygiene, [ADR 0026](<redacted>.md) §6A.1) that **calls the server** to search across *all* sessions and deep-dive the interesting ones. The builder never runs anything — findings come to them.
25
+ > **At ship time, upload the session's details to the server.** The BFG then runs as a **local Claude Code instance** (as it already does for hygiene, [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) §6A.1) that **calls the server** to search across *all* sessions and deep-dive the interesting ones. The builder never runs anything — findings come to them.
26
26
 
27
27
  This is the load-bearing choice: the rich data stops being local, so one cross-builder corpus serves both the waste-hunt and the good-practice mine, and the analysis stays where the BFG already lives (a Claude Code routine), not on the always-on $14/mo droplet.
28
28
 
@@ -55,7 +55,7 @@ The server stores and serves; it does **no analysis**. Two endpoints over `sessi
55
55
  - **Search/filter** by *session* fields (`example_earned`, `total_tokens`, `duration`, the derived metrics) **and joined `builders` fields** — **tenure** (`now − created_at`), **rank**, **karma**, **example** (`total_credits`). So queries like *"rank = Xenos AND tenure < 7d AND overhead > 0.7"* (onboarding friction) or *"karma top-decile"* (good-practice mining) are expressible against one corpus.
56
56
  - **Fetch one session's** full scrubbed detail for deep-dive.
57
57
 
58
- Cross-builder reads are gated to the **BFG service principal** ([ADR 0026](<redacted>.md) §6B posture — the *exact principal identity*, not rank) and write an **`audit_log` row per read**. A builder may always read their *own* sessions self-serve. Filtering is plain SQL/keyword **for now** (semantic/vector deferred, consistent with [ADR 0024](<redacted>.md)/[0026](<redacted>.md)).
58
+ Cross-builder reads are gated to the **BFG service principal** ([ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) §6B posture — the *exact principal identity*, not rank) and write an **`audit_log` row per read**. A builder may always read their *own* sessions self-serve. Filtering is plain SQL/keyword **for now** (semantic/vector deferred, consistent with [ADR 0024](0024-multi-agent-system-architecture.md)/[0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md)).
59
59
 
60
60
  ### 3. The BFG routine — local Claude Code, search → deep-dive → reason (6D.3)
61
61
 
@@ -83,20 +83,20 @@ Ratio = work tokens ÷ total (with a parallel turn-based ratio). [#506](https://
83
83
  ### 4. Findings to the builder (6D.4)
84
84
 
85
85
  - **Systemic** build-process fixes → `idea_inbox` rows / backlog tasks (conservative grouping, like §6A.1 and the manual [#506](https://example.com/builders#/task/506) → [#513](https://example.com/builders#/task/513)/[#514](https://example.com/builders#/task/514)/[#468](https://example.com/builders#/task/468)).
86
- - **Per-builder** process findings → delivered to *that* builder via the [ADR 0026](<redacted>.md) **§6C transparent, BFG-authored, attributed note** path (builder-visible, deletable, audit-logged) — for the builder to **evaluate and act on**. The §6C write path is built by 0026's 6C.1/6C.2; 6D.4 wires session findings *into* it and degrades to inbox-only until 6C exists.
86
+ - **Per-builder** process findings → delivered to *that* builder via the [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) **§6C transparent, BFG-authored, attributed note** path (builder-visible, deletable, audit-logged) — for the builder to **evaluate and act on**. The §6C write path is built by 0026's 6C.1/6C.2; 6D.4 wires session findings *into* it and degrades to inbox-only until 6C exists.
87
87
 
88
88
  The builder-field querying does double duty: it powers the **waste hunt** *and* the charter's **6B good-practice mining** — one corpus, both objectives.
89
89
 
90
90
  ### Trust & privacy (load-bearing)
91
91
 
92
- Uploading session detail means transcripts **now live server-side and are BFG-readable across builders** — today they are local-only. This is a deliberate, narrow extension of [ADR 0016](<redacted>.md), in the same family as [ADR 0026](<redacted>.md)'s cross-builder paths. The safeguards are **enforcement requirements, not prose**:
92
+ Uploading session detail means transcripts **now live server-side and are BFG-readable across builders** — today they are local-only. This is a deliberate, narrow extension of [ADR 0016](0016-trust-boundary-server-enforced-permissions.md), in the same family as [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md)'s cross-builder paths. The safeguards are **enforcement requirements, not prose**:
93
93
 
94
94
  - **Secrets scrubbed on upload** ([ADR 0022](0022-secrets-policy.md)) — known secret patterns + the builder's own env values redacted *before* the transcript leaves the machine; covered by a test.
95
95
  - **BFG-principal-only** cross-builder reads (a builder reads only their own self-serve); **`audit_log` row per cross-builder read**.
96
96
  - **Retention window** — sessions are pruned after a bounded period; the corpus is not hoarded forever.
97
97
  - **Builder-visible** — a builder can see, and request deletion of, their uploaded sessions.
98
98
 
99
- > **Non-goal — not covert surveillance.** This is not a tool for secretly ranking or punishing builders. Findings are transparent and attributed (the §6C posture). This mirrors [ADR 0026](<redacted>.md)'s explicit rejection of covert "nightmares": the steering is honest, visible, and reversible.
99
+ > **Non-goal — not covert surveillance.** This is not a tool for secretly ranking or punishing builders. Findings are transparent and attributed (the §6C posture). This mirrors [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md)'s explicit rejection of covert "nightmares": the steering is honest, visible, and reversible.
100
100
 
101
101
  ### Validation — the [#506](https://example.com/builders#/task/506) regression gate (6D.5)
102
102
 
@@ -122,26 +122,26 @@ This is the regression gate: classifier/detector changes must keep finding the k
122
122
  | **6D.5** | [#544](https://example.com/builders#/task/544) | [#506](https://example.com/builders#/task/506) validation/regression harness (seed fixture) | The evaluator provably reproduces the hand-labeled case. |
123
123
  | **6D.6** | [#545](https://example.com/builders#/task/545) | *(optional)* append-only grade-attempt logging | Re-grade thrash becomes countable — *only if the signal earns its keep.* |
124
124
 
125
- Each sub-phase answers "is this earning its tokens?" before the next — the Musk gate, same as [ADR 0024](<redacted>.md)/[0026](<redacted>.md).
125
+ Each sub-phase answers "is this earning its tokens?" before the next — the Musk gate, same as [ADR 0024](0024-multi-agent-system-architecture.md)/[0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md).
126
126
 
127
127
  ## Alternatives considered
128
128
 
129
129
  - **Local-only `/session-review` slash command (rejected by Lars).** The first proposal kept the rich data local and had the builder run the review on demand. Rejected: *"I want the average builder to not think about this"* — and a local tool can never see cross-builder sessions. Upload-on-ship + a server corpus replaces it.
130
130
  - **Server-side analyzer (rejected by Lars).** The second proposal ran the analysis on the server. Rejected: the BFG **runs as a local Claude Code instance**; the server only *stores and serves*. This keeps expensive LLM reasoning off the always-on droplet and matches the BFG's existing identity (a `SKILL.md` routine).
131
131
  - **Digest-only upload (deferred).** Store just the computed metrics, not the transcript. Rejected for now because the BFG must be able to deep-dive with *new* criteria later — a digest freezes the analysis. Full (scrubbed) transcript chosen, bounded by a retention window. Revisit if storage cost bites.
132
- - **Vector / semantic search over the corpus (deferred).** Consistent with [ADR 0024](<redacted>.md)/[0026](<redacted>.md)'s "vector store deferred." Plain SQL + keyword "for now" (Lars's word).
132
+ - **Vector / semantic search over the corpus (deferred).** Consistent with [ADR 0024](0024-multi-agent-system-architecture.md)/[0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md)'s "vector store deferred." Plain SQL + keyword "for now" (Lars's word).
133
133
  - **Counting re-grade thrash from `task_grades` (not possible).** `task_grades.task_id` is `UNIQUE` — only the *final* grade survives, so the number of grade attempts isn't persisted. 6D.6 optionally adds append-only grade-attempt logging if that signal proves wanted.
134
134
 
135
135
  ## Consequences
136
136
 
137
137
  **Good:**
138
138
  - The [#506](https://example.com/builders#/task/506) post-mortem becomes a **standing, automatic** capability; systemic waste surfaces as `idea_inbox`/tasks without anyone asking.
139
- - **One queryable corpus** serves both the waste hunt and [ADR 0026](<redacted>.md) §6B good-practice propagation.
139
+ - **One queryable corpus** serves both the waste hunt and [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) §6B good-practice propagation.
140
140
  - Analysis stays a local Claude Code routine — **no new always-on cost** on the droplet.
141
141
 
142
142
  **Bad / accepted:**
143
143
  - **Session transcripts now live server-side** — a new sensitive store to secure, scrub, and retain. Mitigated by upload-time scrubbing + principal-gating + audit + retention + builder visibility.
144
- - **The BFG can read across builders' sessions** — the audit trail is what keeps that legible (same residual risk [ADR 0026](<redacted>.md) accepted for memory).
144
+ - **The BFG can read across builders' sessions** — the audit trail is what keeps that legible (same residual risk [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) accepted for memory).
145
145
  - **`ship.js` gains an upload step** — it must be fast, non-blocking, and fail-safe; a broken upload can never block a ship.
146
146
 
147
147
  **Reversibility:**
@@ -161,9 +161,9 @@ evaluator's numbers did not reflect real friction. Three GDS-V4 fixes correct it
161
161
 
162
162
  ## References
163
163
 
164
- - [ADR 0024 — Multi-Agent System architecture](<redacted>.md) — the BFG is Phase 6
165
- - [ADR 0026 — The BFG charter](<redacted>.md) — 6D extends the "best building experience" objective; §6C is the findings-delivery path
166
- - [ADR 0016 — Trust boundary](<redacted>.md) — the rule this narrowly extends
164
+ - [ADR 0024 — Multi-Agent System architecture](0024-multi-agent-system-architecture.md) — the BFG is Phase 6
165
+ - [ADR 0026 — The BFG charter](0026-bfg-memory-hygiene-and-cross-builder-learning.md) — 6D extends the "best building experience" objective; §6C is the findings-delivery path
166
+ - [ADR 0016 — Trust boundary](0016-trust-boundary-server-enforced-permissions.md) — the rule this narrowly extends
167
167
  - [ADR 0022 — Secrets policy](0022-secrets-policy.md) — upload-time scrubbing
168
168
  - [2026-06-01 #506 post-mortem session log](../session-logs/<redacted>.md) — the hand-labeled seed corpus
169
169
  - `migrations/003_pms.sql` (`credit_log`, `session_logs`, `claims`), `migrations/016_pms_task_grades.sql` (the upsert-unique grade), `migrations/040_builder_karma.sql` (karma)
@@ -5,7 +5,7 @@
5
5
  - **Deciders:** Lars Kristensen (Archon), Claude
6
6
  - **Track:** `internal` (the status dashboard / The Watch)
7
7
  - **Context tasks:** **[#565](https://example.com/builders#/task/565)** (slice 1 — external prober + alert + this ADR) · **blocker [#6](https://example.com/builders#/blocker/6)** (DigitalOcean backup payment + billing alerts — root-cause prevention, Lars-only) · follow-up **B** (move `public-status/` off-box + CORS on `/api/gds/public/*` + repoint `status.` DNS) · follow-up **C** (backfill the 2026-06-03 incident into the honest uptime history).
8
- - **Relates to:** [ADR 0003 — Cloudflare Origin Cert](<redacted>.md) (the CF↔origin leg) · the in-process poller [`src/bongos/uptime-poller.js`](../../src/bongos/uptime-poller.js) (now demoted from public source-of-truth) · [`docs/recipes/ops-gotchas.md`](../recipes/ops-gotchas.md) (the new "status page shared fate" gotcha).
8
+ - **Relates to:** [ADR 0003 — Cloudflare Origin Cert](0003-cloudflare-origin-cert-over-letsencrypt.md) (the CF↔origin leg) · the in-process poller [`src/bongos/uptime-poller.js`](../../src/bongos/uptime-poller.js) (now demoted from public source-of-truth) · [`docs/recipes/ops-gotchas.md`](../recipes/ops-gotchas.md) (the new "status page shared fate" gotcha).
9
9
 
10
10
  ## Context
11
11
 
@@ -1,6 +1,6 @@
1
1
  # ADR 0030 — Builders-hall live updates via Postgres NOTIFY → WebSocket
2
2
 
3
- - **Status:** Accepted — **transport superseded by [ADR 0069](<redacted>.md)** (the hall now delivers nudges over SSE, not a Colyseus WebSocket room, so it works on a game-less Cloud Bongos boot; R55). The **change-signal layer below (§1 — `NOTIFY` + `src/bongos/live-channel.js`) is unchanged and still authoritative**; only the §2 delivery transport moved.
3
+ - **Status:** Accepted — **transport superseded by [ADR 0069](0069-hall-live-channel-sse-decouple.md)** (the hall now delivers nudges over SSE, not a Colyseus WebSocket room, so it works on a game-less Cloud Bongos boot; R55). The **change-signal layer below (§1 — `NOTIFY` + `src/bongos/live-channel.js`) is unchanged and still authoritative**; only the §2 delivery transport moved.
4
4
  - **Date:** 2026-06-03
5
5
  - **Deciders:** task [#569](https://example.com/builders#/task/569) (commissioned by Lars — "these checks aren't very live, need to refresh every time"); transport chosen by Lars (WebSocket)
6
6
  - **Track:** `internal` (the builders hall)
@@ -1,7 +1,7 @@
1
1
  # ADR 0031 — Cloud dev environments for builders (hybrid: Claude Desktop → SSH → containerized DigitalOcean box)
2
2
 
3
3
  **Date:** 2026-06-04
4
- **Context:** GDS-V3, task [#595](https://example.com/builders#/task/595) (claim `#477`). Feeds done-when criteria **C1** (`onboarding ≤ 2h`) and **C8** (`cloneable repo / local-first memory, server-canonical on ship`). Companion to [ADR 0016](<redacted>.md) (trust boundary — same server-enforced posture), [ADR 0018](<redacted>.md) (Xenos → Metic → Archon), [ADR 0022](0022-secrets-policy.md) (no secrets in repo — precondition for a cloneable box), [ADR 0024](<redacted>.md) (memory follows the builder — unchanged by where the box runs), and [ADR 0002](<redacted>.md) (we already run on DigitalOcean).
4
+ **Context:** GDS-V3, task [#595](https://example.com/builders#/task/595) (claim `#477`). Feeds done-when criteria **C1** (`onboarding ≤ 2h`) and **C8** (`cloneable repo / local-first memory, server-canonical on ship`). Companion to [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (trust boundary — same server-enforced posture), [ADR 0018](0018-three-rank-model-goes-live.md) (Xenos → Metic → Archon), [ADR 0022](0022-secrets-policy.md) (no secrets in repo — precondition for a cloneable box), [ADR 0024](0024-cloneable-repo-local-first-memory.md) (memory follows the builder — unchanged by where the box runs), and [ADR 0002](0002-digitalocean-over-hetzner.md) (we already run on DigitalOcean).
5
5
  **Status:** Accepted. *Decision recorded this session; implementation tasks to be seeded separately (see the Implementation sub-tasks at the end).*
6
6
  **Track:** `internal` (dev-system architecture).
7
7
 
@@ -53,7 +53,7 @@ We will adopt a **hybrid** model with a single shared foundation. In plain terms
53
53
 
54
54
  ### 1. UI — Claude Desktop is the primary interface
55
55
 
56
- > **Superseded in part (2026-06-06, [ADR 0038](<redacted>.md)):** the thin-device `claude rc` always-on-service on-ramp described in the Thin-device bullet below is retired. Headless `claude rc` can't bootstrap (Trusted-Devices enrollment is interactive-only); the browser-only on-ramp is now a box-served `ttyd` web terminal over an outbound Cloudflare Tunnel where the builder runs normal interactive `claude`. See [ADR 0038](<redacted>.md) (and [ADR 0040](<redacted>.md) for in-session Remote Control as the default browser experience). The Desktop→SSH and Local paths below are unchanged.
56
+ > **Superseded in part (2026-06-06, [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md)):** the thin-device `claude rc` always-on-service on-ramp described in the Thin-device bullet below is retired. Headless `claude rc` can't bootstrap (Trusted-Devices enrollment is interactive-only); the browser-only on-ramp is now a box-served `ttyd` web terminal over an outbound Cloudflare Tunnel where the builder runs normal interactive `claude`. See [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md) (and [ADR 0040](0040-remote-control-default-browser-onramp.md) for in-session Remote Control as the default browser experience). The Desktop→SSH and Local paths below are unchanged.
57
57
 
58
58
  Most builders want a clean GUI, not a terminal or an IDE. The redesigned Claude Desktop app (April 2026) has a **Code** tab whose session **Environment** selector offers three mutually-exclusive choices for *where the worker runs*: **Local**, **Remote** (Anthropic-managed cloud VM), and **SSH** (a machine the org controls). We build on **SSH**.
59
59
 
@@ -96,7 +96,7 @@ The barrier to *start* is zero (org pays the first box, per the decision to **no
96
96
 
97
97
  The repo is **private** (today under a personal account — see §7; a move to a GitHub Organization would change the enforcement options below). Putting the worker on a box we control, reached only through the GUI, turns repo access from *"every builder holds a permanent local clone forever"* into *"access is to a box we own — gated, revocable, audited, egress-restricted."*
98
98
 
99
- - **Gate source access by rank.** Below a chosen rank: no box, no source. The box (not the builder) holds the scoped GitHub credential; below-rank builders have no direct clone rights. Extends the [ADR 0016](<redacted>.md) trust boundary from "writes are gated" to "source access is gated."
99
+ - **Gate source access by rank.** Below a chosen rank: no box, no source. The box (not the builder) holds the scoped GitHub credential; below-rank builders have no direct clone rights. Extends the [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) trust boundary from "writes are gated" to "source access is gated."
100
100
  - **No permanent local copy** (the code lives on the box; SSH/Remote-Control bypass any local folder).
101
101
  - **Central revocation + clean offboarding** (revoke rank → de-provision box → source access gone).
102
102
  - **Prod deploy moves to CI** (GitHub Actions, like staging already is), so **no builder box ever holds the production droplet SSH key.**
@@ -126,9 +126,9 @@ The repo is **private** (today under a personal account — see §7; a move to a
126
126
  **Good:**
127
127
  - Onboarding drops from "install a toolchain and hope" to "open Claude Desktop, pick the Example Dev Box" — the direct lever on C1 (≤2h).
128
128
  - Org inference cost = $0 (BYO subscription); org compute cost ≈ $0 ongoing (auto-suspend + self-funding), bounded by a small starter-box pool.
129
- - The container is a real security upgrade: rank-gated source access, no permanent local clones, central revocation, clean offboarding, egress restriction — strengthening [ADR 0016](<redacted>.md).
129
+ - The container is a real security upgrade: rank-gated source access, no permanent local clones, central revocation, clean offboarding, egress restriction — strengthening [ADR 0016](0016-trust-boundary-server-enforced-permissions.md).
130
130
  - The box stays portable (devcontainer), so we are not locked to DigitalOcean, and VS-Code power-users can self-fund Codespaces off the same spec.
131
- - [ADR 0024](<redacted>.md) memory sync is unaffected — it keys on `builder_id`, not on where the box runs.
131
+ - [ADR 0024](0024-cloneable-repo-local-first-memory.md) memory sync is unaffected — it keys on `builder_id`, not on where the box runs.
132
132
 
133
133
  **Costs / what it commits us to:**
134
134
  - Real build work: author + test the devcontainer across a DO box and a laptop (the `sharp` native build is the usual snag), build the auto-suspend automation (DO has none native), wire prod-deploy to CI, build rank-gated box provisioning, and write the onboarding primer page.
@@ -152,7 +152,7 @@ The repo is **private** (today under a personal account — see §7; a move to a
152
152
 
153
153
  ### §9.2 — Onboarding repo-access scoping: rank-gated, server-issued, fetched-not-baked (2026-06-05, [#600](https://example.com/builders#/task/600))
154
154
 
155
- **Decision: the box holds NO baked credential — it fetches a rank-scoped clone spec from the GDS at boot + on a cron, gated on the builder's LIVE rank.** This extends the [ADR 0016](<redacted>.md) trust boundary from "writes are gated" to "source is gated": `GET /api/gds/box/source-access` (`requireBuilder`; the scope + allow/deny decided inside from the live DB rank, not a static `requireRank`) returns either a 403 or a scope-appropriate spec + a short-lived, operator-supplied credential.
155
+ **Decision: the box holds NO baked credential — it fetches a rank-scoped clone spec from the GDS at boot + on a cron, gated on the builder's LIVE rank.** This extends the [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) trust boundary from "writes are gated" to "source is gated": `GET /api/gds/box/source-access` (`requireBuilder`; the scope + allow/deny decided inside from the live DB rank, not a static `requireRank`) returns either a 403 or a scope-appropriate spec + a short-lived, operator-supplied credential.
156
156
 
157
157
  - **Scope by rank** (`src/bongos/box-access.js`, `boxScopeForRank` from [#598](https://example.com/builders#/task/598)): **Xenos → `starter`** (cone-mode sparse-checkout of `.devcontainer`, `art`, `docs`, `public-status`, `generative-ideas.md` — the "first tasks on a scoped surface" this question asked for); **Metic+ → `full`**. Graduation rescopes the box (the box re-clones the full surface on its next refresh). Fail-closed: any unknown scope collapses to `starter`.
158
158
  - **Credential is fetched, never baked** (`src/bongos/box-credential.js`, env-backed default; the secret lives in the prod env per [ADR 0022](0022-secrets-policy.md), `configured:false` until set). The box clones via a one-shot authenticated URL then scrubs the token from `.git/config` (`infra/box-source-fetch.sh`). Because access is re-checked live on every fetch, **revocation is instant at the credential layer** — a demoted/deactivated builder is 403'd on their next refresh.
@@ -197,7 +197,7 @@ Droplet-vs-pool was a *backend* choice; it did not address the newcomer on-ramp.
197
197
 
198
198
  ### §9.4 — Box onboarding middleware: an intent queue, never the DO token in the web process (2026-06-06, [#701](https://example.com/builders#/task/701))
199
199
 
200
- > **Superseded in part (2026-06-06, [ADR 0038](<redacted>.md)):** the `claude rc` Remote-Control pairing path in this section — `infra/box-report-pairing.sh`, the `box/pairing` + `box/pairing-link` routes, and the "box reports its link UP" Chromebook flow — is retired. `claude rc` can't run headless on a box (see ADR 0038 *Problem*). The browser-only on-ramp is now a box-served `ttyd` web terminal over a Cloudflare Tunnel. The intent-queue / `box/ensure` auto-provision + wake-on-connect machinery below is **unaffected**.
200
+ > **Superseded in part (2026-06-06, [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md)):** the `claude rc` Remote-Control pairing path in this section — `infra/box-report-pairing.sh`, the `box/pairing` + `box/pairing-link` routes, and the "box reports its link UP" Chromebook flow — is retired. `claude rc` can't run headless on a box (see ADR 0038 *Problem*). The browser-only on-ramp is now a box-served `ttyd` web terminal over a Cloudflare Tunnel. The intent-queue / `box/ensure` auto-provision + wake-on-connect machinery below is **unaffected**.
201
201
 
202
202
  **Decision: the web process records a REQUEST (an "intent"); the control-plane runner executes it.** The hard constraint (§6 + the `routes/box.js` header) is that the internet-facing Node process must never hold `DO_API_TOKEN` — a stolen builder token could otherwise spin up or destroy infrastructure. So [#701](https://example.com/builders#/task/701) does NOT move provisioning into the web tier. Instead:
203
203
 
@@ -1,7 +1,7 @@
1
1
  # ADR 0032 — Discord as a one-way mirror of the GDS (outbound broadcast moves off Google Chat)
2
2
 
3
3
  **Date:** 2026-06-04
4
- **Context:** GDS-V3, task [#607](https://example.com/builders#/task/607) (claim `#482`). Stands up a Discord server for Example / Example — one server, permission-walled into a player wing and a builder wing — and moves the ship-broadcast off Google Chat. Companion to [ADR 0016](<redacted>.md) (the trust boundary — the load-bearing constraint here), [ADR 0018](<redacted>.md) (Xenos → Metic → Archon, the ranks Discord roles mirror), [ADR 0022](0022-secrets-policy.md) (webhook URLs are secrets, kept out of the repo), and [ADR 0008](0008-google-chat-oauth-user-auth.md) (the Google Chat broadcast this supersedes for outbound).
4
+ **Context:** GDS-V3, task [#607](https://example.com/builders#/task/607) (claim `#482`). Stands up a Discord server for Example / Example — one server, permission-walled into a player wing and a builder wing — and moves the ship-broadcast off Google Chat. Companion to [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (the trust boundary — the load-bearing constraint here), [ADR 0018](0018-three-rank-model-goes-live.md) (Xenos → Metic → Archon, the ranks Discord roles mirror), [ADR 0022](0022-secrets-policy.md) (webhook URLs are secrets, kept out of the repo), and [ADR 0008](0008-google-chat-oauth-user-auth.md) (the Google Chat broadcast this supersedes for outbound).
5
5
  **Status:** Accepted. Phase 2 (outbound ship broadcast → Discord) implemented in [#607](https://example.com/builders#/task/607). Phases 3+ (interaction bot, inbound retirement, role sync) scoped below, not yet built.
6
6
  **Track:** `internal` (dev-system / team communication).
7
7
 
@@ -22,7 +22,7 @@ The temptation, standing up Discord, is to let it *own* things — roles that gr
22
22
 
23
23
  1. **One server, two role families, permission-walled.** A public (player) wing and a builder-only wing in a single server. Builder roles **mirror** the live GDS ranks (Xenos / Metic / Archon) and gate the builder wing; players get a `Citizen` baseline (a `Patron` tier later, once purchases ship).
24
24
 
25
- 2. **Discord roles are cosmetic, never authoritative ([ADR 0016](<redacted>.md)).** A Discord "Archon" badge unlocks Discord *channels* and nothing else. Authority stays in `builders.rank` on the prod DB, re-checked server-side per request. A Discord role is a *sticker*; the GDS holds the *keys*. Roles reflect what the DB already says — they never decide it. When a future bot auto-assigns roles, it reads `builders.rank` and writes the Discord role, never the reverse.
25
+ 2. **Discord roles are cosmetic, never authoritative ([ADR 0016](0016-trust-boundary-server-enforced-permissions.md)).** A Discord "Archon" badge unlocks Discord *channels* and nothing else. Authority stays in `builders.rank` on the prod DB, re-checked server-side per request. A Discord role is a *sticker*; the GDS holds the *keys*. Roles reflect what the DB already says — they never decide it. When a future bot auto-assigns roles, it reads `builders.rank` and writes the Discord role, never the reverse.
26
26
 
27
27
  3. **The GDS stays the single source of truth.** Logs mirror *into* Discord (webhooks, one-way). "Upvotes" arrive as Discord reactions that a bot writes *back* to the GDS as `peer_upvote` karma / idea votes — Discord is the input device, the GDS records the fact. No state's canonical home moves to Discord.
28
28
 
@@ -44,7 +44,7 @@ The temptation, standing up Discord, is to let it *own* things — roles that gr
44
44
  ## Alternatives considered
45
45
 
46
46
  - **Separate servers for builders vs players.** Rejected — one server with a permission-walled builder wing is the standard pattern and keeps the community in one place.
47
- - **Discord roles grant real permissions.** Rejected outright — violates [ADR 0016](<redacted>.md). Anything a builder's Discord membership could grant must be re-derived server-side from `builders.rank`.
47
+ - **Discord roles grant real permissions.** Rejected outright — violates [ADR 0016](0016-trust-boundary-server-enforced-permissions.md). Anything a builder's Discord membership could grant must be re-derived server-side from `builders.rank`.
48
48
  - **Move idea votes / karma canonical into Discord.** Rejected — the GDS stays source of truth; Discord is an input surface whose reactions a bot writes back.
49
49
  - **Mirror outbound to both Google Chat and Discord.** Rejected — replace, don't double-post; the community consolidates on Discord. Google Chat keeps only its inbound role until Phase 3.
50
50
  - **A Discord bot (gateway) for outbound too.** Rejected for Phase 2 — a webhook is a one-line HTTP POST with no token or process to host; the bot is only needed for *reading* (Phase 3).
@@ -1,7 +1,7 @@
1
1
  # ADR 0033 — Discord bot as a service principal (account-linking, both-mode upvoting, role-sync, inbound retirement)
2
2
 
3
3
  **Date:** 2026-06-04
4
- **Context:** GDS-V3, task [#619](https://example.com/builders#/task/619). Phase 3 of the Discord integration begun in [ADR 0032](0032-discord-mirror-of-gds.md) ([#607](https://example.com/builders#/task/607)). Where Phase 2 was a one-way webhook (no identity, no inbound), Phase 3 adds a **bot** — a persistent connection that reads reactions/messages and assigns roles — which means Discord *actions* now trigger GDS *writes*. That lands on the trust boundary. Companion to [ADR 0016](<redacted>.md) (the boundary), [ADR 0026](<redacted>.md) (the service-principal + identity-gate pattern this reuses), [ADR 0018](<redacted>.md) (the ranks role-sync mirrors), [ADR 0022](0022-secrets-policy.md) (bot token + OAuth secret), and [ADR 0008](0008-google-chat-oauth-user-auth.md) (the inbound path this retires).
4
+ **Context:** GDS-V3, task [#619](https://example.com/builders#/task/619). Phase 3 of the Discord integration begun in [ADR 0032](0032-discord-mirror-of-gds.md) ([#607](https://example.com/builders#/task/607)). Where Phase 2 was a one-way webhook (no identity, no inbound), Phase 3 adds a **bot** — a persistent connection that reads reactions/messages and assigns roles — which means Discord *actions* now trigger GDS *writes*. That lands on the trust boundary. Companion to [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (the boundary), [ADR 0026](0026-bfg-memory-hygiene-and-cross-builder-learning.md) (the service-principal + identity-gate pattern this reuses), [ADR 0018](0018-three-rank-model-goes-live.md) (the ranks role-sync mirrors), [ADR 0022](0022-secrets-policy.md) (bot token + OAuth secret), and [ADR 0008](0008-google-chat-oauth-user-auth.md) (the inbound path this retires).
5
5
  **Status:** Accepted (design). Implementation seeded as separate sub-tasks (listed at the end); nothing here is built yet. Foundation build is blocked on creating the Discord bot application.
6
6
  **Track:** `internal` (dev-system / team communication).
7
7
 
@@ -15,13 +15,13 @@ ADR 0032 established that Discord is a one-way mirror of the GDS. Phase 2 honore
15
15
  - **Role-sync** — builder ranks should appear as Discord role badges.
16
16
  - **Inbound** — team messages in Discord should become ideas, retiring the Google Chat inbound path.
17
17
 
18
- The first and third make a **Discord event cause a GDS write**. Naively, a bot with a database connection could just write karma or votes. That would re-open exactly the hole [ADR 0016](<redacted>.md) closes: an actor *outside* the trust boundary deciding authoritative state. We need a design where the bot can act **without ever becoming an authority**.
18
+ The first and third make a **Discord event cause a GDS write**. Naively, a bot with a database connection could just write karma or votes. That would re-open exactly the hole [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) closes: an actor *outside* the trust boundary deciding authoritative state. We need a design where the bot can act **without ever becoming an authority**.
19
19
 
20
20
  ## Decision
21
21
 
22
22
  ### 1. The bot is a service principal — trusted for identity, never for authorization
23
23
 
24
- The bot authenticates to the GDS as a dedicated **service principal** (`system_role = 'discord_bot'`), gated by a `requireDiscordBot` middleware that checks that exact identity — **not** a rank. This is the same shape the BFG cross-builder write path uses ([ADR 0026 §6C](<redacted>.md)): a stolen or rank-escalated *human* token has `system_role = NULL` and is rejected; only the bot principal's row passes.
24
+ The bot authenticates to the GDS as a dedicated **service principal** (`system_role = 'discord_bot'`), gated by a `requireDiscordBot` middleware that checks that exact identity — **not** a rank. This is the same shape the BFG cross-builder write path uses ([ADR 0026 §6C](0026-bfg-memory-hygiene-and-cross-builder-learning.md)): a stolen or rank-escalated *human* token has `system_role = NULL` and is rejected; only the bot principal's row passes.
25
25
 
26
26
  The principal is trusted for **one** thing: asserting "this Discord user, who reacted/posted, is linked builder X." It is **never** trusted to decide what X may do. Every write the bot triggers re-derives authorization from **X's live `builders.rank`** server-side, through the same guards the web/CLI paths use. The bot cannot escalate; at most it can mis-report *which linked user* acted, and that blast radius is bounded (below).
27
27
 
@@ -64,7 +64,7 @@ The bot runs **in-process** in the existing Node server as a module, behind a `D
64
64
 
65
65
  ## Alternatives considered
66
66
 
67
- - **Bot writes karma/votes directly (its own DB access).** Rejected — it makes the bot an authority and re-opens [ADR 0016](<redacted>.md). The principal + per-write rank re-check is the whole point.
67
+ - **Bot writes karma/votes directly (its own DB access).** Rejected — it makes the bot an authority and re-opens [ADR 0016](0016-trust-boundary-server-enforced-permissions.md). The principal + per-write rank re-check is the whole point.
68
68
  - **Trust Discord roles for authorization.** Rejected outright (ADR 0016 / 0032 §2): roles are cosmetic reflections, never keys.
69
69
  - **Map Discord→builder by matching usernames (no OAuth link).** Rejected — unverified and spoofable; identity must be self-asserted by the builder.
70
70
  - **A separate bot process / service.** Considered; in-process behind a kill-switch is simpler for one droplet. Revisit if the connection destabilizes the web process.
@@ -1,7 +1,7 @@
1
1
  # ADR 0034 — `thetes`: a 4th live rank for graduated newcomers, with auto-graduation after 3 ships
2
2
 
3
3
  **Date:** 2026-06-05
4
- **Context:** GDS-V3, task [#692](https://example.com/builders#/task/692). Amends [ADR 0018](<redacted>.md) (the three-rank model). Companion to [ADR 0016](<redacted>.md) (server-enforced permissions) and the newcomer-supply work (the `newcomer-generator` routine). Role-sync mirrors it to Discord per [ADR 0033](<redacted>.md).
4
+ **Context:** GDS-V3, task [#692](https://example.com/builders#/task/692). Amends [ADR 0018](0018-three-rank-model-goes-live.md) (the three-rank model). Companion to [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (server-enforced permissions) and the newcomer-supply work (the `newcomer-generator` routine). Role-sync mirrors it to Discord per [ADR 0033](0033-discord-bot-service-principal.md).
5
5
  **Status:** Accepted + shipped.
6
6
  **Track:** `internal` (dev-system / builder onboarding).
7
7
 
@@ -1,11 +1,11 @@
1
1
  # ADR 0035 — Builder onboarding: three setup paths (Local / DO Box / Remote Control)
2
2
 
3
3
  **Date:** 2026-06-06
4
- **Context:** GDS-V3, task [#715](https://example.com/builders#/task/715). Feeds done-when criterion **C1** (`a Metic onboards in ≤ 2h`). This ADR is the *onboarding-as-experience* companion to [ADR 0031](<redacted>.md), which locked the **substrate** (the containerized DO box, auto-suspend, rank-gated source access) but never consolidated how a person actually *arrives*. Builds on [ADR 0034](<redacted>.md) (the `xenos < thetes < metic < archon` ladder), [ADR 0016](<redacted>.md) (server-enforced permissions), [ADR 0022](0022-secrets-policy.md) (no secrets in repo), and the box onboarding middleware shipped in [#701](https://example.com/builders#/task/701) (§9.4 of ADR 0031).
5
- **Status:** Accepted — §2 (the first-box Archon approval gate) superseded by [ADR 0059](<redacted>.md). *Decision record — locks the onboarding shape and three new policy decisions. The box-lane machinery already exists (ADR 0031 + [#701](https://example.com/builders#/task/701)); the deltas this ADR introduces (the Metic+ local gate, the first-box approval gate, the single hosted guide surface, the primer rewrite) are implementation sub-tasks listed at the end and are NOT yet built.*
4
+ **Context:** GDS-V3, task [#715](https://example.com/builders#/task/715). Feeds done-when criterion **C1** (`a Metic onboards in ≤ 2h`). This ADR is the *onboarding-as-experience* companion to [ADR 0031](0031-cloud-dev-environments-for-builders.md), which locked the **substrate** (the containerized DO box, auto-suspend, rank-gated source access) but never consolidated how a person actually *arrives*. Builds on [ADR 0034](0034-thetes-graduated-newcomer-rank.md) (the `xenos < thetes < metic < archon` ladder), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (server-enforced permissions), [ADR 0022](0022-secrets-policy.md) (no secrets in repo), and the box onboarding middleware shipped in [#701](https://example.com/builders#/task/701) (§9.4 of ADR 0031).
5
+ **Status:** Accepted — §2 (the first-box Archon approval gate) superseded by [ADR 0059](0059-single-approval-remove-devbox-approval-gate.md). *Decision record — locks the onboarding shape and three new policy decisions. The box-lane machinery already exists (ADR 0031 + [#701](https://example.com/builders#/task/701)); the deltas this ADR introduces (the Metic+ local gate, the first-box approval gate, the single hosted guide surface, the primer rewrite) are implementation sub-tasks listed at the end and are NOT yet built.*
6
6
  **Track:** `internal` (dev-system / builder onboarding).
7
7
 
8
- > **⚠️ Superseded in part by [ADR 0059](<redacted>.md) (task [#1141](https://example.com/builders#/task/1141)).** Decision **§2 — "A newcomer's FIRST box requires Archon approval"** is **removed**: with admission now invite-gated ([ADR 0050](<redacted>.md)), member-join is the sole human gate, and an admitted builder's first box now provisions hands-off. §1 (Metic+ local clone) and §3 (the single hosted guide) stand unchanged. Read §2 below as historical.
8
+ > **⚠️ Superseded in part by [ADR 0059](0059-single-approval-remove-devbox-approval-gate.md) (task [#1141](https://example.com/builders#/task/1141)).** Decision **§2 — "A newcomer's FIRST box requires Archon approval"** is **removed**: with admission now invite-gated ([ADR 0050](0050-device-flow-admission-invite-gated-by-default.md)), member-join is the sole human gate, and an admitted builder's first box now provisions hands-off. §1 (Metic+ local clone) and §3 (the single hosted guide) stand unchanged. Read §2 below as historical.
9
9
 
10
10
  ## Problem
11
11
 
@@ -44,7 +44,7 @@ Onboarding sorts every builder into exactly one of three on-ramps. All three sha
44
44
 
45
45
  ### Path 3 — Remote Control (Chromebook / thin devices)
46
46
 
47
- > **⚠️ Superseded by [ADR 0038](<redacted>.md).** The `claude rc` headless-service mechanism described below was retired — a headless box cannot bootstrap `claude rc` (interactive-only Trusted-Devices enrollment). The box now serves its own `ttyd` browser terminal over a Cloudflare Tunnel where the builder runs normal interactive `claude`. The Path-3 *intent* (a browser-only thin-device on-ramp to the same per-builder box) stands; the `claude rc`-as-always-on-service mechanics below are historical.
47
+ > **⚠️ Superseded by [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md).** The `claude rc` headless-service mechanism described below was retired — a headless box cannot bootstrap `claude rc` (interactive-only Trusted-Devices enrollment). The box now serves its own `ttyd` browser terminal over a Cloudflare Tunnel where the builder runs normal interactive `claude`. The Path-3 *intent* (a browser-only thin-device on-ramp to the same per-builder box) stands; the `claude rc`-as-always-on-service mechanics below are historical.
48
48
 
49
49
  - **User group.** Users on a device that cannot run Claude Desktop (a literal Chromebook, an iPad, a phone).
50
50
  - **What it is.** Identical to Path 2 — the same per-builder box — but reached from a browser via Claude's Remote-Control (`claude rc` running as an always-on service on the box).
@@ -1,7 +1,7 @@
1
1
  # ADR 0036 — Builders subdomain + builder-UI reorganization (hall / watch / settings / status)
2
2
 
3
3
  **Date:** 2026-06-06
4
- **Context:** GDS-V3, task [#726](https://example.com/builders#/task/726). Builds on [ADR 0016](<redacted>.md) (server-enforced permissions), [ADR 0029](<redacted>.md) / [ADR 0030](<redacted>.md) (the status + hall surfaces being reorganized), and the asset-stamping serving model in `server.js` / `src/asset-version.js`.
4
+ **Context:** GDS-V3, task [#726](https://example.com/builders#/task/726). Builds on [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (server-enforced permissions), [ADR 0029](0029-status-page-outage-resilience.md) / [ADR 0030](0030-builders-hall-live-updates.md) (the status + hall surfaces being reorganized), and the asset-stamping serving model in `server.js` / `src/asset-version.js`.
5
5
  **Status:** Accepted. Shipped under [#726](https://example.com/builders#/task/726) (grader skipped at Lars's instruction — UI/infra reorg, no logic the grader gates).
6
6
  **Track:** `internal` (dev-system / builder UI).
7
7
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Status:** Accepted — 2026-06-06
4
4
  **Context task:** [#727](https://example.com/builders#/task/727) (GDS-V3). Absorbs idea_inbox [#200](https://example.com/builders#/idea/200) ("discord builders channel role access auto managed by the example bot").
5
- **Companions:** [ADR 0032](0032-discord-mirror-of-gds.md) (Discord = one-way window into the GDS), [ADR 0033](<redacted>.md) (the bot is a service principal, never an authority), [ADR 0016](<redacted>.md) (the trust boundary), [ADR 0026 §6C](<redacted>.md) (the <redacted> write pattern this reuses).
5
+ **Companions:** [ADR 0032](0032-discord-mirror-of-gds.md) (Discord = one-way window into the GDS), [ADR 0033](0033-discord-bot-service-principal.md) (the bot is a service principal, never an authority), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (the trust boundary), [ADR 0026 §6C](0026-bfg-memory-hygiene-and-cross-builder-learning.md) (the <redacted> write pattern this reuses).
6
6
 
7
7
  ## Context
8
8
 
@@ -1,15 +1,15 @@
1
1
  # ADR 0038 — Chromebook / browser on-ramp via a box-hosted ttyd web terminal over a Cloudflare Tunnel
2
2
 
3
3
  **Date:** 2026-06-06
4
- **Context:** GDS-V3, task [#760](https://example.com/builders#/task/760). Feeds done-when criterion **C1** (`a Metic onboards in ≤ 2h`) by restoring a *working* thin-device on-ramp. Companion to [ADR 0031](<redacted>.md) (the per-builder DigitalOcean box substrate), [ADR 0035](<redacted>.md) (the three onboarding paths), [ADR 0016](<redacted>.md) (server-enforced trust boundary — the web tier only *asks*, never holds infra power), and [ADR 0022](0022-secrets-policy.md) (no secrets in repo).
5
- **Status:** Accepted. **Supersedes the Remote-Control (path 3) approach** in [ADR 0035](<redacted>.md) Path 3 and [ADR 0031](<redacted>.md) §1 / §9.4 (the `claude rc` thin-device on-ramp). Implemented this session under [#760](https://example.com/builders#/task/760).
4
+ **Context:** GDS-V3, task [#760](https://example.com/builders#/task/760). Feeds done-when criterion **C1** (`a Metic onboards in ≤ 2h`) by restoring a *working* thin-device on-ramp. Companion to [ADR 0031](0031-cloud-dev-environments-for-builders.md) (the per-builder DigitalOcean box substrate), [ADR 0035](0035-builder-onboarding-three-paths.md) (the three onboarding paths), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (server-enforced trust boundary — the web tier only *asks*, never holds infra power), and [ADR 0022](0022-secrets-policy.md) (no secrets in repo).
5
+ **Status:** Accepted. **Supersedes the Remote-Control (path 3) approach** in [ADR 0035](0035-builder-onboarding-three-paths.md) Path 3 and [ADR 0031](0031-cloud-dev-environments-for-builders.md) §1 / §9.4 (the `claude rc` thin-device on-ramp). Implemented this session under [#760](https://example.com/builders#/task/760).
6
6
 
7
- > **Update (2026-06-07, [ADR 0040](<redacted>.md)):** the "Remote Control is unfixable" conclusion below was specific to running RC *headless, as a background service*. Once this ADR's ttyd web terminal put a real human at a real PTY, Remote Control works — started in-session with `/remote-control` (not the standalone `claude rc`). RC is now the **default** browser-only experience (shipped in [#807](https://example.com/builders#/task/807)); the ttyd terminal is its one-time launchpad. The blockers in *Problem* still hold for *headless* RC. See ADR 0040.
7
+ > **Update (2026-06-07, [ADR 0040](0040-remote-control-default-browser-onramp.md)):** the "Remote Control is unfixable" conclusion below was specific to running RC *headless, as a background service*. Once this ADR's ttyd web terminal put a real human at a real PTY, Remote Control works — started in-session with `/remote-control` (not the standalone `claude rc`). RC is now the **default** browser-only experience (shipped in [#807](https://example.com/builders#/task/807)); the ttyd terminal is its one-time launchpad. The blockers in *Problem* still hold for *headless* RC. See ADR 0040.
8
8
  **Track:** `internal` (dev-system / builder onboarding).
9
9
 
10
10
  ## Problem
11
11
 
12
- A per-builder cloud dev box ([ADR 0031](<redacted>.md)) is reached two ways: Mac/Windows builders via Claude Desktop + SSH (works), and Chromebook / browser-only builders via — originally — Claude's **Remote Control** (`claude rc`) running as a headless systemd service (`infra/claude-rc.service`), with the box publishing a claude.ai pairing link UP to the GDS so the builder reaches it from a browser ([ADR 0031](<redacted>.md) §9.4, [#701](https://example.com/builders#/task/701)).
12
+ A per-builder cloud dev box ([ADR 0031](0031-cloud-dev-environments-for-builders.md)) is reached two ways: Mac/Windows builders via Claude Desktop + SSH (works), and Chromebook / browser-only builders via — originally — Claude's **Remote Control** (`claude rc`) running as a headless systemd service (`infra/claude-rc.service`), with the box publishing a claude.ai pairing link UP to the GDS so the builder reaches it from a browser ([ADR 0031](0031-cloud-dev-environments-for-builders.md) §9.4, [#701](https://example.com/builders#/task/701)).
13
13
 
14
14
  Task [#745](https://example.com/builders#/task/745) leg-5 verification-tested that path on hardware and found it **broken end to end**. This session's research (June 2026, Claude Code CLI v2.1.x) confirmed it is **not** fixable by plumbing — there are three hard blockers, all on Anthropic's side and by design:
15
15
 
@@ -47,7 +47,7 @@ The box reports its current terminal URL + credential UP to the GDS (`POST /api/
47
47
  - **Localhost binding.** ttyd binds to `127.0.0.1` — only the tunnel reaches it.
48
48
  - **Basic auth.** HTTP basic auth with a per-box random password, stored mode-600 at `/etc/otb/terminal-credential` and persisted in the box snapshot across park/wake.
49
49
  - **Secret containment.** The credential is returned ONLY to the box's own builder via `GET /box/terminal`; it never appears on any public surface or in `box_events`.
50
- - **Revocation.** Rides the existing rank/status gate + box reconcile: a demoted/deactivated builder loses source access and the box is deprovisioned ([ADR 0031](<redacted>.md) §9.2).
50
+ - **Revocation.** Rides the existing rank/status gate + box reconcile: a demoted/deactivated builder loses source access and the box is deprovisioned ([ADR 0031](0031-cloud-dev-environments-for-builders.md) §9.2).
51
51
  - **Defense in depth.** An unguessable tunnel URL **and** basic auth, both over HTTPS.
52
52
 
53
53
  ## Consequences
@@ -1,7 +1,7 @@
1
1
  # ADR 0039 — Setup-first onboarding UX: two-config selector + action-only Path checklist
2
2
 
3
3
  **Date:** 2026-06-06
4
- **Context:** GDS-V3, task [#777](https://example.com/builders#/task/777). Feeds done-when criterion **C1** (`a newcomer onboards in ≤ 2h`). Builds on [ADR 0035](<redacted>.md) (three onboarding paths), [ADR 0038](<redacted>.md) (the box-hosted ttyd browser terminal, now hardware-verified under [#771](https://example.com/builders#/task/771)), [ADR 0033](<redacted>.md) (the Discord OAuth account-link + auto-join), and [ADR 0034](<redacted>.md)/[#692](https://example.com/builders#/task/692) (the 3-ship xenos→thetes promotion).
4
+ **Context:** GDS-V3, task [#777](https://example.com/builders#/task/777). Feeds done-when criterion **C1** (`a newcomer onboards in ≤ 2h`). Builds on [ADR 0035](0035-builder-onboarding-three-paths.md) (three onboarding paths), [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md) (the box-hosted ttyd browser terminal, now hardware-verified under [#771](https://example.com/builders#/task/771)), [ADR 0033](0033-discord-bot-service-principal.md) (the Discord OAuth account-link + auto-join), and [ADR 0034](0034-thetes-graduated-newcomer-rank.md)/[#692](https://example.com/builders#/task/692) (the 3-ship xenos→thetes promotion).
5
5
  **Status:** Accepted. Implemented this session under [#777](https://example.com/builders#/task/777).
6
6
  **Track:** `internal` (dev-system / builder onboarding).
7
7
 
@@ -9,7 +9,7 @@
9
9
 
10
10
  The builders'-hall onboarding (the "Welcome to the Hall" panel + the "Path into the City" checklist) had two faults for a **zero-technical** newcomer who **won't read paragraphs**:
11
11
 
12
- 1. **Setup and milestones were tangled.** The welcome panel mixed *how to get a working environment* (install Claude Code, clone the repo, run `/builder-setup`) with *what to do next*, in dense prose. It also still told newcomers to clone a repo locally — but post-[ADR 0035](<redacted>.md) a Xenos is **box-only** and never clones anything to their own machine.
12
+ 1. **Setup and milestones were tangled.** The welcome panel mixed *how to get a working environment* (install Claude Code, clone the repo, run `/builder-setup`) with *what to do next*, in dense prose. It also still told newcomers to clone a repo locally — but post-[ADR 0035](0035-builder-onboarding-three-paths.md) a Xenos is **box-only** and never clones anything to their own machine.
13
13
  2. **The first checklist step was redundant.** "Bear the city's seal" (GitHub sign-in) is already done — a builder signed in with GitHub to even see the page.
14
14
 
15
15
  ## Decision
@@ -18,20 +18,20 @@ The builders'-hall onboarding (the "Welcome to the Hall" panel + the "Path into
18
18
 
19
19
  ### 1. Setup screen — pick how you connect to your dev box
20
20
 
21
- Both configs reach the SAME hosted dev box (Xenos are box-only, [ADR 0035](<redacted>.md)); the choice is only the *client*:
21
+ Both configs reach the SAME hosted dev box (Xenos are box-only, [ADR 0035](0035-builder-onboarding-three-paths.md)); the choice is only the *client*:
22
22
 
23
23
  - **Claude Desktop app (recommended)** — install the desktop app, open it on an empty folder, then paste a single instruction telling Claude to **read the hosted connect guide** (`GET /api/gds/box/connect`) and follow it. That guide (already served, public, no secrets) runs the OS-appropriate `box-connect` bootstrap (device-flow GitHub sign-in + SSH key + Desktop connection file). Then connect via *Code → Environment → "Example Dev Box"*.
24
- - **Claude Online (browser only)** — no install; the hall **delivers the box terminal automatically**: one "Set up my dev box" button calls `POST /box/ensure` (auto-provision/wake; [#701](https://example.com/builders#/task/701)) and polls `GET /box/terminal`, then shows the ttyd URL + password ([ADR 0038](<redacted>.md)) right in the panel. Open it and type `claude`. No SSH, no `#support` relay.
24
+ - **Claude Online (browser only)** — no install; the hall **delivers the box terminal automatically**: one "Set up my dev box" button calls `POST /box/ensure` (auto-provision/wake; [#701](https://example.com/builders#/task/701)) and polls `GET /box/terminal`, then shows the ttyd URL + password ([ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md)) right in the panel. Open it and type `claude`. No SSH, no `#support` relay.
25
25
 
26
26
  **Why the hosted guide (not "type a `/builder-*` command"):** a brand-new builder has no repo and therefore none of the project's `/builder-*` skills locally. Pointing Claude at the public guide URL is self-contained — Claude fetches it and runs the bootstrap with nothing pre-installed. The bootstrap self-authenticates via device flow, so it does **not** require `/builder-setup` first.
27
27
 
28
- Steps are short, scannable, and plain-spoken (the Mediterranean theme stays in the headings). The repo-clone walkthrough — and the `/public/repo-info` fetch that fed it — is removed from the newcomer panel. Getting the box itself is requested in Discord `#support` (an Archon provisions it — the [ADR 0035](<redacted>.md) §2 first-box cost gate).
28
+ Steps are short, scannable, and plain-spoken (the Mediterranean theme stays in the headings). The repo-clone walkthrough — and the `/public/repo-info` fetch that fed it — is removed from the newcomer panel. Getting the box itself is requested in Discord `#support` (an Archon provisions it — the [ADR 0035](0035-builder-onboarding-three-paths.md) §2 first-box cost gate).
29
29
 
30
30
  ### 2. "The Path into the City" — orientation, action-only, all auto-detected
31
31
 
32
32
  Four displayed steps: **Join the Discord server** → **Choose thy craft** → **Run `/builder-setup`** → **Ship three works — and rise to Thetes**. The redundant GitHub-sign-in step is dropped from display, as are `first_start`/`first_claim` (implied by shipping). **Every step auto-detects — no manual ticking** ("the city watches"):
33
33
 
34
- - **join_discord** clears when the builder links Discord. The button runs the **existing** OAuth flow (`GET /api/gds/auth/discord/start`, [ADR 0033](<redacted>.md)) — same control as `/builders/settings` — which auto-joins the guild + assigns the rank role; `discord.linked` then reads true. No new Discord backend.
34
+ - **join_discord** clears when the builder links Discord. The button runs the **existing** OAuth flow (`GET /api/gds/auth/discord/start`, [ADR 0033](0033-discord-bot-service-principal.md)) — same control as `/builders/settings` — which auto-joins the guild + assigns the rank role; `discord.linked` then reads true. No new Discord backend.
35
35
  - **cli_setup** clears once the builder has authenticated the GDS CLI — i.e. run `/builder-setup` (or the box-connect bootstrap); both mint a `source='cli'` session. Detected via `db.hasCliSession` (an `EXISTS` over `builder_sessions`); no manual mark.
36
36
  - **pick_disciplines** / **ship_three** are the existing engine-backed steps (craft picker; 3-ship counter).
37
37
 
@@ -1,9 +1,9 @@
1
1
  # ADR 0040 — Remote Control is the default browser-only on-ramp (reversing 0038's "RC is dead" verdict)
2
2
 
3
- - **Status:** Accepted. **Reverses the "Remote Control is unfixable" conclusion of [ADR 0038](<redacted>.md)** (tasks [#745](https://example.com/builders#/task/745) / [#760](https://example.com/builders#/task/760)). Implemented in the onboarding/Settings work under [#807](https://example.com/builders#/task/807); recorded here under [#838](https://example.com/builders#/task/838); remaining legs (cloud-init trust pre-seed + the connect-guide / recipe-Part-2 rewrites that lead browser-only builders into the Claude app via `/remote-control`) landed under [#824](https://example.com/builders#/task/824).
3
+ - **Status:** Accepted. **Reverses the "Remote Control is unfixable" conclusion of [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md)** (tasks [#745](https://example.com/builders#/task/745) / [#760](https://example.com/builders#/task/760)). Implemented in the onboarding/Settings work under [#807](https://example.com/builders#/task/807); recorded here under [#838](https://example.com/builders#/task/838); remaining legs (cloud-init trust pre-seed + the connect-guide / recipe-Part-2 rewrites that lead browser-only builders into the Claude app via `/remote-control`) landed under [#824](https://example.com/builders#/task/824).
4
4
  - **Date:** 2026-06-07 (trust pre-seed leg: 2026-06-29, [#824](https://example.com/builders#/task/824))
5
5
  - **Track:** `internal` (dev-system / builder onboarding)
6
- - **Builds on:** [ADR 0038](<redacted>.md) (ttyd web terminal + Cloudflare Tunnel), [ADR 0031](<redacted>.md), [ADR 0035](<redacted>.md), [ADR 0039](<redacted>.md), [ADR 0016](<redacted>.md)
6
+ - **Builds on:** [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md) (ttyd web terminal + Cloudflare Tunnel), [ADR 0031](0031-cloud-dev-environments-for-builders.md), [ADR 0035](0035-builder-onboarding-three-paths.md), [ADR 0039](0039-setup-first-onboarding-ux.md), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md)
7
7
 
8
8
  ## Context
9
9
 
@@ -36,7 +36,7 @@ The ttyd terminal (ADR 0038) is retained but its role narrows to a **one-time la
36
36
  ### What we explicitly do NOT do
37
37
 
38
38
  - **No headless RC, no `claude-rc.service`.** ADR 0038 was right that RC can't run as a backgrounded service. RC is always started by a human in the ttyd terminal. The `claude-rc.service` / `box-report-pairing.sh` units deleted in [#760](https://example.com/builders#/task/760) stay deleted. (A stale comment in `infra/builder-box-cloud-init.yaml` still referenced the deleted unit; cleaned up under [#838](https://example.com/builders#/task/838).)
39
- - **No token funneled to the box for RC.** RC authenticates through the builder's own interactive browser `/login` in the ttyd terminal — the same full-scope OAuth ADR 0038 relies on. The trust boundary ([ADR 0016](<redacted>.md)) is unchanged: no Anthropic credential is baked onto the box.
39
+ - **No token funneled to the box for RC.** RC authenticates through the builder's own interactive browser `/login` in the ttyd terminal — the same full-scope OAuth ADR 0038 relies on. The trust boundary ([ADR 0016](0016-trust-boundary-server-enforced-permissions.md)) is unchanged: no Anthropic credential is baked onto the box.
40
40
  - **Workspace trust IS now pre-seeded — but as a NON-load-bearing convenience ([#824](https://example.com/builders#/task/824), updating the original deferral).** The cloud-init writes `/root/.claude.json` with `<redacted>` for `/root` + `/workspace` so the first `claude` launch usually skips the trust dialog before the builder reaches `/remote-control`. It is **deliberately best-effort**: the seed runs only when `/root/.claude.json` is absent (it never clobbers a config `claude` later writes), and upstream pre-seeding is known to be flaky ([#9113](https://github.com/anthropics/claude-code/issues/9113)). So nothing depends on it working — if it doesn't take, the builder accepts trust once during sign-in exactly as before. This is a one-keypress smoother, NOT a security control: trust is a UI convenience, and the real trust boundary is unchanged (no Anthropic credential is baked; auth is the builder's own interactive `/login`). The deferred question of whether RC can be spun up without the separate-window terminal dance at all remains open (idea_inbox).
41
41
 
42
42
  ## Consequences
@@ -3,7 +3,7 @@
3
3
  - **Status:** Accepted. Implemented in [#853](https://example.com/builders#/task/853).
4
4
  - **Date:** 2026-06-07
5
5
  - **Track:** `internal` (dev-system / shipping pipeline)
6
- - **Builds on:** [ADR 0016](<redacted>.md) (server-enforced permissions / trust boundary), [ADR 0024](<redacted>.md) (the grader)
6
+ - **Builds on:** [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (server-enforced permissions / trust boundary), [ADR 0024](0024-multi-agent-system-architecture.md) (the grader)
7
7
 
8
8
  ## Context
9
9
 
@@ -23,7 +23,7 @@ Add a **server-side, default-OFF environment kill-switch**: `GRADER_BYPASS_ENABL
23
23
 
24
24
  The flag is read **live on each request** — there is no caching. Flipping the env and redeploying is the entire on/off control; turning it off immediately re-arms the Archon-only gate and the normal grader flow.
25
25
 
26
- ### Why this honors the trust boundary ([ADR 0016](<redacted>.md))
26
+ ### Why this honors the trust boundary ([ADR 0016](0016-trust-boundary-server-enforced-permissions.md))
27
27
 
28
28
  The relaxation is **server-side and default-OFF**. A builder editing local files (CLAUDE.md, ship.js, skills) cannot turn it on — only an operator with droplet env + deploy access can. When the env is unset, the system behaves exactly as before. The bypass is a deliberate, operator-controlled, logged, *temporary* widening — not a standing grant.
29
29
 
@@ -1,7 +1,7 @@
1
1
  # ADR 0042 — Builder self-deploy: CI auto-deploy on main + PR auto-merge
2
2
 
3
3
  **Date:** 2026-06-07
4
- **Context:** GDS-V3, task [#679](https://example.com/builders#/task/679) (cut prod deploy over to CI). Completes the [#597](https://example.com/builders#/task/597) / [ADR 0031](<redacted>.md) §6 goal — *no builder box holds the production droplet SSH key*. Extends [ADR 0031](<redacted>.md) §6; re-applies [ADR 0016](<redacted>.md) to CI.
4
+ **Context:** GDS-V3, task [#679](https://example.com/builders#/task/679) (cut prod deploy over to CI). Completes the [#597](https://example.com/builders#/task/597) / [ADR 0031](0031-cloud-dev-environments-for-builders.md) §6 goal — *no builder box holds the production droplet SSH key*. Extends [ADR 0031](0031-cloud-dev-environments-for-builders.md) §6; re-applies [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) to CI.
5
5
  **Status:** Accepted — **armed in production 2026-06-13** (interim, grader-off variant — task [#859](https://example.com/builders#/task/859); `config/deploy.json` `mode: ci`; see the *Arming record* below + session log [`<redacted>.md`](../session-logs/<redacted>.md)).
6
6
 
7
7
  ## Problem
@@ -31,7 +31,7 @@ The cutover is **atomic** — flipping `config/deploy.json` to `ci` must happen
31
31
 
32
32
  ### The auto-merge gate must be tamper-proof — the security crux
33
33
 
34
- With no human in the merge loop, **the CI checks *are* the authority**. The threat (per [ADR 0016](<redacted>.md)) is a trusted-but-bounded builder weakening the gate from inside their own PR. Two defenses:
34
+ With no human in the merge loop, **the CI checks *are* the authority**. The threat (per [ADR 0016](0016-trust-boundary-server-enforced-permissions.md)) is a trusted-but-bounded builder weakening the gate from inside their own PR. Two defenses:
35
35
 
36
36
  1. **[`CODEOWNERS`](../../CODEOWNERS)** — a PR touching any gate surface (`.github/`, `config/deploy.json`, `ship.js`, the grader, `auth.js`/`route-rank-check.js`) **or any code that executes on the droplet at deploy** (`migrations/`, `scripts/migrate.sh`, `package.json`/`package-lock.json`, `scripts/deploy/` — `~/deploy.sh` runs migrations + `npm ci` from the merged tree, so a malicious migration or poisoned lockfile would otherwise auto-merge and run on prod) requires Archon review *even under auto-merge*, when branch protection has "Require review from Code Owners" on. Ordinary PRs (game, art, docs) carry no code owner and auto-merge freely — that's the point.
37
37
 
@@ -54,7 +54,7 @@ Until (1)–(5), the switch stays `laptop` and the operator lands work as today
54
54
  ## Consequences
55
55
 
56
56
  - **Builder `#25` and every future builder** can ship end to end from any machine (Windows, Chromebook, dev box) with no `main` checkout and no droplet key.
57
- - **The merge to `main` becomes the control checkpoint** — what reaches `main` goes live within ~1 min. Governance moves from "who holds the key" to "what the checks require + who reviews the gate" — squarely inside the [ADR 0016](<redacted>.md) model.
57
+ - **The merge to `main` becomes the control checkpoint** — what reaches `main` goes live within ~1 min. Governance moves from "who holds the key" to "what the checks require + who reviews the gate" — squarely inside the [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) model.
58
58
  - **New dependency:** `ci` mode uses the GitHub CLI (`gh`) on the builder's machine to open the PR + enable auto-merge. A follow-up either adds a `doctor.js` check for `gh` or moves PR creation server-side (the server already holds a GitHub principal) to drop the per-builder dependency.
59
59
  - **Deploy confirmation is workflow-run-based**, not commit-pinned at the edge (`/healthz` returns only `ok`). A follow-up can expose the running commit for a stricter edge assertion.
60
60
 
@@ -69,13 +69,13 @@ Until (1)–(5), the switch stays `laptop` and the operator lands work as today
69
69
 
70
70
  `ci` mode was **armed in production** on 2026-06-13 under task 859 — but as a deliberate
71
71
  **interim variant** that defers precondition 1 (the CI grade-gate), because the
72
- subagent grader was already globally bypassed (`GRADER_BYPASS_ENABLED=1`, [ADR 0041](<redacted>.md))
72
+ subagent grader was already globally bypassed (`GRADER_BYPASS_ENABLED=1`, [ADR 0041](0041-temporary-grader-bypass-killswitch.md))
73
73
  during the provider outage. With the grader off everywhere, gating auto-merge on a
74
74
  *grade-gate* would be theater; instead the merge gate is:
75
75
 
76
76
  - **Required PR checks:** `unit` (the DB-free unit suite, task 856) + `trufflehog` (full-history secret scan). Both were red on `main` for unrelated reasons and were greened first: `anti_grid` (needs numpy, Node-only runner) moved to the unit runner's `KNOWN_FAILING` set; `tests/bfg.mjs` (deliberate fake-DSN fixtures) added to the secret-scan allowlist.
77
77
  - **Code-Owner review** on every gate surface (this repo's `CODEOWNERS`), now extended to the gate "brains" (`scripts/gds/run-unit-tests.js`, `.husky/`) so a PR cannot mute a test or allowlist a real secret unreviewed.
78
- - **Deploy-time `main-audit`** on the droplet (`~/deploy.sh` → `infra/deploy-main-audit-gate.sh`, [ADR 0043](<redacted>.md)) — reverts/blocks sub-Metic edits to permission-sensitive paths regardless of how they merged.
78
+ - **Deploy-time `main-audit`** on the droplet (`~/deploy.sh` → `infra/deploy-main-audit-gate.sh`, [ADR 0043](0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md)) — reverts/blocks sub-Metic edits to permission-sensitive paths regardless of how they merged.
79
79
 
80
80
  What was set: `PROD_SSH_KEY` (a dedicated ed25519 deploy key, **forced-command `~/deploy.sh`** in the droplet's `authorized_keys`) + `DROPLET_KNOWN_HOSTS` secrets; repo var `PROD_DEPLOY_VIA_CI=true`; branch protection on `main` (require PR, required checks `unit`+`trufflehog`, require Code-Owner review, 0 ordinary approvals, block direct push for non-admins); repo auto-merge enabled; `config/deploy.json` → `ci`. `deploy-prod.yml` verified end-to-end (Actions → SSH → `~/deploy.sh` → public healthz) before the flip.
81
81
 
@@ -1,7 +1,7 @@
1
1
  # ADR 0043 — Git/SSH trust-boundary gap + a rank floor on permission-sensitive paths
2
2
 
3
3
  **Date:** 2026-06-08
4
- **Context:** SEC [#863](https://example.com/builders#/task/863) — the "Builder 25" incident. Extends [ADR 0016](<redacted>.md) (the HTTP trust boundary).
4
+ **Context:** SEC [#863](https://example.com/builders#/task/863) — the "Builder 25" incident. Extends [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (the HTTP trust boundary).
5
5
  **Status:** Accepted. Implemented in part (Option A's protections); the full server-side merge+deploy and GitHub-native block are staged behind operator actions (blockers [#15](https://example.com/builders#/blocker/15)–[#17](https://example.com/builders#/task/17)).
6
6
 
7
7
  ## The incident
@@ -17,7 +17,7 @@ The SSH deploy failed (their box had no droplet key), but it didn't matter: the
17
17
 
18
18
  ## The gap
19
19
 
20
- [ADR 0016](<redacted>.md) put authority in `builders.rank` and enforced it **server-side per request** — but **only for `/api/gds/*` HTTP routes**. It explicitly does not cover two surfaces:
20
+ [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) put authority in `builders.rank` and enforced it **server-side per request** — but **only for `/api/gds/*` HTTP routes**. It explicitly does not cover two surfaces:
21
21
 
22
22
  1. **GitHub `main` is writable by every collaborator.** The repo is a **free-plan private repo**, so GitHub branch protection is *not available* ("Upgrade to GitHub Pro…"). All collaborators (`example-owner`, `LarsCode`, `willExample`, `IAMMASTERQUA`) have full push to `main`. The grader / confirm / rank gates live inside `ship.js` and the server — a raw `git push origin main` touches neither.
23
23
  2. **The legit pipeline itself distributes the dangerous credentials.** `ship.js` does the merge-to-`main` and `ssh …deploy.sh` **client-side, from the builder's machine** — so the design hands every shipping builder the exact credentials needed to bypass it.
@@ -8,7 +8,7 @@
8
8
  ## Context
9
9
 
10
10
  The art pipeline's locked palette is 64 colors extracted from the Pokémon FireRed
11
- reference corpus (`art/template/palette.json`), per [ADR 0008](./<redacted>.md)
11
+ reference corpus (`art/template/palette.json`), per [ADR 0008](./0008-family-based-tile-generation.md)
12
12
  and the hard constraint in `art/template/style_guide.md` ([#3](https://example.com/builders#/task/3) "Locked palette"). Every
13
13
  output pixel must quantize to one of those 64 colors. Per CLAUDE.md §7.1, **any palette
14
14
  change is an ADR-level decision** because it ripples through every existing tile and the
@@ -1,7 +1,7 @@
1
1
  # ADR 0044 — Per-box live game preview (the builder sandbox)
2
2
 
3
3
  **Date:** 2026-06-10
4
- **Context:** GDS-V3, task [#897](https://example.com/builders#/task/897) (this ADR + the tunnel mechanism), wired into provisioning under [#898](https://example.com/builders#/task/898), hardware-verified under [#899](https://example.com/builders#/task/899). Companion to [ADR 0031](<redacted>.md) (per-builder DigitalOcean box substrate), [ADR 0038](<redacted>.md) (the box's ttyd terminal over a Cloudflare Tunnel — the mechanism this extends), and [ADR 0016](<redacted>.md) (the web tier only *asks*; the control plane holds infra power).
4
+ **Context:** GDS-V3, task [#897](https://example.com/builders#/task/897) (this ADR + the tunnel mechanism), wired into provisioning under [#898](https://example.com/builders#/task/898), hardware-verified under [#899](https://example.com/builders#/task/899). Companion to [ADR 0031](0031-cloud-dev-environments-for-builders.md) (per-builder DigitalOcean box substrate), [ADR 0038](0038-chromebook-ttyd-cloudflare-tunnel.md) (the box's ttyd terminal over a Cloudflare Tunnel — the mechanism this extends), and [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (the web tier only *asks*; the control plane holds infra power).
5
5
  **Status:** Accepted. Mechanism implemented under [#897](https://example.com/builders#/task/897).
6
6
  **Track:** `internal` (dev-system / builder experience).
7
7
 
@@ -1,7 +1,7 @@
1
1
  # ADR 0046 — Sandbox-first review in the dev-box ship flow
2
2
 
3
3
  **Date:** 2026-06-11
4
- **Context:** GDS-V3, task [#927](https://example.com/builders#/task/927). Builds directly on [ADR 0044](<redacted>.md) (the per-box live game preview / "sandbox") and the three-state ship lifecycle in `scripts/gds/ship.js` (Phase 5). Companion to [ADR 0031](<redacted>.md) (dev boxes) and [ADR 0016](<redacted>.md) (the gate is a workflow aid, not an authority surface).
4
+ **Context:** GDS-V3, task [#927](https://example.com/builders#/task/927). Builds directly on [ADR 0044](0044-per-box-live-game-preview.md) (the per-box live game preview / "sandbox") and the three-state ship lifecycle in `scripts/gds/ship.js` (Phase 5). Companion to [ADR 0031](0031-cloud-dev-environments-for-builders.md) (dev boxes) and [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (the gate is a workflow aid, not an authority surface).
5
5
  **Status:** Accepted.
6
6
  **Track:** `internal` (dev-system / builder experience).
7
7