@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
@@ -97,7 +97,7 @@ the matrix (ready side), and is pinned by a test rather than left to erode quiet
97
97
 
98
98
  ### 3. The schema: one advisory hint column, one widened CHECK (task 1003060 / R02)
99
99
 
100
- `migrations/<redacted>.sql` adds `idea_inbox.suggested_goal_id` (nullable FK
100
+ `migrations/core_222_idea_inbox_suggested_goal.sql` adds `idea_inbox.suggested_goal_id` (nullable FK
101
101
  `ON DELETE SET NULL`) — **not** where a routed idea's goal lives (that is `tasks.goal_id`, set by
102
102
  construction), but the leftover hint for rows that did **not** convert: soft-landed/homeless ideas, a
103
103
  Discord classifier's guess, Full Ideas and criterion-proposals. The migration's own comment is explicit
@@ -105,7 +105,7 @@ that the column is "load-bearing for NOTHING — no rank check, no scope wall, a
105
105
  it." It lives in **core** migrations, not a module migration, because `idea_inbox` is a core table and
106
106
  `fitness.js`'s `checkModuleMigrationsAdditive` forbids a module `ALTER TABLE` against it.
107
107
 
108
- `modules/ideas/migrations/<redacted>.sql` widens `ideas_task_lineage`'s CHECK to
108
+ `modules/ideas/migrations/ideas_003_lineage_origin_route.sql` widens `ideas_task_lineage`'s CHECK to
109
109
  admit a third `origin`: `'route'`, alongside the pre-existing `'promote'` (a human triaged it) and
110
110
  `'develop'` (a spark became a Full Idea). The distinction is deliberate — "how much triage routing
111
111
  actually saved" (criterion C6) is only answerable if capture-time conversions are tagged differently
@@ -7,9 +7,9 @@
7
7
  case), [#1003157](https://cloudbongos.com/builders#/task/1003157) (extended the same exemption to the
8
8
  criterion-link advisory and the goal detail view)
9
9
  - **Goal:** [#1000071](https://cloudbongos.com/builders#/goal/1000071) — Idea routing
10
- - **Related:** [ADR 0086](<redacted>.md) (the real work hierarchy this decision keeps
11
- intact), [ADR 0183](<redacted>.md) (why a container that never finishes is dangerous
12
- now), [ADR 0192 "a category orients and authorises nothing"](<redacted>.md)
10
+ - **Related:** [ADR 0086](0086-goal-scoped-work-hierarchy.md) (the real work hierarchy this decision keeps
11
+ intact), [ADR 0183](0183-criteria-close-themselves.md) (why a container that never finishes is dangerous
12
+ now), [ADR 0192 "a category orients and authorises nothing"](0192-a-category-orients-and-authorises-nothing.md)
13
13
  (the precedent this decision is *not* — see §2)
14
14
 
15
15
  ## 1. The problem
@@ -25,13 +25,13 @@ delivering toward one of a goal's stated outcomes; it is restoring one. Idea
25
25
  should already work," living *under* an existing goal, without a new goal being
26
26
  born for it.
27
27
 
28
- ## 2. Why this is not a stored category, and not [ADR 0192](<redacted>.md)
28
+ ## 2. Why this is not a stored category, and not [ADR 0192](0192-a-category-orients-and-authorises-nothing.md)
29
29
 
30
30
  The obvious-looking answer — add a `category` (or `bucket`) column to `tasks` —
31
31
  is the wrong shape for two reasons specific to *this* system's schema, not taste:
32
32
 
33
33
  1. **`tasks` stores no category at all, by decision.** [ADR 0192 "a category
34
- orients and authorises nothing"](<redacted>.md)
34
+ orients and authorises nothing"](0192-a-category-orients-and-authorises-nothing.md)
35
35
  already answered a structurally identical question for *goals* — a human label
36
36
  from an owner-named set, advisory only, gating nothing — and its own text is
37
37
  explicit that "a task stores no category… it inherits its goal's through
@@ -40,7 +40,7 @@ is the wrong shape for two reasons specific to *this* system's schema, not taste
40
40
  already exists, is already required (`migrations/006_pms_v2.sql`,
41
41
  `NOT NULL DEFAULT 'unclassified'`), and already means "this is a fix." Adding
42
42
  a column to restate it is duplication, not a new fact.
43
- 2. **This decision is a *narrower*, more binding one than [ADR 0192](<redacted>.md)'s.**
43
+ 2. **This decision is a *narrower*, more binding one than [ADR 0192](0192-a-category-orients-and-authorises-nothing.md)'s.**
44
44
  Its category is purely a label a human reads — nothing may branch on it.
45
45
  "A bug fix needs no criterion link" and "a bug fix in the catch-all is quiet"
46
46
  are the OPPOSITE: two decision surfaces (`goal-advisory.js`) DO branch on
@@ -57,12 +57,12 @@ is the wrong shape for two reasons specific to *this* system's schema, not taste
57
57
  ## 3. Why not a global "Bugs" goal either
58
58
 
59
59
  Idea 1000828's own reasoning is the load-bearing part, and it survives unchanged
60
- here: a goal carries `scope_modules`, the [ADR 0086](<redacted>.md)
60
+ here: a goal carries `scope_modules`, the [ADR 0086](0086-goal-scoped-work-hierarchy.md)
61
61
  §3 scope wall — a bugs goal spanning every module makes that wall either
62
62
  everything or nothing, which is not a wall. And a goal carries done-when criteria
63
63
  and can be marked `achieved`; a bug container never finishes, so making it a goal
64
64
  manufactures a goal that can never legitimately reach `achieved` — polluting the
65
- exact signal [ADR 0183](<redacted>.md)'s auto-satisfy now
65
+ exact signal [ADR 0183](0183-criteria-close-themselves.md)'s auto-satisfy now
66
66
  depends on to cascade a goal to `achieved` the moment every linked task ships. A
67
67
  category *under* an existing goal keeps that goal's wall, keeps the "things that
68
68
  should work in THIS area" context, and never claims to be finishable on its own.
@@ -72,7 +72,7 @@ should work in THIS area" context, and never claims to be finishable on its own.
72
72
  **A fix category is `kind='bug'` on a task that carries a real `goal_id` — no
73
73
  schema change, no new column, no new goal type.** The goal is *finishable* as
74
74
  before; the fix category is a lens over its existing `kind` field, exactly the
75
- way [ADR 0192](<redacted>.md)'s goal category
75
+ way [ADR 0192](0192-a-category-orients-and-authorises-nothing.md)'s goal category
76
76
  is a lens over `goals.category_id`, just enforced more strictly because two real
77
77
  gates read it.
78
78
 
@@ -100,7 +100,7 @@ shipped on `main` before this ADR was written):
100
100
  (`goals-page.js`, `f-goal-kind`) — so "the hall groups bugs by kind" was
101
101
  already true before this task, via the *same* general-purpose kind facility
102
102
  every other kind uses. Building a bug-specific grouping widget beside it would
103
- be the second-hierarchy mistake [ADR 0192](<redacted>.md)
103
+ be the second-hierarchy mistake [ADR 0192](0192-a-category-orients-and-authorises-nothing.md)
104
104
  §2 already named once for goal categories.
105
105
 
106
106
  ## 5. What was deliberately not built
@@ -127,5 +127,5 @@ shipped on `main` before this ADR was written):
127
127
  - If a future need ever wants `kind='bug'` to carry MORE weight than an advisory
128
128
  exemption — a claim-time gate, a reward multiplier, a dependency rule — that is
129
129
  a new, explicit decision needing its own ADR, the same posture
130
- [ADR 0192](<redacted>.md) §5 holds for goal
130
+ [ADR 0192](0192-a-category-orients-and-authorises-nothing.md) §5 holds for goal
131
131
  categories. This ADR does not pre-authorise that.
@@ -6,9 +6,9 @@
6
6
  idea 1000815), [#1002997](https://cloudbongos.com/builders#/task/1002997) (created the lineage table),
7
7
  [#1003065](https://cloudbongos.com/builders#/task/1003065) (the R01 diff whose grader flagged the shape)
8
8
  - **Goal:** [#1000071](https://cloudbongos.com/builders#/goal/1000071) — Idea routing
9
- - **Related:** [ADR 0172](<redacted>.md) (the ideator credit lane this
10
- table is the rail for), [ADR 0185](<redacted>.md) (the other place an idea has more
11
- than one claimant), [ADR 0234](<redacted>.md)
9
+ - **Related:** [ADR 0172](0172-per-craft-compensation-ideator-credit-lane.md) (the ideator credit lane this
10
+ table is the rail for), [ADR 0185](0185-spark-handoff-credit-split.md) (the other place an idea has more
11
+ than one claimant), [ADR 0234](0234-idea-routing-capture-time-promotion-landing-matrix-homeless-inbox.md)
12
12
  (routing, the third `origin`)
13
13
 
14
14
  ## 1. The problem
@@ -29,7 +29,7 @@ ideas 1000811 and 1000812 were both promoted into task 1003150 (two call sites o
29
29
  one mechanism), and idea 1000811's link is gone — only its weaker
30
30
  `idea_inbox.promoted_to_task_id` pointer survived.
31
31
 
32
- This table is the rail [ADR 0172](<redacted>.md)'s
32
+ This table is the rail [ADR 0172](0172-per-craft-compensation-ideator-credit-lane.md)'s
33
33
  stream 1 pays against (`<redacted>`, `sourceIdeaForTask`), so an
34
34
  overwritten row is an ideator silently not paid for work their idea produced,
35
35
  with no trace anywhere that it happened. It also made "N duplicate reports merged
@@ -92,7 +92,7 @@ both the list and its count, so the pill can never disagree with the rows).
92
92
  - **`DROP CONSTRAINT` here is additive.** Postgres has no "widen a key" verb, so
93
93
  the change is drop-then-re-add of the same-named constraint — the shape
94
94
  `fitness.js`'s `isConstraintWidening` exempts, and the one
95
- [`ideas_003`](../../modules/ideas/migrations/<redacted>.sql)
95
+ [`ideas_003`](../../modules/ideas/migrations/ideas_003_lineage_origin_route.sql)
96
96
  already recorded for a CHECK. The new key permits a strict superset of the old
97
97
  one, so no existing row can be invalidated. The migration asserts its own
98
98
  effect and raises if the primary key is still single-column.
@@ -5,10 +5,10 @@
5
5
  - **Tasks:** [#1002338](https://cloudbongos.com/builders#/task/1002338) (this decision — BV1.R19)
6
6
  - **Goal:** [#1000046](https://cloudbongos.com/builders#/goal/1000046) — Project creation: visibility and
7
7
  customization, criterion `proj-module-select` ("during setup a default set of modules is pre-selected…")
8
- - **Related:** [ADR 0083](<redacted>.md) (the one-way import rule that
9
- keeps this file pure), [ADR 0107](<redacted>.md) +
10
- [ADR 0167](<redacted>.md) (the module catalog a bundle names into),
11
- [ADR 0182](<redacted>.md) D4 (the publish bar a bundle may not join),
8
+ - **Related:** [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the one-way import rule that
9
+ keeps this file pure), [ADR 0107](0107-module-upstreaming-contribution-to-core-catalog.md) +
10
+ [ADR 0167](0167-module-catalog-source-vs-provenance.md) (the module catalog a bundle names into),
11
+ [ADR 0182](0182-project-visibility-two-axes.md) D4 (the publish bar a bundle may not join),
12
12
  task [#1002772](https://cloudbongos.com/builders#/task/1002772) (the declared project type),
13
13
  task [#1002334](https://cloudbongos.com/builders#/task/1002334) (R15, the detail interview)
14
14
 
@@ -113,7 +113,7 @@ catalog it names into is already public at `GET /public/modules`.
113
113
 
114
114
  ## 6. Consequences
115
115
 
116
- - **A bundle is never a publish precondition.** [ADR 0182](<redacted>.md)
116
+ - **A bundle is never a publish precondition.** [ADR 0182](0182-project-visibility-two-axes.md)
117
117
  D4 fixes the bar at identity alone — a name and a description, "not tagline, art,
118
118
  modules, governance, or a completed interview." Taking or declining a bundle
119
119
  cannot move a project's dark-matter state.
@@ -4,7 +4,7 @@
4
4
  - **Date:** 2026-09-03
5
5
  - **Task:** [task 1002324](https://cloudbongos.com/builders#/task/1002324) (BONGOS-V1, goal 1000046 — *Project creation — visibility and customization*, criterion `proj-visibility-states`)
6
6
  - **Deciders:** jaxri (Archon), Claude
7
- - **Related:** [ADR 0182](<redacted>.md) (the two axes — this ADR only says *where* R05's half lives) · [ADR 0141](<redacted>.md) §3 (authority stays local) · [ADR 0190](<redacted>.md) (a pushed setting takes effect by a restart) · [ADR 0192](<redacted>.md) (`platform_visibility`, the neighbouring axis)
7
+ - **Related:** [ADR 0182](0182-project-visibility-two-axes.md) (the two axes — this ADR only says *where* R05's half lives) · [ADR 0141](<redacted>.md) §3 (authority stays local) · [ADR 0190](0190-settings-apply-in-place-env-patch.md) (a pushed setting takes effect by a restart) · [ADR 0192](0192-platform-visibility-member-door.md) (`platform_visibility`, the neighbouring axis)
8
8
 
9
9
  ---
10
10
 
@@ -7,9 +7,9 @@
7
7
  customization; criteria `proj-module-select` ("additional modules are recommended (rule-based) from the
8
8
  project's details"), `proj-governance-reco` ("a recommended governance setup … derived from its details"),
9
9
  `proj-invite-builders` ("the owner can optionally invite guilds or top builders")
10
- - **Related:** [ADR 0237](<redacted>.md)
11
- (R19, the per-type preset this adjusts), [ADR 0182](<redacted>.md) D4 (skipping the
12
- interview is a supported answer), [ADR 0083](<redacted>.md) (the
10
+ - **Related:** [ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md)
11
+ (R19, the per-type preset this adjusts), [ADR 0182](0182-project-visibility-two-axes.md) D4 (skipping the
12
+ interview is a supported answer), [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the
13
13
  one-way import rule that makes the invite lookup a seam),
14
14
  task [#1002334](https://cloudbongos.com/builders#/task/1002334) (R15, the interview whose answer this reads),
15
15
  task [#1002772](https://cloudbongos.com/builders#/task/1002772) (the declared project type),
@@ -24,7 +24,7 @@ the near term: "near-term recommendations are rule-based and module search is
24
24
  lexical; the AI/embeddings layer … is a deferred follow-up captured in the idea
25
25
  inbox."
26
26
 
27
- R19 ([ADR 0237](<redacted>.md))
27
+ R19 ([ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md))
28
28
  already answered the type half — a starter bundle per declared project type — and
29
29
  said explicitly that it is "a declaration and not a rule engine … R17/R22 own the
30
30
  layer that reasons." This is that layer.
@@ -5,11 +5,11 @@
5
5
  - **Tasks:** [#1002339](https://cloudbongos.com/builders#/task/1002339) (this decision — BV1.R20)
6
6
  - **Goal:** [#1000046](https://cloudbongos.com/builders#/goal/1000046) — Project creation: visibility and
7
7
  customization, criterion `proj-module-select` ("during setup a default set of modules is pre-selected…")
8
- - **Related:** [ADR 0237](<redacted>.md)
8
+ - **Related:** [ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md)
9
9
  (R19 — the bundles this picker renders, and the file that closed with "where a chosen selection lands
10
- is R20's decision"), [ADR 0182](<redacted>.md) D4 (the publish bar a module set
11
- may not join), [ADR 0083](<redacted>.md) (the one-way import rule),
12
- [ADR 0111](<redacted>.md) (the enqueue-only web tier), migration
10
+ is R20's decision"), [ADR 0182](0182-project-visibility-two-axes.md) D4 (the publish bar a module set
11
+ may not join), [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the one-way import rule),
12
+ [ADR 0111](0111-instance-hosting-provisioning-module.md) (the enqueue-only web tier), migration
13
13
  `provisioning_013` (the `detail` column this deliberately does not use)
14
14
 
15
15
  ## 1. The problem
@@ -3,7 +3,7 @@
3
3
  - **Status:** Accepted
4
4
  - **Date:** 2026-09-03
5
5
  - **Tasks:** [#1003116](https://cloudbongos.com/builders#/task/1003116) (R05 of goal 1000074, the artist's loop) — the decision task the goal placed BEFORE [#1003115](https://cloudbongos.com/builders#/task/1003115) (R04, the review task), so that no code is wired to a gate whose authority is unsettled
6
- - **Reconciles:** [ADR 0162](<redacted>.md) — review gates retired on `main`; a verdict is advisory and never self-executing
6
+ - **Reconciles:** [ADR 0162](0162-review-gates-retired-rank-consistent-ci-only.md) — review gates retired on `main`; a verdict is advisory and never self-executing
7
7
  - **Related:** 0178 (the copy desk flag + queue, which deliberately blocked nothing and named this decision as the one that would settle it), 0233 (a copy proposal is a task carrying a patch), 0016 (authority is resolved server-side, never from a local file), 0120 (pay on land), 0137 (land → release → deploy are three separate gates)
8
8
 
9
9
  ## Context
@@ -42,8 +42,8 @@ A cascade is one frozen entry: `{ key, discipline, when(task), title(task), body
42
42
  no condition language, no stored rules, no per-project configuration, no UI, and no priority
43
43
  ordering. Adding a cascade means appending an entry; the runner does not change.
44
44
 
45
- This is the [ADR 0237](<redacted>.md)
46
- / [ADR 0239](<redacted>.md) shape applied to a
45
+ This is the [ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md)
46
+ / [ADR 0239](0239-a-recommendation-is-a-table-that-carries-its-own-reason.md) shape applied to a
47
47
  different problem, and for the same reason: the generalisations worth building are the ones two or
48
48
  three real entries have shown they share. With one consumer in existence, a rules engine would be
49
49
  inventing the requirements it then satisfied.
@@ -5,12 +5,12 @@
5
5
  - **Tasks:** [#1002341](https://cloudbongos.com/builders#/task/1002341) (this decision — BV1.R22)
6
6
  - **Goal:** [#1000046](https://cloudbongos.com/builders#/goal/1000046) — Project creation, criterion
7
7
  `proj-module-select` ("during setup a default set of modules is pre-selected…")
8
- - **Related:** [ADR 0237](<redacted>.md)
8
+ - **Related:** [ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md)
9
9
  (R19 — the per-type presets, and the file that said the bundle layer "is a declaration and not a rule
10
- engine"), [ADR 0239](<redacted>.md) (R17 — the rule
11
- engine, and the `TEAM_SHAPE_RULES` table this moves), [ADR 0240](<redacted>.md)
10
+ engine"), [ADR 0239](0239-a-recommendation-is-a-table-that-carries-its-own-reason.md) (R17 — the rule
11
+ engine, and the `TEAM_SHAPE_RULES` table this moves), [ADR 0240](0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md)
12
12
  (R20 — the picker, the nullable `modules` column, and §2's "one function, called twice" property this
13
- is written to preserve), [ADR 0083](<redacted>.md) (the one-way
13
+ is written to preserve), [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the one-way
14
14
  import rule)
15
15
 
16
16
  ## 1. The problem
@@ -5,11 +5,11 @@
5
5
  - **Tasks:** [#1002340](https://cloudbongos.com/builders#/task/1002340) (this decision — BV1.R21)
6
6
  - **Goal:** [#1000046](https://cloudbongos.com/builders#/goal/1000046) — Project creation, criterion
7
7
  `proj-module-select` ("during setup a default set of modules is pre-selected…")
8
- - **Related:** [ADR 0237](<redacted>.md)
8
+ - **Related:** [ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md)
9
9
  (R19 — the per-type presets, and the file that already said "R21 searches the catalog"),
10
- [ADR 0240](<redacted>.md)
10
+ [ADR 0240](0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md)
11
11
  (R20 — the picker, and the three-valued `modules` column whose `null` this must not disturb),
12
- [ADR 0243](<redacted>.md)
12
+ [ADR 0243](0243-a-bundle-adjustment-belongs-to-the-bundle-not-the-advice-about-it.md)
13
13
  (R22 — the tailored preselect the search now filters)
14
14
 
15
15
  ## 1. The problem
@@ -5,15 +5,15 @@
5
5
  - **Tasks:** [#1002342](https://cloudbongos.com/builders#/task/1002342) (this decision — BV1.R23)
6
6
  - **Goal:** [#1000046](https://cloudbongos.com/builders#/goal/1000046) — Project creation, criterion
7
7
  `proj-module-select` ("during setup a default set of modules is pre-selected…")
8
- - **Related:** [ADR 0240](<redacted>.md)
8
+ - **Related:** [ADR 0240](0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md)
9
9
  (R20 — the nullable `modules` column, the three-valued contract, and §6's "R23 … needs to know whether
10
- an owner has ever been asked"), [ADR 0237](<redacted>.md)
10
+ an owner has ever been asked"), [ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md)
11
11
  (R19 — the bundles and the `OPTIONAL_MODULES` catalog this surface renders),
12
- [ADR 0243](<redacted>.md) (R22 — the
12
+ [ADR 0243](0243-a-bundle-adjustment-belongs-to-the-bundle-not-the-advice-about-it.md) (R22 — the
13
13
  team-shape adjustment inside the fallback, and why `PATCH …/detail` already answered with `modules`),
14
- [ADR 0238](<redacted>.md) (R05 — the manage view, and its
14
+ [ADR 0238](0238-the-join-door-is-a-provisioning-settings-policy-key.md) (R05 — the manage view, and its
15
15
  finding that "the project's own hall settings" is a page that does not exist),
16
- [ADR 0111](<redacted>.md) (the enqueue-only web tier)
16
+ [ADR 0111](0111-instance-hosting-provisioning-module.md) (the enqueue-only web tier)
17
17
 
18
18
  ## 1. The problem
19
19
 
@@ -49,7 +49,7 @@ kind of thing:
49
49
  steps after creation"* — the name is narrower than the job. It already carries the
50
50
  ownership gate (`instanceAccessDenied`: own-scoped, Archon override, 404 with no
51
51
  existence leak), already records an event with an `api:self` / `api:archon:<id>`
52
- actor, and — since [ADR 0243](<redacted>.md)
52
+ actor, and — since [ADR 0243](0243-a-bundle-adjustment-belongs-to-the-bundle-not-the-advice-about-it.md)
53
53
  — **already answers with `effectiveModules(updated)`**, because a `team_shape`
54
54
  answer moves a bundle-sourced project's modules. The route was already reporting
55
55
  this value; all that was missing was the ability to set it.
@@ -58,7 +58,7 @@ A second route would have duplicated the gate, the actor rule, the 404 shape and
58
58
  the receipt, for one column on a row the first route already writes. Duplicated
59
59
  authorization is the kind that drifts.
60
60
 
61
- **Not the settings channel**, for [ADR 0240](<redacted>.md)
61
+ **Not the settings channel**, for [ADR 0240](0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md)
62
62
  §3's reason, restated: a setting is *a policy the running instance obeys* — it
63
63
  rides `web.env`, queues a `settings-apply` intent and restarts the service. A
64
64
  module selection is a declaration held on the platform row until a catalog row
@@ -4,7 +4,7 @@
4
4
  - **Date:** 2026-09-04
5
5
  - **Task:** [task 1003576](https://cloudbongos.com/builders#/task/1003576) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-detail-interview` / C3)
6
6
  - **Deciders:** jaxri (Archon), Claude
7
- - **Related:** [ADR 0182](<redacted>.md) (the two axes; D4 is the publish gate, D5 makes the hub column a cache) · [ADR 0238](<redacted>.md) (the join door is a provisioning setting; the hub's owner column is attribution, never authority) · [ADR 0141](<redacted>.md) §2/§4 (the SSO client registry and what a client secret is for) · [ADR 0083](<redacted>.md) (the module one-way rule — why this travels on a port) · [ADR 0181](0181-teardown-state-gate-and-address-retention.md) §2 (an abandoned address left pointing at platform infra)
7
+ - **Related:** [ADR 0182](0182-project-visibility-two-axes.md) (the two axes; D4 is the publish gate, D5 makes the hub column a cache) · [ADR 0238](0238-the-join-door-is-a-provisioning-settings-policy-key.md) (the join door is a provisioning setting; the hub's owner column is attribution, never authority) · [ADR 0141](<redacted>.md) §2/§4 (the SSO client registry and what a client secret is for) · [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the module one-way rule — why this travels on a port) · [ADR 0181](0181-teardown-state-gate-and-address-retention.md) §2 (an abandoned address left pointing at platform infra)
8
8
 
9
9
  ---
10
10
 
@@ -4,8 +4,8 @@
4
4
  - **Date:** 2026-09-04
5
5
  - **Task:** [task 1002331](https://cloudbongos.com/builders#/task/1002331) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-join-policy`)
6
6
  - **Deciders:** Claude, under the Archon's standing scope
7
- - **Implements:** [ADR 0182](<redacted>.md) D6 (*"visibility sets the ceiling; join policy may only narrow it"*) — which stated the rule and left it unimplemented
8
- - **Related:** [ADR 0194](<redacted>.md) (`joinabilityMode`, the one-reader precedent this extends) · [ADR 0238](<redacted>.md) (the settings channel the new knob rides) · [ADR 0116](<redacted>.md) (the refusal envelope) · [ADR 0083](<redacted>.md) (the doorway)
7
+ - **Implements:** [ADR 0182](0182-project-visibility-two-axes.md) D6 (*"visibility sets the ceiling; join policy may only narrow it"*) — which stated the rule and left it unimplemented
8
+ - **Related:** [ADR 0194](0194-joinability-one-door-decision.md) (`joinabilityMode`, the one-reader precedent this extends) · [ADR 0238](0238-the-join-door-is-a-provisioning-settings-policy-key.md) (the settings channel the new knob rides) · [ADR 0116](0116-api-error-envelope-and-code-taxonomy.md) (the refusal envelope) · [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the doorway)
9
9
 
10
10
  ---
11
11
 
@@ -4,15 +4,15 @@
4
4
  - **Date:** 2026-09-04
5
5
  - **Task:** [task 1003580](https://cloudbongos.com/builders#/task/1003580) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-invite-builders` / C6), GAP 2
6
6
  - **Deciders:** Claude, under the Archon's standing scope
7
- - **Implements:** [ADR 0246](<redacted>.md)'s named remainder — *"what remains there is purely the ownership branch… the ownership proof it should carry is `provisioning_instances.owner_builder_id`"*
8
- - **Related:** [ADR 0210](<redacted>.md) (owner-or-rank as one middleware; the atom stays spelled in the route's own list) · [ADR 0238](<redacted>.md) (the hub's `owner_github_id` columns are attribution, never authority) · [ADR 0083](<redacted>.md) (the one-way module rule — why this travels on a port) · [ADR 0182](<redacted>.md) D2a (a stealth project is anonymous, so a refusal may not identify it) · [ADR 0016](<redacted>.md) (fail-closed authority)
7
+ - **Implements:** [ADR 0246](0246-catalog-membership-is-a-projection-not-a-federation-side-effect.md)'s named remainder — *"what remains there is purely the ownership branch… the ownership proof it should carry is `provisioning_instances.owner_builder_id`"*
8
+ - **Related:** [ADR 0210](0210-scouting-graduates-on-an-instance-asserted-owner-claim.md) (owner-or-rank as one middleware; the atom stays spelled in the route's own list) · [ADR 0238](0238-the-join-door-is-a-provisioning-settings-policy-key.md) (the hub's `owner_github_id` columns are attribution, never authority) · [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the one-way module rule — why this travels on a port) · [ADR 0182](0182-project-visibility-two-axes.md) D2a (a stealth project is anonymous, so a refusal may not identify it) · [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (fail-closed authority)
9
9
 
10
10
  ---
11
11
 
12
12
  ## Context
13
13
 
14
14
  `POST /projects/invite` is gated `requirePermission('project.curate')`, floor `metic`
15
- ([ADR 0157](<redacted>.md)). It is a **curation** gate:
15
+ ([ADR 0157](0157-archon-is-rank-and-identity-only.md)). It is a **curation** gate:
16
16
  `requirePermission` is purely grant/rank-based and has no own-scope branch. The creation
17
17
  wizard's audience is any signed-in GitHub user — on the hub, typically a `xenos` holding
18
18
  nothing at all. So the person who created a project got **403 on inviting anyone into their
@@ -4,8 +4,8 @@
4
4
  - **Date:** 2026-09-04
5
5
  - **Task:** [task 1002346](https://cloudbongos.com/builders#/task/1002346) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-invite-builders` / C6), BV1.R27
6
6
  - **Deciders:** Claude, under the Archon's standing scope
7
- - **Depends on:** [ADR 0246](<redacted>.md) (a control-plane project is a catalog row keyed on its slug — what makes `client_id` resolve at all) · [ADR 0248](<redacted>.md) (the project's own owner may invite — what makes the wizard's audience anything but a 403)
8
- - **Related:** [ADR 0245](<redacted>.md) (an optional step is a default rather than a dead end only if there is a way back) · [ADR 0237](<redacted>.md) / [ADR 0240](<redacted>.md) (the wizard's other skippable steps) · [ADR 0182](<redacted>.md) D2a (a refusal may not identify a stealth project)
7
+ - **Depends on:** [ADR 0246](0246-catalog-membership-is-a-projection-not-a-federation-side-effect.md) (a control-plane project is a catalog row keyed on its slug — what makes `client_id` resolve at all) · [ADR 0248](0248-a-hub-project-s-owner-is-the-provisioning-row-carried-on-a-port.md) (the project's own owner may invite — what makes the wizard's audience anything but a 403)
8
+ - **Related:** [ADR 0245](0245-the-way-back-into-an-optional-step-is-that-step-s-own-answer-route.md) (an optional step is a default rather than a dead end only if there is a way back) · [ADR 0237](0237-a-starter-bundle-is-a-preset-over-the-always-on-core-keyed-by-declared-type.md) / [ADR 0240](0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md) (the wizard's other skippable steps) · [ADR 0182](0182-project-visibility-two-axes.md) D2a (a refusal may not identify a stealth project)
9
9
 
10
10
  ---
11
11
 
@@ -52,7 +52,7 @@ moment the created-instance record carries an id and a slug, and skippable there
52
52
  (`setInviteSlug`). The wizard's answer is the created record; the manage page's is that
53
53
  the per-id provisioning read is own-scoped and 404s for everyone else, so *reaching*
54
54
  `renderManage` IS the ownership answer. A page that re-derived ownership would be a second,
55
- weaker copy of a server rule ([ADR 0016](<redacted>.md)).
55
+ weaker copy of a server rule ([ADR 0016](0016-trust-boundary-server-enforced-permissions.md)).
56
56
 
57
57
  ### The 403 is quoted carefully, and that is the point
58
58
 
@@ -4,8 +4,8 @@
4
4
  - **Date:** 2026-09-06
5
5
  - **Tasks:** [#1003589](https://cloudbongos.com/builders#/task/1003589) (this decision), seeded by the planning session `#1003586`. The implementation is BV1.R03–R30 under the same goal.
6
6
  - **Goal:** [#1000086](https://cloudbongos.com/builders#/goal/1000086) — Strict versioning: a goal cannot outlive its tasks, and a version's goal set is closed.
7
- - **Builds on:** [ADR 0086](<redacted>.md) (Project → Version → Goal → Criteria → Task — the hierarchy this decision finally closes at the top), [ADR 0015](<redacted>.md) (deps are load-bearing, the rank prefix is decorative), [ADR 0183](<redacted>.md) (a criterion satisfies itself when its tasks ship).
8
- - **Amends:** [ADR 0157](<redacted>.md) — for one key, `version.create`. See §6.
7
+ - **Builds on:** [ADR 0086](0086-goal-scoped-work-hierarchy.md) (Project → Version → Goal → Criteria → Task — the hierarchy this decision finally closes at the top), [ADR 0015](0015-task-dependencies-and-auto-promotion.md) (deps are load-bearing, the rank prefix is decorative), [ADR 0183](0183-criteria-close-themselves.md) (a criterion satisfies itself when its tasks ship).
8
+ - **Amends:** [ADR 0157](0157-archon-is-rank-and-identity-only.md) — for one key, `version.create`. See §6.
9
9
 
10
10
  ## 1. The problem, measured
11
11
 
@@ -35,7 +35,7 @@ work, and the tasks become unreachable except by direct id.
35
35
  No one decided any of this. Four gaps in the code produce all of it:
36
36
 
37
37
  1. **`POST /goals` never reads the version's status** ([`modules/lifecycle/routes/goals.js`](../../modules/lifecycle/routes/goals.js)). It fetches the version row to validate the id and ignores `status`, so a goal can be added to a version that has been building for months. That is how a version's scope grows without anyone widening it.
38
- 2. **Goal achievement is computed from criteria alone** ([`db-goals.js`](../../modules/lifecycle/db-goals.js) `achieveGoalIfComplete`, and the cascade in [`done-when.js`](../../modules/lifecycle/done-when.js)). Neither writer consults `tasks`. Since [ADR 0183](<redacted>.md) criteria satisfy themselves on ship, the path from "the criteria I happened to link are satisfied" to `achieved` is fully automatic — and a task nobody linked to a criterion holds nothing open.
38
+ 2. **Goal achievement is computed from criteria alone** ([`db-goals.js`](../../modules/lifecycle/db-goals.js) `achieveGoalIfComplete`, and the cascade in [`done-when.js`](../../modules/lifecycle/done-when.js)). Neither writer consults `tasks`. Since [ADR 0183](0183-criteria-close-themselves.md) criteria satisfy themselves on ship, the path from "the criteria I happened to link are satisfied" to `achieved` is fully automatic — and a task nobody linked to a criterion holds nothing open.
39
39
  3. **`POST /goals/:id/archive` checks nothing at all.** Archiving is a single call that discards whatever the goal was holding, silently.
40
40
  4. **No route ships a version.** Version status has only ever moved by hand-run SQL on the droplet; `scripts/gds/version-close.js` prints that the API cannot do it. A thing with no closing move does not close.
41
41
 
@@ -95,20 +95,20 @@ override to be filed.
95
95
  ## 4. What this is not
96
96
 
97
97
  - **Not a new gate on shipping.** Nothing here can refuse a ship, block a claim, or park a task. Every rule acts on a *closing* move — goal achievement, goal archive, version close, goal/task creation. A builder's day is unchanged unless they try to close something that is not finished.
98
- - **Not a re-litigation of [ADR 0183](<redacted>.md).** Criteria still satisfy themselves. D2 adds a second condition to the *goal's* flip, not a human gate in front of the criterion's.
98
+ - **Not a re-litigation of [ADR 0183](0183-criteria-close-themselves.md).** Criteria still satisfy themselves. D2 adds a second condition to the *goal's* flip, not a human gate in front of the criterion's.
99
99
  - **Not a change to what `abandoned` means.** [Task 1002651](https://cloudbongos.com/builders#/task/1002651) already made abandoned terminal; D2 relies on that and adds nothing.
100
100
 
101
101
  ## 5. Rejected alternatives
102
102
 
103
103
  - **Count `completed`/`confirmed` as finished.** It would close the visible symptom with one word and is wrong: those states can fail a grade, strand at `confirmed`, or be reconciled back. A goal closed on a task that never landed is the same lie in a shorter timeframe. (The goals **board** does bucket them as done — that is a progress ring, and `task-status.js` keeps the two questions apart on purpose.)
104
104
  - **A nightly reconciler that reopens wrongly-closed goals.** Repairs the ledger after the fact and leaves the four gaps open, so the report can never be trusted between sweeps. Prevention is available here; detection is what you build when it is not.
105
- - **A human review gate before a goal may close.** This is the queue [ADR 0183](<redacted>.md) deliberately dismantled. The check D2 needs is a fact the database already holds — asking a person to assert it is slower and less reliable than asking the table.
105
+ - **A human review gate before a goal may close.** This is the queue [ADR 0183](0183-criteria-close-themselves.md) deliberately dismantled. The check D2 needs is a fact the database already holds — asking a person to assert it is slower and less reliable than asking the table.
106
106
  - **Allow concurrent building versions and scope them by module.** Tempting, because it is the state the instance is in. But two live trains on one project means every "what is in this version" question has two answers, and the goal set can never close on either. The `planning` version is the supported way to work ahead.
107
107
  - **Retire versions entirely and let goals stand alone.** Genuinely considered: goals already carry criteria, membership and scope, so the version is arguably ceremony. Rejected because the version is the unit the owner sets scope in and the unit `limitations/<version>-shipped.md` archives — removing it would move the scope conversation somewhere with no home.
108
108
 
109
109
  ## 6. The one amendment to ADR 0157
110
110
 
111
- [ADR 0157](<redacted>.md) lowered `version.create` to
111
+ [ADR 0157](0157-archon-is-rank-and-identity-only.md) lowered `version.create` to
112
112
  `metic`, on the argument that **authoring delegates, disposition does not**:
113
113
  creating a version confers no authority, so its siblings are `goal.create` and
114
114
  `task.create`, and only `version.close` stays Archon. That argument was correct
@@ -4,14 +4,14 @@
4
4
  - **Date:** 2026-09-06
5
5
  - **Task:** [task 1002347](https://cloudbongos.com/builders#/task/1002347) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-invite-builders` / C6), BV1.R28
6
6
  - **Deciders:** Claude, under the Archon's standing scope
7
- - **Depends on:** [ADR 0239](<redacted>.md) §6 (the seam this fills: the engine emits `invites.seeking` and names R28 as its reader) · [ADR 0249](<redacted>.md) (the widget these names arrive in, and its "only door in" rule) · [ADR 0083](<redacted>.md) (the one-way import rule that makes this a port)
8
- - **Related:** [ADR 0210](<redacted>.md) (the `/scouting` gate this route deliberately does **not** reuse) · [ADR 0248](<redacted>.md) (the ownership fact the invite route already admits on) · [ADR 0016](<redacted>.md) (a surface never re-derives a server rule)
7
+ - **Depends on:** [ADR 0239](0239-a-recommendation-is-a-table-that-carries-its-own-reason.md) §6 (the seam this fills: the engine emits `invites.seeking` and names R28 as its reader) · [ADR 0249](0249-the-invite-step-is-the-done-panel-s-first-act-not-a-rail-step.md) (the widget these names arrive in, and its "only door in" rule) · [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the one-way import rule that makes this a port)
8
+ - **Related:** [ADR 0210](0210-scouting-graduates-on-an-instance-asserted-owner-claim.md) (the `/scouting` gate this route deliberately does **not** reuse) · [ADR 0248](0248-a-hub-project-s-owner-is-the-provisioning-row-carried-on-a-port.md) (the ownership fact the invite route already admits on) · [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (a surface never re-derives a server rule)
9
9
 
10
10
  ---
11
11
 
12
12
  ## Context
13
13
 
14
- [ADR 0239](<redacted>.md) §6 left one recommendation deliberately unfinished. The creation wizard's rule engine emits, per team shape, a **seek** rather than a list:
14
+ [ADR 0239](0239-a-recommendation-is-a-table-that-carries-its-own-reason.md) §6 left one recommendation deliberately unfinished. The creation wizard's rule engine emits, per team shape, a **seek** rather than a list:
15
15
 
16
16
  ```
17
17
  solo → seeking: null ("suggest nobody", a real answer)
@@ -53,11 +53,11 @@ Two things are enforced inside the module rather than asked of callers:
53
53
 
54
54
  It deliberately does **not** reuse `/scouting`'s gate (`project.curate` or a hub-witnessed `membership_kind='owner'`). A brand-new owner has no witnessed owner-membership row at the moment the done panel paints — that row is written later, by the child instance at SSO check-in — so the correct-looking gate would refuse the exact caller the feature exists for.
55
55
 
56
- Reaching this route **is** the ownership answer ([ADR 0249](<redacted>.md) §4), so the surface re-derives nothing and cannot become a weaker second copy of a server rule ([ADR 0016](<redacted>.md)). 404 rather than 403 keeps it leaking no more instance existence than its neighbour.
56
+ Reaching this route **is** the ownership answer ([ADR 0249](0249-the-invite-step-is-the-done-panel-s-first-act-not-a-rail-step.md) §4), so the surface re-derives nothing and cannot become a weaker second copy of a server rule ([ADR 0016](0016-trust-boundary-server-enforced-permissions.md)). 404 rather than 403 keeps it leaking no more instance existence than its neighbour.
57
57
 
58
58
  ## What the surface does with the answer
59
59
 
60
- The widget keeps its shape from [ADR 0249](<redacted>.md): it still answers neither "is anyone signed in" nor "is this their project", and gains a **second door in** (`setInviteSuggestions`) beside `setInviteSlug` rather than learning to fetch for itself.
60
+ The widget keeps its shape from [ADR 0249](0249-the-invite-step-is-the-done-panel-s-first-act-not-a-rail-step.md): it still answers neither "is anyone signed in" nor "is this their project", and gains a **second door in** (`setInviteSuggestions`) beside `setInviteSlug` rather than learning to fetch for itself.
61
61
 
62
62
  - **The reason is always said, including when the answer is nobody.** `seeking: null` returns its own sentence and never touches the directory. A solo owner is suggested nobody *on purpose*, and rendering that as an empty list would turn a stated answer into what looks like a failed lookup.
63
63
  - **A picked name takes the same write path as a typed one** — it fills the field and calls `doInvite`. One write path means the refusal vocabulary, the busy guard and the pending receipt cannot drift into a second copy.
@@ -5,8 +5,8 @@
5
5
  - **Task:** [task 1002321](https://cloudbongos.com/builders#/task/1002321) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-visibility-states` / C1), BV1.R02 — a spike whose output is this decision
6
6
  - **Gates:** [task 1002327](https://cloudbongos.com/builders#/task/1002327) (BV1.R08 — the build)
7
7
  - **Deciders:** the Archon (the two product calls in §3 and §5), Claude (the mechanism)
8
- - **Depends on:** [ADR 0182](<redacted>.md) D3/D5 (the two axes, and the hand-off that named this ADR's scope) · [ADR 0238](<redacted>.md) (the owner's door is a provisioning settings key; the hub column stays the cache) · [ADR 0246](<redacted>.md) (the control-plane projection, and the line this ADR sits on)
9
- - **Related:** [ADR 0144](<redacted>.md) (the tripwire this route avoids) · [ADR 0145](<redacted>.md) (why `standalone` holds no credential) · [ADR 0205](<redacted>.md) (what a self-report may and may not buy) · [ADR 0047](<redacted>.md) (the straight-through path and its abuse guard are one task) · [ADR 0199](<redacted>.md) / [ADR 0226](<redacted>.md) (a degraded report is not a state change)
8
+ - **Depends on:** [ADR 0182](0182-project-visibility-two-axes.md) D3/D5 (the two axes, and the hand-off that named this ADR's scope) · [ADR 0238](0238-the-join-door-is-a-provisioning-settings-policy-key.md) (the owner's door is a provisioning settings key; the hub column stays the cache) · [ADR 0246](0246-catalog-membership-is-a-projection-not-a-federation-side-effect.md) (the control-plane projection, and the line this ADR sits on)
9
+ - **Related:** [ADR 0144](0144-federated-single-logout-backchannel.md) (the tripwire this route avoids) · [ADR 0145](0145-free-hosted-project-tier-isolation-and-domain-separation.md) (why `standalone` holds no credential) · [ADR 0205](0205-federated-checkin-needs-the-hubs-own-signin-witness.md) (what a self-report may and may not buy) · [ADR 0047](0047-discord-bugs-intake-anti-abuse.md) (the straight-through path and its abuse guard are one task) · [ADR 0199](0199-restart-an-unreachable-active-project.md) / [ADR 0226](0226-one-stale-timer-reporting-degrades-enforcement-refuses.md) (a degraded report is not a state change)
10
10
 
11
11
  ---
12
12
 
@@ -20,9 +20,9 @@ Reading the tree first changed the question. **A self-hosted instance has no cha
20
20
  if (inst.hosting_shape !== 'co-tenant') return { federate: false, reason: … };
21
21
  ```
22
22
 
23
- Every writer of `sso_clients` is control-plane; no route registers a client. So *federated* ⊆ *operator-provisioned co-tenant*, and *self-hosted* is a disjoint set holding nothing. That is deliberate on two counts: [ADR 0145](<redacted>.md) says in as many words **do not** extend federation to `standalone` as it exists today, and [ADR 0144](<redacted>.md)'s Known Limitation rests on it — *"today every secret-holder is an operator-provisioned, trusted instance … the proper fix must land before federation opens to untrusted third-party clients."*
23
+ Every writer of `sso_clients` is control-plane; no route registers a client. So *federated* ⊆ *operator-provisioned co-tenant*, and *self-hosted* is a disjoint set holding nothing. That is deliberate on two counts: [ADR 0145](0145-free-hosted-project-tier-isolation-and-domain-separation.md) says in as many words **do not** extend federation to `standalone` as it exists today, and [ADR 0144](0144-federated-single-logout-backchannel.md)'s Known Limitation rests on it — *"today every secret-holder is an operator-provisioned, trusted instance … the proper fix must land before federation opens to untrusted third-party clients."*
24
24
 
25
- So the literal reading of R08 — "a self-hosted instance authenticates and pushes a report" — cannot be built without first minting credentials for untrusted third parties, which walks straight into that tripwire. [ADR 0182](<redacted>.md) D5's phrasing ("accepts a report from the authenticated `sso_client`") described a client that, for this population, does not exist.
25
+ So the literal reading of R08 — "a self-hosted instance authenticates and pushes a report" — cannot be built without first minting credentials for untrusted third parties, which walks straight into that tripwire. [ADR 0182](0182-project-visibility-two-axes.md) D5's phrasing ("accepts a report from the authenticated `sso_client`") described a client that, for this population, does not exist.
26
26
 
27
27
  ## 2. The channel is a PULL of the instance's own public manifest
28
28
 
@@ -33,20 +33,20 @@ That value is already there and already public. The owner's pick lives at `provi
33
33
  Five things a pull gets for free, each of which a push would have had to build:
34
34
 
35
35
  1. **No credential.** Nothing is minted for anyone, so ADR 0144's tripwire is untouched and ADR 0145's rule holds. This is the whole reason the decision goes this way.
36
- 2. **No replay surface.** ADR 0182 D5 handed R02 "replay, rate" as its scope. A pull reads *current state*, so there is no message to capture and resend — the `jti`-style machinery [ADR 0144](<redacted>.md) D6 needed for the push direction is moot here. Replay is answered by not having a message.
37
- 3. **No wire change on anyone else's upgrade clock.** [ADR 0205](<redacted>.md) rejected adding a required body field precisely because "the callers are other instances on their own upgrade schedule," and [ADR 0201](<redacted>.md) D2.2 solved the same problem with a header. Here the field already ships in every core; nothing has to be added at all.
38
- 4. **The hub still authorizes nothing.** It reads a declaration and caches it, which is exactly what [ADR 0182](<redacted>.md) D5 requires and what [ADR 0238](<redacted>.md) rejected a `PATCH /projects/:id/visibility` for failing.
36
+ 2. **No replay surface.** ADR 0182 D5 handed R02 "replay, rate" as its scope. A pull reads *current state*, so there is no message to capture and resend — the `jti`-style machinery [ADR 0144](0144-federated-single-logout-backchannel.md) D6 needed for the push direction is moot here. Replay is answered by not having a message.
37
+ 3. **No wire change on anyone else's upgrade clock.** [ADR 0205](0205-federated-checkin-needs-the-hubs-own-signin-witness.md) rejected adding a required body field precisely because "the callers are other instances on their own upgrade schedule," and [ADR 0201](0201-cross-project-application-vouched-row-live-record.md) D2.2 solved the same problem with a header. Here the field already ships in every core; nothing has to be added at all.
38
+ 4. **The hub still authorizes nothing.** It reads a declaration and caches it, which is exactly what [ADR 0182](0182-project-visibility-two-axes.md) D5 requires and what [ADR 0238](0238-the-join-door-is-a-provisioning-settings-policy-key.md) rejected a `PATCH /projects/:id/visibility` for failing.
39
39
  5. **The fetch is already written.** `modules/platform-identity/project-stats.js` fans out to project origins today behind a real SSRF guard — DNS-resolve-all with a public-address assertion, `redirect: 'error'` (a curated origin is trusted, a redirect target is not), per-request timeouts, a TTL cache, a negative cache and inflight collapsing. The visibility read rides that machinery rather than opening a second, weaker outbound path.
40
40
 
41
41
  **The pull carries `visibility` and nothing else.** It is a three-value closed enum; an absent or off-vocabulary answer yields *no verdict* (§4), never a default. No free text, no name, no tagline, no art reaches the catalog through this channel — those stay curated fields, so the property the map has today (a project owner controls no free-text field that reaches the feed) is not spent here.
42
42
 
43
43
  ## 3. Auto-appear: no human stands between a public project and the map
44
44
 
45
- **Decision (the Archon's).** A self-hosted project reporting `public` appears on the map with **no human act**. `featured` keeps the only job [ADR 0182](<redacted>.md) D3 left it — ranking among rows already there — and curation stays editorial.
45
+ **Decision (the Archon's).** A self-hosted project reporting `public` appears on the map with **no human act**. `featured` keeps the only job [ADR 0182](0182-project-visibility-two-axes.md) D3 left it — ranking among rows already there — and curation stays editorial.
46
46
 
47
47
  The alternative (a one-time admission, or ongoing curation) was offered and declined. What was declined with it is the friction ADR 0182 D3 had already removed once: an owner setting their project public and seeing nothing happen until someone else acted.
48
48
 
49
- **This decision is conditional, and the condition is §5.** Auto-appear is only defensible because retraction ships beside it; [ADR 0047](<redacted>.md) is explicit that the straight-through path and the abuse guard are the *same* task, and this ADR treats that as binding rather than advisory.
49
+ **This decision is conditional, and the condition is §5.** Auto-appear is only defensible because retraction ships beside it; [ADR 0047](0047-discord-bugs-intake-anti-abuse.md) is explicit that the straight-through path and the abuse guard are the *same* task, and this ADR treats that as binding rather than advisory.
50
50
 
51
51
  ## 4. Trust follows provenance — the asymmetry is in the guards, not in a gate
52
52
 
@@ -59,18 +59,18 @@ The alternative (a one-time admission, or ongoing curation) was offered and decl
59
59
  | status of the value | authoritative | a **cached claim, with a recency stamp** |
60
60
  | may move | its own row | its own row, and only its own row |
61
61
 
62
- Stated once, so it is not re-litigated: **an instance is authoritative about its own door and about nothing else.** That is [ADR 0016](<redacted>.md) and [ADR 0141](<redacted>.md)'s line held in a new place — identity and self-description federate, authority does not.
62
+ Stated once, so it is not re-litigated: **an instance is authoritative about its own door and about nothing else.** That is [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) and [ADR 0141](<redacted>.md)'s line held in a new place — identity and self-description federate, authority does not.
63
63
 
64
64
  ### Absent is a third state, and it must not purge
65
65
 
66
- [ADR 0182](<redacted>.md) D5 says the absent-report default is fail-closed: unreported ⇒ dark matter. That stands, **scoped to a self-hosted row that has never once answered** — such a project is off the map rather than exposed by omission.
66
+ [ADR 0182](0182-project-visibility-two-axes.md) D5 says the absent-report default is fail-closed: unreported ⇒ dark matter. That stands, **scoped to a self-hosted row that has never once answered** — such a project is off the map rather than exposed by omission.
67
67
 
68
- It must never be evaluated against control-plane rows, and it must never be read as "answered before, silent now." [ADR 0247](<redacted>.md) D4 found the live shape of this trap: at the time of writing, *every* catalog row carried `description: null`, so a naive fail-closed enforcement wired that day would have refused every join on the platform at once. The same hazard applies here.
68
+ It must never be evaluated against control-plane rows, and it must never be read as "answered before, silent now." [ADR 0247](0247-the-join-door-is-one-composed-answer-and-dark-matter-has-no-live-verdict-yet.md) D4 found the live shape of this trap: at the time of writing, *every* catalog row carried `description: null`, so a naive fail-closed enforcement wired that day would have refused every join on the platform at once. The same hazard applies here.
69
69
 
70
70
  So the tri-state is explicit — `null` (never read) ≠ `false` (read, and negative) ≠ `true`:
71
71
 
72
72
  - **never successfully read** → dark matter (D5's rule, doing its job)
73
- - **read before, unreachable now** → **keep the last known state, stamped with its recency.** A project does not leave the map because its server was down for a sweep. [ADR 0199](<redacted>.md): liveness is an overlay, never a lifecycle state. [ADR 0226](<redacted>.md): reporting may degrade where enforcement must refuse — and this is reporting.
73
+ - **read before, unreachable now** → **keep the last known state, stamped with its recency.** A project does not leave the map because its server was down for a sweep. [ADR 0199](0199-restart-an-unreachable-active-project.md): liveness is an overlay, never a lifecycle state. [ADR 0226](0226-one-stale-timer-reporting-degrades-enforcement-refuses.md): reporting may degrade where enforcement must refuse — and this is reporting.
74
74
  - **read, and narrower than before** → applied immediately and unconditionally. A report that *reduces* exposure needs no trust at all: the worst a lying instance achieves is hiding itself.
75
75
 
76
76
  That last line is the shape of the whole trust model. **Narrowing is free; widening is what costs.**
@@ -81,9 +81,9 @@ That last line is the shape of the whole trust model. **Narrowing is free; widen
81
81
 
82
82
  Under control-plane provisioning that was survivable, because the set of rows was bounded by who the operator had provisioned. Auto-appear replaces that bound with *whoever points a domain at us*, and a one-way door onto a public surface is not a door. So R08 ships, in the same task:
83
83
 
84
- 1. **`PATCH /projects/:id/status`** — `active|hidden`, `project.curate` floor (metic, per [ADR 0157](<redacted>.md)), audited.
84
+ 1. **`PATCH /projects/:id/status`** — `active|hidden`, `project.curate` floor (metic, per [ADR 0157](0157-archon-is-rank-and-identity-only.md)), audited.
85
85
  2. **`hidden` is STICKY against the pull.** A retracted project that keeps reporting `public` **stays hidden**. This is the single most important line in this ADR: without it the next sweep silently undoes every takedown, and the lever is decorative. Retraction is a hub decision about the hub's own surface, and the pull may not overwrite it — the pull moves `visibility`, never `status`. The two columns answer different questions and this is where that separation earns its keep.
86
- 3. **A per-IP read limit on the public feed** (the [ADR 0209](<redacted>.md) precedent). `GET /projects/featured` is unauthenticated, CORS-open and currently unmetered, and each cold sweep can drive up to 500 rows × 4 outbound fetches.
86
+ 3. **A per-IP read limit on the public feed** (the [ADR 0209](0209-one-budget-for-the-account-existence-oracle.md) precedent). `GET /projects/featured` is unauthenticated, CORS-open and currently unmetered, and each cold sweep can drive up to 500 rows × 4 outbound fetches.
87
87
 
88
88
  ### One gap this decision widens, named rather than left
89
89
 
@@ -97,13 +97,13 @@ The corpus already has the right rule and applies it one field over: `shipUrlWit
97
97
  - **The hub reaches out to more origins.** The fan-out ceiling is unchanged (500 rows, TTL + negative caches), but the *population* is no longer bounded by provisioning. The feed read limit exists for this.
98
98
  - **Two populations, one column, different provenance** — readers of `platform_identity_projects.visibility` cannot assume how it got there. The recency stamp is what tells them.
99
99
  - **A self-hosted instance that never upgrades never appears.** It already serves `branding.project.visibility`, so in practice this is only the very old.
100
- - **Nothing here federates a self-hosted instance.** It holds no credential, mints no assertion, writes no membership, and reports no analytics. The later analytics feed R02 was asked to anticipate is deliberately *not* decided here: it carries per-person data, which is exactly what [ADR 0205](<redacted>.md) proved cannot ride an unwitnessed self-report. It needs the ADR 0144 credential work first, and it is a separate decision.
100
+ - **Nothing here federates a self-hosted instance.** It holds no credential, mints no assertion, writes no membership, and reports no analytics. The later analytics feed R02 was asked to anticipate is deliberately *not* decided here: it carries per-person data, which is exactly what [ADR 0205](0205-federated-checkin-needs-the-hubs-own-signin-witness.md) proved cannot ride an unwitnessed self-report. It needs the ADR 0144 credential work first, and it is a separate decision.
101
101
 
102
102
  ## 7. Rejected
103
103
 
104
- - **A pushed report authenticated by a client credential.** The literal reading of R08. Rejected: self-hosted instances hold no credential, and minting them is the exact move [ADR 0144](<redacted>.md) and [ADR 0145](<redacted>.md) say must not happen yet. It would also have owed replay protection, a rate budget and a wire-compatible field — three problems the pull does not have.
105
- - **`PATCH /projects/:id/visibility` on the hub.** Already rejected by [ADR 0238](<redacted>.md) for making the hub authorize a door change; restated here because a pull could be mistaken for a licence to add one.
104
+ - **A pushed report authenticated by a client credential.** The literal reading of R08. Rejected: self-hosted instances hold no credential, and minting them is the exact move [ADR 0144](0144-federated-single-logout-backchannel.md) and [ADR 0145](0145-free-hosted-project-tier-isolation-and-domain-separation.md) say must not happen yet. It would also have owed replay protection, a rate budget and a wire-compatible field — three problems the pull does not have.
105
+ - **`PATCH /projects/:id/visibility` on the hub.** Already rejected by [ADR 0238](0238-the-join-door-is-a-provisioning-settings-policy-key.md) for making the hub authorize a door change; restated here because a pull could be mistaken for a licence to add one.
106
106
  - **A one-time admission, and ongoing curation.** Both offered to the Archon; both declined in favour of auto-appear (§3).
107
107
  - **Trusting the pull to move `status`.** The retraction lever would be decorative (§5.2).
108
- - **Enforcing "unreported ⇒ dark matter" across all rows.** [ADR 0247](<redacted>.md) D4's live finding: it empties the map (§4).
108
+ - **Enforcing "unreported ⇒ dark matter" across all rows.** [ADR 0247](0247-the-join-door-is-one-composed-answer-and-dark-matter-has-no-live-verdict-yet.md) D4's live finding: it empties the map (§4).
109
109
  - **Letting the pull carry name, tagline or art.** Today no project owner controls a free-text field that reaches the feed. That is a property worth keeping, and a visibility report is not the place to spend it.
@@ -4,8 +4,8 @@
4
4
  - **Date:** 2026-09-06
5
5
  - **Task:** [task 1002327](https://cloudbongos.com/builders#/task/1002327) (BONGOS-V1, goal 1000046 — *Project creation*, criterion `proj-visibility-states` / C1), BV1.R08 — the build
6
6
  - **Deciders:** Claude, building R08 against ADR 0252's design
7
- - **Amends:** [ADR 0252](<redacted>.md) §4 and §5 — three premises that did not survive contact with the tree. The decisions ADR 0252 took are unchanged; what changes is what has to be built to make them true.
8
- - **Related:** [ADR 0246](<redacted>.md) (the control-plane projection, and the writer §5 missed) · [ADR 0247](<redacted>.md) D4 (the fail-closed trap, found live one column over) · [ADR 0182](<redacted>.md) D5 (dark matter) · [ADR 0083](<redacted>.md) (the one-way import rule that forces §2's shape) · [ADR 0209](<redacted>.md) (the limiter precedent) · [ADR 0199](<redacted>.md) / [ADR 0226](<redacted>.md) (reporting degrades; enforcement refuses)
7
+ - **Amends:** [ADR 0252](0252-the-self-hosted-visibility-report-is-a-pull-and-auto-appear-buys-a-retraction-lever.md) §4 and §5 — three premises that did not survive contact with the tree. The decisions ADR 0252 took are unchanged; what changes is what has to be built to make them true.
8
+ - **Related:** [ADR 0246](0246-catalog-membership-is-a-projection-not-a-federation-side-effect.md) (the control-plane projection, and the writer §5 missed) · [ADR 0247](0247-the-join-door-is-one-composed-answer-and-dark-matter-has-no-live-verdict-yet.md) D4 (the fail-closed trap, found live one column over) · [ADR 0182](0182-project-visibility-two-axes.md) D5 (dark matter) · [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the one-way import rule that forces §2's shape) · [ADR 0209](0209-one-budget-for-the-account-existence-oracle.md) (the limiter precedent) · [ADR 0199](0199-restart-an-unreachable-active-project.md) / [ADR 0226](0226-one-stale-timer-reporting-degrades-enforcement-refuses.md) (reporting degrades; enforcement refuses)
9
9
 
10
10
  ---
11
11