@bongos/core 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1142) hide show
  1. package/.bongos-core.json +5727 -0
  2. package/.claude/skills/blocker-review/SKILL.md +91 -0
  3. package/.claude/skills/blocker-solve/SKILL.md +96 -0
  4. package/.claude/skills/builder-backup/SKILL.md +54 -0
  5. package/.claude/skills/builder-box/SKILL.md +45 -0
  6. package/.claude/skills/builder-claim/SKILL.md +76 -0
  7. package/.claude/skills/builder-connect/SKILL.md +59 -0
  8. package/.claude/skills/builder-cost/SKILL.md +47 -0
  9. package/.claude/skills/builder-end/SKILL.md +81 -0
  10. package/.claude/skills/builder-exit/SKILL.md +88 -0
  11. package/.claude/skills/builder-key/SKILL.md +40 -0
  12. package/.claude/skills/builder-reauth/SKILL.md +50 -0
  13. package/.claude/skills/builder-redteam/SKILL.md +109 -0
  14. package/.claude/skills/builder-release/SKILL.md +41 -0
  15. package/.claude/skills/builder-setup/SKILL.md +62 -0
  16. package/.claude/skills/builder-ship/SKILL.md +79 -0
  17. package/.claude/skills/builder-stage/SKILL.md +51 -0
  18. package/.claude/skills/builder-start/SKILL.md +46 -0
  19. package/.claude/skills/close-box/SKILL.md +43 -0
  20. package/.claude/skills/design-sync/SKILL.md +69 -0
  21. package/.claude/skills/dev/SKILL.md +49 -0
  22. package/.claude/skills/feedback/SKILL.md +32 -0
  23. package/.claude/skills/figma-design-sync/SKILL.md +74 -0
  24. package/.claude/skills/goal-review/SKILL.md +89 -0
  25. package/.claude/skills/idea-triage/SKILL.md +144 -0
  26. package/.claude/skills/ideate/SKILL.md +82 -0
  27. package/.claude/skills/merge-mode/SKILL.md +169 -0
  28. package/.claude/skills/new-project/SKILL.md +108 -0
  29. package/.claude/skills/otb-character-review/SKILL.md +71 -0
  30. package/.claude/skills/otb-design-review/SKILL.md +47 -0
  31. package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
  32. package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
  33. package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
  34. package/.claude/skills/paint/SKILL.md +70 -0
  35. package/.claude/skills/planning-session/SKILL.md +299 -0
  36. package/.claude/skills/priority-session/SKILL.md +134 -0
  37. package/.claude/skills/read-session-export/SKILL.md +58 -0
  38. package/.claude/skills/recall/SKILL.md +52 -0
  39. package/.claude/skills/session-handoff/SKILL.md +46 -0
  40. package/.claude/skills/status/SKILL.md +33 -0
  41. package/.devcontainer/Dockerfile +69 -0
  42. package/.devcontainer/README.md +73 -0
  43. package/.devcontainer/devcontainer-lock.json +19 -0
  44. package/.devcontainer/devcontainer.json +93 -0
  45. package/.devcontainer/healthcheck.sh +84 -0
  46. package/.devcontainer/init-firewall.sh +198 -0
  47. package/.devcontainer/post-create.sh +153 -0
  48. package/.dockerignore +36 -0
  49. package/.env.local.example +32 -0
  50. package/.gitattributes +83 -0
  51. package/.gitignore +91 -0
  52. package/CLAUDE.md +242 -0
  53. package/CODE_OF_CONDUCT.md +46 -0
  54. package/CONTRIBUTING.md +51 -0
  55. package/Dockerfile +46 -0
  56. package/GOVERNANCE.md +44 -0
  57. package/LICENSE +661 -0
  58. package/README.md +88 -0
  59. package/bin/bongos.js +222 -0
  60. package/clients/bongos-client/README.md +48 -0
  61. package/clients/bongos-client/bongos-client.global.js +617 -0
  62. package/clients/bongos-client/examples/hello-world.mjs +62 -0
  63. package/clients/bongos-client/index.cjs +619 -0
  64. package/clients/bongos-client/index.d.ts +793 -0
  65. package/clients/bongos-client/index.mjs +614 -0
  66. package/clients/bongos-client/package.json +32 -0
  67. package/config/branding.neutral.json +60 -0
  68. package/config/design-tokens.neutral.json +51 -0
  69. package/config/design-tokens.schema.json +96 -0
  70. package/config/modules.neutral.json +9 -0
  71. package/docker-compose.yml +52 -0
  72. package/docker-entrypoint.sh +30 -0
  73. package/docs/adr/0001-stack-choice-single-vps.md +45 -0
  74. package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
  75. package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
  76. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
  77. package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
  78. package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
  79. package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
  80. package/docs/adr/0008-family-based-tile-generation.md +86 -0
  81. package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
  82. package/docs/adr/0009-autotile-architecture.md +181 -0
  83. package/docs/adr/0010-pms-architecture.md +70 -0
  84. package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
  85. package/docs/adr/0012-ground-object-cell-split.md +208 -0
  86. package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
  87. package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
  88. package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
  89. package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
  90. package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
  91. package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
  92. package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
  93. package/docs/adr/0020-security-model-public-stub.md +70 -0
  94. package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
  95. package/docs/adr/0022-secrets-policy.md +124 -0
  96. package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
  97. package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
  98. package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
  99. package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
  100. package/docs/adr/0025-structured-criterion-task-link.md +44 -0
  101. package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
  102. package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
  103. package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
  104. package/docs/adr/0029-status-page-outage-resilience.md +59 -0
  105. package/docs/adr/0030-builders-hall-live-updates.md +59 -0
  106. package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
  107. package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
  108. package/docs/adr/0033-discord-bot-service-principal.md +82 -0
  109. package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
  110. package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
  111. package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
  112. package/docs/adr/0037-discord-channel-management.md +51 -0
  113. package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
  114. package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
  115. package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
  116. package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
  117. package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
  118. package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
  119. package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
  120. package/docs/adr/0044-per-box-live-game-preview.md +57 -0
  121. package/docs/adr/0045-devbox-desktop-app.md +133 -0
  122. package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
  123. package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
  124. package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
  125. package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
  126. package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
  127. package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
  128. package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
  129. package/docs/adr/0053-scoped-dev-box-session.md +55 -0
  130. package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
  131. package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
  132. package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
  133. package/docs/adr/0057-container-cost-ledger.md +28 -0
  134. package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
  135. package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
  136. package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
  137. package/docs/adr/0060-gds-retrieval-layer.md +97 -0
  138. package/docs/adr/0061-context-layer-decomposition.md +61 -0
  139. package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
  140. package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
  141. package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
  142. package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
  143. package/docs/adr/0066-generated-file-map-sections.md +51 -0
  144. package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
  145. package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
  146. package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
  147. package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
  148. package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
  149. package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
  150. package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
  151. package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
  152. package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
  153. package/docs/adr/0074-memory-map-stays-light.md +32 -0
  154. package/docs/adr/0075-per-system-cost-attribution.md +37 -0
  155. package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
  156. package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
  157. package/docs/adr/0078-deterministic-first-cron.md +48 -0
  158. package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
  159. package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
  160. package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
  161. package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
  162. package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
  163. package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
  164. package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
  165. package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
  166. package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
  167. package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
  168. package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
  169. package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
  170. package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
  171. package/docs/adr/0090-metic-task-authoring.md +73 -0
  172. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
  173. package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
  174. package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
  175. package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
  176. package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
  177. package/docs/adr/0095-cross-agent-context-management.md +58 -0
  178. package/docs/adr/0096-require-reward-before-workable.md +209 -0
  179. package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
  180. package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
  181. package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
  182. package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
  183. package/docs/adr/0100-two-repo-instance-model.md +60 -0
  184. package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
  185. package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
  186. package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
  187. package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
  188. package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
  189. package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
  190. package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
  191. package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
  192. package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
  193. package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
  194. package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
  195. package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
  196. package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
  197. package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
  198. package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
  199. package/docs/adr/0115-scheduled-routines-portability.md +31 -0
  200. package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
  201. package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
  202. package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
  203. package/docs/adr/0119-api-pagination-contract.md +34 -0
  204. package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
  205. package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
  206. package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
  207. package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
  208. package/docs/adr/0124-typed-api-response-bodies.md +37 -0
  209. package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
  210. package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
  211. package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
  212. package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
  213. package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
  214. package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
  215. package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
  216. package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
  217. package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
  218. package/docs/adr/0134-private-first-npm-distribution.md +38 -0
  219. package/docs/adr/README.md +208 -0
  220. package/docs/api/openapi.json +13720 -0
  221. package/docs/api-reference.md +437 -0
  222. package/docs/architecture.md +244 -0
  223. package/docs/branding-contract.md +66 -0
  224. package/docs/branding-fill-prompt.md +25 -0
  225. package/docs/canonical-permissions.md +241 -0
  226. package/docs/design/container-exterior-tiles.md +49 -0
  227. package/docs/design/container-exterior.md +81 -0
  228. package/docs/design/container-interior.md +77 -0
  229. package/docs/design/modular-architecture/00-research-report.md +107 -0
  230. package/docs/design/modular-architecture/01-architecture.md +125 -0
  231. package/docs/design/modular-architecture/02-module-map.md +116 -0
  232. package/docs/design/modular-architecture/03-builder-flows.md +104 -0
  233. package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
  234. package/docs/design/modular-architecture/README.md +27 -0
  235. package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
  236. package/docs/design/world-map-scroll.md +41 -0
  237. package/docs/design-contract.md +320 -0
  238. package/docs/file-map.md +418 -0
  239. package/docs/handoff-template.md +92 -0
  240. package/docs/modules-contract.md +293 -0
  241. package/docs/onboarding/browser-terminal-guide.md +73 -0
  242. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
  243. package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
  244. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
  245. package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
  246. package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
  247. package/docs/onboarding/diagrams/README.md +94 -0
  248. package/docs/onboarding/diagrams/assertions.json +170 -0
  249. package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
  250. package/docs/onboarding/diagrams/render-config.json +9 -0
  251. package/docs/onboarding/drachmae-and-karma.md +178 -0
  252. package/docs/onboarding/primer.md +202 -0
  253. package/docs/project-context.template.md +67 -0
  254. package/docs/recipes/README.md +35 -0
  255. package/docs/recipes/audit-replay.md +100 -0
  256. package/docs/recipes/bongos-cli-release.md +66 -0
  257. package/docs/recipes/builder-box-lifecycle.md +152 -0
  258. package/docs/recipes/claude-design-loop.md +143 -0
  259. package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
  260. package/docs/recipes/cloudbongos-staging-gate.md +139 -0
  261. package/docs/recipes/cloudbongos-standup.md +111 -0
  262. package/docs/recipes/devbox-app-release.md +93 -0
  263. package/docs/recipes/devbox-app-windows-test.md +128 -0
  264. package/docs/recipes/failed-ship-recovery-proof.md +102 -0
  265. package/docs/recipes/figma-design-loop.md +129 -0
  266. package/docs/recipes/gds-db-backup.md +255 -0
  267. package/docs/recipes/instance-deploy.md +37 -0
  268. package/docs/recipes/managed-settings-remote-control.md +416 -0
  269. package/docs/recipes/memory-backup.md +71 -0
  270. package/docs/recipes/memory-sync-conflicts.md +98 -0
  271. package/docs/recipes/multi-builder-merge.md +78 -0
  272. package/docs/recipes/ops-gotchas.md +212 -0
  273. package/docs/recipes/overnight-builder.md +53 -0
  274. package/docs/recipes/packaging-the-core.md +49 -0
  275. package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
  276. package/docs/recipes/parallel-load-test.md +32 -0
  277. package/docs/recipes/pixel-art-pipeline.md +411 -0
  278. package/docs/recipes/private-npm-distribution.md +79 -0
  279. package/docs/recipes/search-index-ingestion.md +67 -0
  280. package/docs/recipes/self-host.md +60 -0
  281. package/docs/recipes/ship-and-regrade.md +72 -0
  282. package/docs/recipes/staging-data.md +50 -0
  283. package/docs/recipes/staging-environment.md +215 -0
  284. package/docs/recipes/upgrading-the-core.md +58 -0
  285. package/docs/research/cursor-competitive-analysis.md +255 -0
  286. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
  287. package/migrations/003_pms.sql +284 -0
  288. package/migrations/004_pms_cost_idempotency.sql +13 -0
  289. package/migrations/005_pms_smoke_filter.sql +44 -0
  290. package/migrations/006_pms_v2.sql +378 -0
  291. package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
  292. package/migrations/008_pms_v2_migration_allocator.sql +27 -0
  293. package/migrations/009_pms_v2_blockers_table.sql +68 -0
  294. package/migrations/010_uptime.sql +29 -0
  295. package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
  296. package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
  297. package/migrations/013_claim_locking.sql +22 -0
  298. package/migrations/014_pms_task_discipline.sql +86 -0
  299. package/migrations/015_pms_estimation_calibration.sql +140 -0
  300. package/migrations/016_pms_task_grades.sql +60 -0
  301. package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
  302. package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
  303. package/migrations/020_task_dependencies.sql +99 -0
  304. package/migrations/021_v3_renumber_and_deps.sql +224 -0
  305. package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
  306. package/migrations/023_pms_rank.sql +30 -0
  307. package/migrations/025_builder_exit_status.sql +15 -0
  308. package/migrations/027_builders_preferred_disciplines.sql +46 -0
  309. package/migrations/028_tasks_parallel_safe.sql +71 -0
  310. package/migrations/029_rank_three_live.sql +32 -0
  311. package/migrations/030_vulnerability_reports.sql +61 -0
  312. package/migrations/031_reward_simplification.sql +57 -0
  313. package/migrations/032_repo_health_snapshots.sql +56 -0
  314. package/migrations/033_audit_log.sql +64 -0
  315. package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
  316. package/migrations/035_auth_token_hygiene.sql +66 -0
  317. package/migrations/037_builder_skill_model_prefs.sql +44 -0
  318. package/migrations/038_task_override_requests.sql +51 -0
  319. package/migrations/039_newcomer_friendly_column.sql +124 -0
  320. package/migrations/040_builder_karma.sql +58 -0
  321. package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
  322. package/migrations/042_criterion_proposal_workflow.sql +78 -0
  323. package/migrations/043_builder_onboarding_observability.sql +66 -0
  324. package/migrations/044_tasks_requires_rank.sql +97 -0
  325. package/migrations/045_builder_onboarding_state.sql +147 -0
  326. package/migrations/046_cost_log_builder_attribution.sql +42 -0
  327. package/migrations/054_builder_memory.sql +108 -0
  328. package/migrations/055_task_criteria.sql +90 -0
  329. package/migrations/058_peer_votes.sql +41 -0
  330. package/migrations/059_onboarding_pick_disciplines.sql +59 -0
  331. package/migrations/060_access_requests.sql +46 -0
  332. package/migrations/061_backfill_override_ship_attribution.sql +29 -0
  333. package/migrations/062_session_records.sql +34 -0
  334. package/migrations/063_session_records_tool_errors_idx.sql +11 -0
  335. package/migrations/064_grade_attempts.sql +18 -0
  336. package/migrations/065_bfg_principal.sql +58 -0
  337. package/migrations/066_live_notify_triggers.sql +69 -0
  338. package/migrations/067_builder_boxes.sql +117 -0
  339. package/migrations/067_discord_bot_foundation.sql +69 -0
  340. package/migrations/068_thetes_requires_rank.sql +27 -0
  341. package/migrations/069_builder_ssh_keys.sql +66 -0
  342. package/migrations/070_box_intents.sql +101 -0
  343. package/migrations/071_box_first_provision_approval.sql +46 -0
  344. package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
  345. package/migrations/073_box_terminal_access.sql +46 -0
  346. package/migrations/075_builder_sound_prefs.sql +28 -0
  347. package/migrations/078_box_claude_active.sql +22 -0
  348. package/migrations/079_box_first_connected_at.sql +20 -0
  349. package/migrations/081_tasks_needs_migration.sql +34 -0
  350. package/migrations/084_tasks_security_sensitive.sql +24 -0
  351. package/migrations/085_security_engagement_docs.sql +34 -0
  352. package/migrations/086_rename_disciplines.sql +125 -0
  353. package/migrations/088_builders_anthropic_link.sql +28 -0
  354. package/migrations/089_builders_monthly_budget.sql +19 -0
  355. package/migrations/090_box_scoped_sessions.sql +38 -0
  356. package/migrations/091_session_token_reward.sql +44 -0
  357. package/migrations/093_tasks_sandbox_review.sql +22 -0
  358. package/migrations/102_remove_box_first_provision_approval.sql +58 -0
  359. package/migrations/103_search_chunks.sql +90 -0
  360. package/migrations/104_builder_box_blocked.sql +34 -0
  361. package/migrations/105_box_host_keys.sql +35 -0
  362. package/migrations/111_medusa_customer0_framing.sql +35 -0
  363. package/migrations/112_drop_track_check.sql +25 -0
  364. package/migrations/113_merge_lease.sql +16 -0
  365. package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
  366. package/migrations/118_currency_label_decoupling.sql +23 -0
  367. package/migrations/119_builder_behavior_prefs.sql +31 -0
  368. package/migrations/121_box_code_version.sql +37 -0
  369. package/migrations/122_builder_gemini_key.sql +30 -0
  370. package/migrations/123_cost_log_tiers.sql +33 -0
  371. package/migrations/124_cost_baseline.sql +45 -0
  372. package/migrations/125_llm_cache.sql +54 -0
  373. package/migrations/126_autonomy_runs.sql +33 -0
  374. package/migrations/143_cost_calibration.sql +63 -0
  375. package/migrations/145_backfill_task_requires_rank.sql +84 -0
  376. package/migrations/160_goal_tier.sql +88 -0
  377. package/migrations/163_polymorphic_dependencies.sql +187 -0
  378. package/migrations/164_event_sound_prefs.sql +20 -0
  379. package/migrations/165_task_module_key.sql +15 -0
  380. package/migrations/171_claims_published_head_sha.sql +24 -0
  381. package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
  382. package/migrations/175_task_grades_diff_hash.sql +9 -0
  383. package/migrations/176_promotion_respects_open_blockers.sql +58 -0
  384. package/migrations/176_ui_discipline.sql +40 -0
  385. package/migrations/177_require_reward_before_workable.sql +76 -0
  386. package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
  387. package/migrations/179_search_chunk_usefulness.sql +33 -0
  388. package/migrations/180_one_active_claim_per_session.sql +54 -0
  389. package/migrations/181_cost_log_skill_name.sql +33 -0
  390. package/migrations/184_claim_release_requested.sql +25 -0
  391. package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
  392. package/migrations/187_goal_sort_order.sql +30 -0
  393. package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
  394. package/migrations/README.md +88 -0
  395. package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
  396. package/migrations/core_189_core_upgrades_ledger.sql +37 -0
  397. package/migrations/core_189_credit_log_task_id_index.sql +19 -0
  398. package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
  399. package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
  400. package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
  401. package/migrations/instance/110_medusa_planning_seed.sql +70 -0
  402. package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
  403. package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
  404. package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
  405. package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
  406. package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
  407. package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
  408. package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
  409. package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
  410. package/modules/autonomy/CLAUDE.md +49 -0
  411. package/modules/autonomy/db.js +50 -0
  412. package/modules/autonomy/module.json +13 -0
  413. package/modules/autonomy/pollers/routine-timers.js +146 -0
  414. package/modules/autonomy/routes/autonomy.js +37 -0
  415. package/modules/builder-settings/CLAUDE.md +58 -0
  416. package/modules/builder-settings/builder-needs.js +115 -0
  417. package/modules/builder-settings/db.js +168 -0
  418. package/modules/builder-settings/display-name.js +84 -0
  419. package/modules/builder-settings/event-sound-prefs.js +169 -0
  420. package/modules/builder-settings/interaction-prefs.js +201 -0
  421. package/modules/builder-settings/model-alloc-prefs.js +147 -0
  422. package/modules/builder-settings/module.json +10 -0
  423. package/modules/builder-settings/render-prefs.js +103 -0
  424. package/modules/builder-settings/routes/settings.js +417 -0
  425. package/modules/builder-settings/settings.js +52 -0
  426. package/modules/builder-settings/skill-prefs.js +196 -0
  427. package/modules/builder-settings/sound-prefs.js +178 -0
  428. package/modules/builder-settings/wandering-prefs.js +282 -0
  429. package/modules/dev-box/CLAUDE.md +38 -0
  430. package/modules/dev-box/box-access.js +275 -0
  431. package/modules/dev-box/box-credential.js +94 -0
  432. package/modules/dev-box/box-onboard.js +486 -0
  433. package/modules/dev-box/boxes.js +842 -0
  434. package/modules/dev-box/db.js +39 -0
  435. package/modules/dev-box/module.json +14 -0
  436. package/modules/dev-box/routes/box.js +977 -0
  437. package/modules/discord/CLAUDE.md +50 -0
  438. package/modules/discord/auth.js +54 -0
  439. package/modules/discord/bug-attachments.js +210 -0
  440. package/modules/discord/db.js +96 -0
  441. package/modules/discord/discord-approvals.js +145 -0
  442. package/modules/discord/discord-audit.js +29 -0
  443. package/modules/discord/discord-bot.js +545 -0
  444. package/modules/discord/discord-bugs.js +257 -0
  445. package/modules/discord/discord-channels.js +412 -0
  446. package/modules/discord/discord-inbound.js +147 -0
  447. package/modules/discord/discord-message-buffer.js +54 -0
  448. package/modules/discord/discord-reaction.js +186 -0
  449. package/modules/discord/discord-role-sync.js +318 -0
  450. package/modules/discord/module.json +14 -0
  451. package/modules/discord/pollers/discord-bot.js +19 -0
  452. package/modules/discord/routes/bug-attachments.js +44 -0
  453. package/modules/discord/routes/discord.js +102 -0
  454. package/modules/discord/ship-broadcast.js +78 -0
  455. package/modules/discord/webhook.js +74 -0
  456. package/modules/economy/CLAUDE.md +48 -0
  457. package/modules/economy/achievements.js +594 -0
  458. package/modules/economy/cost-classify.js +331 -0
  459. package/modules/economy/cost-summary-shape.js +90 -0
  460. package/modules/economy/cost.js +438 -0
  461. package/modules/economy/credits.js +430 -0
  462. package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
  463. package/modules/economy/module.json +10 -0
  464. package/modules/economy/reward.js +61 -0
  465. package/modules/economy/routes/cost.js +97 -0
  466. package/modules/economy/routes/leaderboard.js +26 -0
  467. package/modules/economy/routes/reward.js +42 -0
  468. package/modules/economy/streak.js +285 -0
  469. package/modules/grading/CLAUDE.md +42 -0
  470. package/modules/grading/db.js +39 -0
  471. package/modules/grading/grader-rubric.json +151 -0
  472. package/modules/grading/grader-workers/efficiency.js +213 -0
  473. package/modules/grading/grader-workers/extract-json.js +80 -0
  474. package/modules/grading/grader-workers/fence.js +100 -0
  475. package/modules/grading/grader-workers/hacker.js +239 -0
  476. package/modules/grading/grader-workers/index.js +183 -0
  477. package/modules/grading/grader-workers/narc.js +207 -0
  478. package/modules/grading/grader-workers/quality.js +198 -0
  479. package/modules/grading/grader-workers/rubric.js +20 -0
  480. package/modules/grading/grader-workers/worker-prompt.js +89 -0
  481. package/modules/grading/grader-workers/worker-verdict.js +50 -0
  482. package/modules/grading/grader.js +1790 -0
  483. package/modules/grading/module.json +12 -0
  484. package/modules/grading/routes/grade.js +51 -0
  485. package/modules/hall-ui/CLAUDE.md +61 -0
  486. package/modules/hall-ui/module.json +14 -0
  487. package/modules/hall-ui/public/atlas.html +180 -0
  488. package/modules/hall-ui/public/atlas.js +336 -0
  489. package/modules/hall-ui/public/box-panel.js +423 -0
  490. package/modules/hall-ui/public/brand-apply.js +117 -0
  491. package/modules/hall-ui/public/builders.js +3028 -0
  492. package/modules/hall-ui/public/chime.wav +0 -0
  493. package/modules/hall-ui/public/copy-on-click.js +174 -0
  494. package/modules/hall-ui/public/cursors/arrow.png +0 -0
  495. package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
  496. package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
  497. package/modules/hall-ui/public/cursors/magnifier.png +0 -0
  498. package/modules/hall-ui/public/diagram-viewer.css +125 -0
  499. package/modules/hall-ui/public/diagram-viewer.js +330 -0
  500. package/modules/hall-ui/public/diagrams.html +113 -0
  501. package/modules/hall-ui/public/dom-utils.js +212 -0
  502. package/modules/hall-ui/public/drachmae.html +68 -0
  503. package/modules/hall-ui/public/drachmae.js +136 -0
  504. package/modules/hall-ui/public/gate.html +143 -0
  505. package/modules/hall-ui/public/gate.js +228 -0
  506. package/modules/hall-ui/public/goals-page.js +1297 -0
  507. package/modules/hall-ui/public/goals.html +376 -0
  508. package/modules/hall-ui/public/goals.js +119 -0
  509. package/modules/hall-ui/public/hall-widgets.js +189 -0
  510. package/modules/hall-ui/public/harbor.html +167 -0
  511. package/modules/hall-ui/public/harbor.js +335 -0
  512. package/modules/hall-ui/public/index.html +116 -0
  513. package/modules/hall-ui/public/instances-panel.js +172 -0
  514. package/modules/hall-ui/public/md-reader.js +234 -0
  515. package/modules/hall-ui/public/modules.html +119 -0
  516. package/modules/hall-ui/public/modules.js +154 -0
  517. package/modules/hall-ui/public/new-project-wizard.js +186 -0
  518. package/modules/hall-ui/public/not-ready.html +48 -0
  519. package/modules/hall-ui/public/pair.html +119 -0
  520. package/modules/hall-ui/public/pair.js +132 -0
  521. package/modules/hall-ui/public/primer.css +404 -0
  522. package/modules/hall-ui/public/primer.html +85 -0
  523. package/modules/hall-ui/public/primer.js +641 -0
  524. package/modules/hall-ui/public/profile.html +85 -0
  525. package/modules/hall-ui/public/profile.js +236 -0
  526. package/modules/hall-ui/public/ranks.html +69 -0
  527. package/modules/hall-ui/public/ranks.js +206 -0
  528. package/modules/hall-ui/public/roadmap.html +209 -0
  529. package/modules/hall-ui/public/roadmap.js +375 -0
  530. package/modules/hall-ui/public/sessions.html +92 -0
  531. package/modules/hall-ui/public/sessions.js +222 -0
  532. package/modules/hall-ui/public/settings.html +640 -0
  533. package/modules/hall-ui/public/settings.js +1219 -0
  534. package/modules/hall-ui/public/shell.js +495 -0
  535. package/modules/hall-ui/public/style.css +1748 -0
  536. package/modules/hall-ui/public/task-detail.js +253 -0
  537. package/modules/hall-ui/public/task.html +83 -0
  538. package/modules/hall-ui/public/task.js +326 -0
  539. package/modules/hall-ui/public/watch.html +333 -0
  540. package/modules/hall-ui/public/watch.js +859 -0
  541. package/modules/hall-ui/public/work.html +469 -0
  542. package/modules/hall-ui/public/work.js +1292 -0
  543. package/modules/ideas/CLAUDE.md +37 -0
  544. package/modules/ideas/blockers.js +100 -0
  545. package/modules/ideas/inbox.js +459 -0
  546. package/modules/ideas/module.json +10 -0
  547. package/modules/ideas/routes/blockers.js +120 -0
  548. package/modules/ideas/routes/inbox.js +230 -0
  549. package/modules/lifecycle/CLAUDE.md +63 -0
  550. package/modules/lifecycle/conflict-resolve.js +436 -0
  551. package/modules/lifecycle/db.js +4970 -0
  552. package/modules/lifecycle/done-when.js +355 -0
  553. package/modules/lifecycle/github-push.js +969 -0
  554. package/modules/lifecycle/goal-conflicts.js +133 -0
  555. package/modules/lifecycle/hierarchy.js +104 -0
  556. package/modules/lifecycle/lifecycle.js +58 -0
  557. package/modules/lifecycle/merge-lock.js +261 -0
  558. package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
  559. package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
  560. package/modules/lifecycle/module.json +13 -0
  561. package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
  562. package/modules/lifecycle/publish-reconciler.js +418 -0
  563. package/modules/lifecycle/routes/analytics.js +63 -0
  564. package/modules/lifecycle/routes/claims.js +506 -0
  565. package/modules/lifecycle/routes/dependencies.js +82 -0
  566. package/modules/lifecycle/routes/done-when.js +136 -0
  567. package/modules/lifecycle/routes/gate-approvals.js +197 -0
  568. package/modules/lifecycle/routes/goals.js +1419 -0
  569. package/modules/lifecycle/routes/lifecycle.js +43 -0
  570. package/modules/lifecycle/routes/tasks.js +1703 -0
  571. package/modules/lifecycle/routes/versions.js +128 -0
  572. package/modules/lifecycle/ship-card.js +505 -0
  573. package/modules/lifecycle/ship-preflight.js +225 -0
  574. package/modules/lifecycle/task-classifier.js +512 -0
  575. package/modules/lifecycle/version-close.js +106 -0
  576. package/modules/memory/CLAUDE.md +40 -0
  577. package/modules/memory/learnings.js +275 -0
  578. package/modules/memory/memory.js +572 -0
  579. package/modules/memory/module.json +12 -0
  580. package/modules/memory/routes/learnings.js +90 -0
  581. package/modules/memory/routes/memory.js +916 -0
  582. package/modules/memory/routes/search.js +188 -0
  583. package/modules/memory/search-chunker.js +252 -0
  584. package/modules/memory/search.js +320 -0
  585. package/modules/onboarding/CLAUDE.md +55 -0
  586. package/modules/onboarding/approval-broadcast.js +59 -0
  587. package/modules/onboarding/db.js +54 -0
  588. package/modules/onboarding/module.json +10 -0
  589. package/modules/onboarding/newcomer-restock.js +212 -0
  590. package/modules/onboarding/onboarding-state.js +532 -0
  591. package/modules/onboarding/onboarding.js +508 -0
  592. package/modules/onboarding/port.js +63 -0
  593. package/modules/onboarding/routes/access-requests.js +208 -0
  594. package/modules/onboarding/routes/onboarding.js +54 -0
  595. package/modules/security/CLAUDE.md +44 -0
  596. package/modules/security/module.json +10 -0
  597. package/modules/security/routes/reports.js +251 -0
  598. package/modules/security/secret-scrub.js +201 -0
  599. package/modules/security/security.js +294 -0
  600. package/modules/sessions/CLAUDE.md +39 -0
  601. package/modules/sessions/bfg.js +357 -0
  602. package/modules/sessions/db.js +326 -0
  603. package/modules/sessions/module.json +10 -0
  604. package/modules/sessions/pulse.js +149 -0
  605. package/modules/sessions/routes/sessions.js +331 -0
  606. package/modules/status-ui/CLAUDE.md +47 -0
  607. package/modules/status-ui/module.json +14 -0
  608. package/modules/status-ui/public/README.md +29 -0
  609. package/modules/status-ui/public/cursors/arrow.png +0 -0
  610. package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
  611. package/modules/status-ui/public/index.html +363 -0
  612. package/modules/status-ui/public/snapshots/.gitkeep +0 -0
  613. package/modules/status-ui/public/status.js +1375 -0
  614. package/modules/status-ui/public/style.css +1342 -0
  615. package/package-lock.json +975 -0
  616. package/package.json +28 -0
  617. package/public-docs/index.html +35 -0
  618. package/public-docs/redoc.standalone.js +1838 -0
  619. package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
  620. package/public-landing/buddha.png +0 -0
  621. package/public-landing/create.html +868 -0
  622. package/public-landing/index.html +168 -0
  623. package/scripts/bongos-mcp.js +28 -0
  624. package/scripts/cron/style_guide_audit.sh +134 -0
  625. package/scripts/discord/README.md +52 -0
  626. package/scripts/discord/lib.js +80 -0
  627. package/scripts/discord/post.js +51 -0
  628. package/scripts/gds/CLAUDE.md +144 -0
  629. package/scripts/gds/abandon.js +58 -0
  630. package/scripts/gds/adopt-detect.js +123 -0
  631. package/scripts/gds/adopt-import.js +111 -0
  632. package/scripts/gds/adopt-preflight.js +121 -0
  633. package/scripts/gds/api.js +78 -0
  634. package/scripts/gds/architect-audit.js +288 -0
  635. package/scripts/gds/art-stage.js +152 -0
  636. package/scripts/gds/audit-authorship.sh +243 -0
  637. package/scripts/gds/audit-deps.js +121 -0
  638. package/scripts/gds/audit-exports.js +128 -0
  639. package/scripts/gds/audit-replay.sh +161 -0
  640. package/scripts/gds/audit-ships.js +251 -0
  641. package/scripts/gds/autonomy-gate.js +135 -0
  642. package/scripts/gds/backfill-cost.js +165 -0
  643. package/scripts/gds/backfill-sessions.js +351 -0
  644. package/scripts/gds/backfill-task-rewards.js +408 -0
  645. package/scripts/gds/backup.js +94 -0
  646. package/scripts/gds/bfg-principal-token.js +65 -0
  647. package/scripts/gds/box-auth-check.js +160 -0
  648. package/scripts/gds/box-connect-lib.js +453 -0
  649. package/scripts/gds/box.js +1258 -0
  650. package/scripts/gds/build-bongos.js +94 -0
  651. package/scripts/gds/capture.js +123 -0
  652. package/scripts/gds/cf-tunnel.js +419 -0
  653. package/scripts/gds/ci-grade.js +82 -0
  654. package/scripts/gds/claim-recall.js +112 -0
  655. package/scripts/gds/claim.js +333 -0
  656. package/scripts/gds/classify-discipline.js +153 -0
  657. package/scripts/gds/claude-materialize.js +176 -0
  658. package/scripts/gds/cleanup-orphans.js +74 -0
  659. package/scripts/gds/cli-lib.js +518 -0
  660. package/scripts/gds/code.js +101 -0
  661. package/scripts/gds/codemod-rename-src-gds.js +145 -0
  662. package/scripts/gds/conductor-dispatch.js +426 -0
  663. package/scripts/gds/context-pack.js +228 -0
  664. package/scripts/gds/coreB-carve-proof.sh +716 -0
  665. package/scripts/gds/cost.js +47 -0
  666. package/scripts/gds/db-backup-nightly.sh +160 -0
  667. package/scripts/gds/db-backup-offsite.sh +152 -0
  668. package/scripts/gds/demote.js +40 -0
  669. package/scripts/gds/design-sync.js +62 -0
  670. package/scripts/gds/diagnose-achievements.js +118 -0
  671. package/scripts/gds/diagram-facts.js +319 -0
  672. package/scripts/gds/discipline-modes.json +25 -0
  673. package/scripts/gds/discord-channels.js +66 -0
  674. package/scripts/gds/do-api.js +176 -0
  675. package/scripts/gds/docs-entropy.js +403 -0
  676. package/scripts/gds/doctor.js +389 -0
  677. package/scripts/gds/feedback-latest.js +94 -0
  678. package/scripts/gds/fetch-art-key.js +106 -0
  679. package/scripts/gds/fetch-sound-prefs.js +88 -0
  680. package/scripts/gds/figma-design-sync.js +61 -0
  681. package/scripts/gds/fitness.js +1446 -0
  682. package/scripts/gds/gate-review.js +322 -0
  683. package/scripts/gds/gating.js +325 -0
  684. package/scripts/gds/gds-db-backup.service +24 -0
  685. package/scripts/gds/gds-db-backup.timer +20 -0
  686. package/scripts/gds/gds-db-offsite.service +29 -0
  687. package/scripts/gds/gds-db-offsite.timer +18 -0
  688. package/scripts/gds/gen-api-client.js +508 -0
  689. package/scripts/gds/gen-api-docs.js +1037 -0
  690. package/scripts/gds/gen-atlas.js +366 -0
  691. package/scripts/gds/gen-diagrams.js +608 -0
  692. package/scripts/gds/gen-file-map.js +196 -0
  693. package/scripts/gds/gen-repo-map.js +519 -0
  694. package/scripts/gds/gen-session-index.js +210 -0
  695. package/scripts/gds/git-merge-regen.js +147 -0
  696. package/scripts/gds/grade-smoke.js +205 -0
  697. package/scripts/gds/hooks/pre-push.js +169 -0
  698. package/scripts/gds/http-api-client.js +88 -0
  699. package/scripts/gds/init.js +903 -0
  700. package/scripts/gds/install-git-hooks.js +114 -0
  701. package/scripts/gds/key-card.js +213 -0
  702. package/scripts/gds/key-status.js +126 -0
  703. package/scripts/gds/land-watch.js +168 -0
  704. package/scripts/gds/learning-capture.js +145 -0
  705. package/scripts/gds/lib.sh +44 -0
  706. package/scripts/gds/linkify-refs.js +473 -0
  707. package/scripts/gds/local-preview-lib.js +159 -0
  708. package/scripts/gds/local-preview.js +95 -0
  709. package/scripts/gds/login.js +225 -0
  710. package/scripts/gds/main-audit.js +279 -0
  711. package/scripts/gds/me.js +88 -0
  712. package/scripts/gds/memory-map.js +174 -0
  713. package/scripts/gds/merge-lock.js +71 -0
  714. package/scripts/gds/migration-namespace.js +200 -0
  715. package/scripts/gds/mirror-lineage-check.js +319 -0
  716. package/scripts/gds/mirror-redact.js +305 -0
  717. package/scripts/gds/module.js +482 -0
  718. package/scripts/gds/newcomer-floor.config.json +13 -0
  719. package/scripts/gds/newcomer-floor.js +415 -0
  720. package/scripts/gds/newcomer-floor.templates.json +86 -0
  721. package/scripts/gds/newcomer-floor.test.js +235 -0
  722. package/scripts/gds/next-number.js +163 -0
  723. package/scripts/gds/oauth-secret.js +197 -0
  724. package/scripts/gds/onboard.js +217 -0
  725. package/scripts/gds/onboarding-analyze.js +226 -0
  726. package/scripts/gds/onboarding-config.js +178 -0
  727. package/scripts/gds/onboarding-ship.js +92 -0
  728. package/scripts/gds/package-core.js +684 -0
  729. package/scripts/gds/paste-token.js +131 -0
  730. package/scripts/gds/portability-smoke-art.sh +85 -0
  731. package/scripts/gds/portability-smoke-memory.sh +147 -0
  732. package/scripts/gds/provision.js +1324 -0
  733. package/scripts/gds/publish-manifest.js +307 -0
  734. package/scripts/gds/pulse.js +309 -0
  735. package/scripts/gds/push-main.js +45 -0
  736. package/scripts/gds/read-session-export.js +359 -0
  737. package/scripts/gds/reauth.js +149 -0
  738. package/scripts/gds/recall.js +135 -0
  739. package/scripts/gds/release.js +71 -0
  740. package/scripts/gds/render-ideas.js +173 -0
  741. package/scripts/gds/repo-metrics.js +363 -0
  742. package/scripts/gds/resolve-skill-model.js +57 -0
  743. package/scripts/gds/run-routine.js +197 -0
  744. package/scripts/gds/run-unit-tests.js +178 -0
  745. package/scripts/gds/sandbox-stage.js +653 -0
  746. package/scripts/gds/search-ingest-db.js +209 -0
  747. package/scripts/gds/search-ingest-md.js +225 -0
  748. package/scripts/gds/security-baseline-check.sh +180 -0
  749. package/scripts/gds/seed-adopt-tasks.js +75 -0
  750. package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
  751. package/scripts/gds/seed-bongos-app-tasks.js +294 -0
  752. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
  753. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
  754. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
  755. package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
  756. package/scripts/gds/seed-bongos-tasks.js +214 -0
  757. package/scripts/gds/seed-gds-v4-tasks.js +624 -0
  758. package/scripts/gds/seed-governance-tasks.js +340 -0
  759. package/scripts/gds/seed-medusa-tasks.js +440 -0
  760. package/scripts/gds/seed-module-upstreaming.js +219 -0
  761. package/scripts/gds/seed-productization-tasks.js +235 -0
  762. package/scripts/gds/seed-provisioning-tasks.js +83 -0
  763. package/scripts/gds/seed-staging.sh +104 -0
  764. package/scripts/gds/seed-v2-world-tasks.js +283 -0
  765. package/scripts/gds/seed-v3-tasks.js +1981 -0
  766. package/scripts/gds/session-cost.js +393 -0
  767. package/scripts/gds/session-digest.js +179 -0
  768. package/scripts/gds/session-eval.js +576 -0
  769. package/scripts/gds/session.js +404 -0
  770. package/scripts/gds/setup.js +504 -0
  771. package/scripts/gds/shell.js +100 -0
  772. package/scripts/gds/ship.js +3618 -0
  773. package/scripts/gds/smoke-batch-claim.sh +213 -0
  774. package/scripts/gds/smoke-batch-release.sh +296 -0
  775. package/scripts/gds/smoke-box.sh +150 -0
  776. package/scripts/gds/smoke-claim-consistency.sh +212 -0
  777. package/scripts/gds/smoke-dependencies.sh +84 -0
  778. package/scripts/gds/smoke-gds.js +125 -0
  779. package/scripts/gds/smoke-write.sh +168 -0
  780. package/scripts/gds/start.js +782 -0
  781. package/scripts/gds/status.js +365 -0
  782. package/scripts/gds/triage.js +366 -0
  783. package/scripts/gds/upgrade.js +421 -0
  784. package/scripts/gds/validate-design.js +254 -0
  785. package/scripts/gds/version-close.js +549 -0
  786. package/scripts/migrate.sh +183 -0
  787. package/scripts/migrate_cost_ledger.sh +178 -0
  788. package/scripts/public-mirror-export.js +291 -0
  789. package/scripts/render-diagrams.sh +88 -0
  790. package/scripts/security/dep-audit.js +276 -0
  791. package/scripts/setup-builder.js +274 -0
  792. package/scripts/setup-builder.sh +28 -0
  793. package/scripts/snapshots/backfill-history.mjs +292 -0
  794. package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
  795. package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
  796. package/scripts/snapshots/render-world.mjs +322 -0
  797. package/scripts/status-mirror-sync.js +192 -0
  798. package/scripts/status-probe.mjs +185 -0
  799. package/server.js +212 -0
  800. package/src/asset-version.js +71 -0
  801. package/src/bongos/CLAUDE.md +64 -0
  802. package/src/bongos/api-errors.js +281 -0
  803. package/src/bongos/api-path-404.js +67 -0
  804. package/src/bongos/api-prefix.js +38 -0
  805. package/src/bongos/app-pair.js +172 -0
  806. package/src/bongos/auth.js +979 -0
  807. package/src/bongos/cascade-dispatch.js +123 -0
  808. package/src/bongos/db-kernel.js +252 -0
  809. package/src/bongos/db.js +911 -0
  810. package/src/bongos/goal-scope-check.js +120 -0
  811. package/src/bongos/hierarchy-config.js +189 -0
  812. package/src/bongos/live-channel.js +145 -0
  813. package/src/bongos/llm-cache.js +260 -0
  814. package/src/bongos/llm-pricing.js +220 -0
  815. package/src/bongos/metrics.js +286 -0
  816. package/src/bongos/middleware/audit.js +274 -0
  817. package/src/bongos/middleware/error-envelope.js +93 -0
  818. package/src/bongos/middleware/rate-limit.js +195 -0
  819. package/src/bongos/module-scope-map.js +271 -0
  820. package/src/bongos/optimizer.js +166 -0
  821. package/src/bongos/path-match.js +47 -0
  822. package/src/bongos/permission-path-check.js +248 -0
  823. package/src/bongos/pool.js +55 -0
  824. package/src/bongos/repo-info.js +91 -0
  825. package/src/bongos/route-rank-check.js +420 -0
  826. package/src/bongos/routes/CLAUDE.md +43 -0
  827. package/src/bongos/routes/_helpers.js +369 -0
  828. package/src/bongos/routes/audit-log.js +59 -0
  829. package/src/bongos/routes/auth.js +755 -0
  830. package/src/bongos/routes/backup.js +104 -0
  831. package/src/bongos/routes/builders.js +526 -0
  832. package/src/bongos/routes/healthz.js +16 -0
  833. package/src/bongos/routes/instance.js +129 -0
  834. package/src/bongos/routes/live.js +125 -0
  835. package/src/bongos/routes/llm-cache.js +119 -0
  836. package/src/bongos/routes/me.js +380 -0
  837. package/src/bongos/routes/modules.js +131 -0
  838. package/src/bongos/routes/optimizer.js +54 -0
  839. package/src/bongos/routes/public.js +476 -0
  840. package/src/bongos/routes/security.js +207 -0
  841. package/src/bongos/routes.js +166 -0
  842. package/src/bongos/secret-box.js +177 -0
  843. package/src/bongos/sensitive-surfaces.js +30 -0
  844. package/src/bongos/serve-internal.js +889 -0
  845. package/src/bongos/uptime-poller.js +90 -0
  846. package/src/bongos-downloads.js +70 -0
  847. package/src/branding.js +182 -0
  848. package/src/build-info.js +77 -0
  849. package/src/devbox-downloads.js +67 -0
  850. package/src/instance-config.js +200 -0
  851. package/src/module-api.js +366 -0
  852. package/src/module-loader/loader.js +268 -0
  853. package/src/module-loader/manifest-schema.js +140 -0
  854. package/src/module-loader/provenance.js +28 -0
  855. package/src/module-loader/semver.js +100 -0
  856. package/src/module-seams.js +291 -0
  857. package/src/modules.js +254 -0
  858. package/src/platform-server.js +135 -0
  859. package/src/ui/adapters/claude-design/index.js +333 -0
  860. package/src/ui/adapters/figma/index.js +328 -0
  861. package/tests/abandon_task.mjs +138 -0
  862. package/tests/achievements_reconcile.mjs +167 -0
  863. package/tests/adopt_detect.mjs +141 -0
  864. package/tests/adopt_import.mjs +132 -0
  865. package/tests/adopt_preflight.mjs +105 -0
  866. package/tests/anti_grid.mjs +89 -0
  867. package/tests/api_client.mjs +231 -0
  868. package/tests/api_docs.mjs +283 -0
  869. package/tests/api_error_envelope_buildcheck.mjs +56 -0
  870. package/tests/api_error_envelope_middleware.mjs +99 -0
  871. package/tests/api_error_registry.mjs +108 -0
  872. package/tests/api_pagination_contract.mjs +51 -0
  873. package/tests/api_path_404.mjs +96 -0
  874. package/tests/app_pair.mjs +168 -0
  875. package/tests/architect.mjs +140 -0
  876. package/tests/art_key.mjs +121 -0
  877. package/tests/art_stage.mjs +121 -0
  878. package/tests/asset_version.mjs +94 -0
  879. package/tests/atlas.mjs +69 -0
  880. package/tests/audit_deps.mjs +74 -0
  881. package/tests/audit_middleware.mjs +385 -0
  882. package/tests/auth_admission_gate.mjs +164 -0
  883. package/tests/auth_anthropic_identity.mjs +95 -0
  884. package/tests/auth_duplicate_cookie.mjs +56 -0
  885. package/tests/auth_error_brand.mjs +77 -0
  886. package/tests/auth_flow_slice1.mjs +223 -0
  887. package/tests/auth_inactive_builder.mjs +94 -0
  888. package/tests/auth_page_gate.mjs +92 -0
  889. package/tests/auth_session_ttl.mjs +155 -0
  890. package/tests/autonomous_fit_protected_paths.mjs +115 -0
  891. package/tests/autonomy_gate.mjs +85 -0
  892. package/tests/autotile_variants.mjs +256 -0
  893. package/tests/autotile_xverify.mjs +133 -0
  894. package/tests/backfill_sessions.mjs +101 -0
  895. package/tests/backfill_task_rewards.mjs +152 -0
  896. package/tests/backup_cli.mjs +104 -0
  897. package/tests/bfg.mjs +327 -0
  898. package/tests/bfg_write.mjs +423 -0
  899. package/tests/bongos_box_connect.mjs +89 -0
  900. package/tests/bongos_dispatch.mjs +74 -0
  901. package/tests/bongos_downloads.mjs +118 -0
  902. package/tests/bongos_login.mjs +34 -0
  903. package/tests/box_access.mjs +186 -0
  904. package/tests/box_auth_check.mjs +114 -0
  905. package/tests/box_code_staleness.mjs +116 -0
  906. package/tests/box_connect_e2e.mjs +196 -0
  907. package/tests/box_cost.mjs +70 -0
  908. package/tests/box_dns_repoint.mjs +151 -0
  909. package/tests/box_host_keys.mjs +102 -0
  910. package/tests/box_onboard.mjs +317 -0
  911. package/tests/box_scope_session.mjs +115 -0
  912. package/tests/box_ship_permissions.mjs +71 -0
  913. package/tests/box_terminal_ssrf.mjs +90 -0
  914. package/tests/boxes.mjs +1255 -0
  915. package/tests/branding.mjs +88 -0
  916. package/tests/bug_attachments.mjs +189 -0
  917. package/tests/build_info.mjs +88 -0
  918. package/tests/builder_needs.mjs +99 -0
  919. package/tests/cap_newcomer_tasks.mjs +114 -0
  920. package/tests/cascade-dispatch.mjs +95 -0
  921. package/tests/cf_tunnel.mjs +459 -0
  922. package/tests/claim_recall.mjs +150 -0
  923. package/tests/claims_bind_session.mjs +47 -0
  924. package/tests/claude_materialize.mjs +148 -0
  925. package/tests/cli_box_scope.mjs +52 -0
  926. package/tests/cli_lib_formatters.mjs +87 -0
  927. package/tests/cli_token_reissue.mjs +147 -0
  928. package/tests/client_bundle_route.mjs +47 -0
  929. package/tests/cloud_bongos_pack.mjs +85 -0
  930. package/tests/conductor.mjs +496 -0
  931. package/tests/confirm_attribution.mjs +156 -0
  932. package/tests/conflict_resolve.mjs +462 -0
  933. package/tests/context_pack.mjs +240 -0
  934. package/tests/cost.mjs +94 -0
  935. package/tests/cost_audit.mjs +122 -0
  936. package/tests/cost_budget_status.mjs +78 -0
  937. package/tests/cost_reconcile.mjs +102 -0
  938. package/tests/cost_summary_shape.mjs +94 -0
  939. package/tests/credit_grant.mjs +376 -0
  940. package/tests/criterion_progress.mjs +220 -0
  941. package/tests/criterion_proposal.mjs +109 -0
  942. package/tests/criterion_ref_parse.mjs +53 -0
  943. package/tests/currency_label.mjs +119 -0
  944. package/tests/day_cycle.mjs +197 -0
  945. package/tests/dependencies_migration.mjs +77 -0
  946. package/tests/dependencies_polymorphic.mjs +212 -0
  947. package/tests/deploy_instance.mjs +78 -0
  948. package/tests/devbox_downloads.mjs +122 -0
  949. package/tests/diff_derived_signals.mjs +115 -0
  950. package/tests/discord_approvals.mjs +174 -0
  951. package/tests/discord_autojoin.mjs +158 -0
  952. package/tests/discord_bot.mjs +94 -0
  953. package/tests/discord_bugs.mjs +297 -0
  954. package/tests/discord_channels.mjs +337 -0
  955. package/tests/discord_foundation.mjs +76 -0
  956. package/tests/discord_inbound.mjs +190 -0
  957. package/tests/discord_message_buffer.mjs +87 -0
  958. package/tests/discord_oauth.mjs +55 -0
  959. package/tests/discord_reaction.mjs +170 -0
  960. package/tests/discord_role_sync.mjs +151 -0
  961. package/tests/display_name.mjs +123 -0
  962. package/tests/dns_preflight.mjs +74 -0
  963. package/tests/event_sound_prefs.mjs +194 -0
  964. package/tests/eviction_policy.mjs +279 -0
  965. package/tests/figma_adapter.mjs +199 -0
  966. package/tests/file_map.mjs +91 -0
  967. package/tests/first_admin_bootstrap.mjs +40 -0
  968. package/tests/fitness.mjs +435 -0
  969. package/tests/fitness_two_root.mjs +104 -0
  970. package/tests/fixtures/session-506-digest.json +34 -0
  971. package/tests/gate_approvals.mjs +451 -0
  972. package/tests/gate_review.mjs +152 -0
  973. package/tests/git_merge_regen.mjs +151 -0
  974. package/tests/github_push_ancestry.mjs +119 -0
  975. package/tests/github_push_land_proof.mjs +127 -0
  976. package/tests/github_push_merge_driver.mjs +175 -0
  977. package/tests/goal_abuse_matrix.mjs +187 -0
  978. package/tests/goal_achievement.mjs +146 -0
  979. package/tests/goal_conflicts.mjs +305 -0
  980. package/tests/goal_dependencies_read.mjs +73 -0
  981. package/tests/goal_member_roles.mjs +420 -0
  982. package/tests/goal_membership_requests.mjs +332 -0
  983. package/tests/goal_routes.mjs +203 -0
  984. package/tests/goal_scope_check.mjs +167 -0
  985. package/tests/goal_tier.mjs +312 -0
  986. package/tests/goal_wall_proof.mjs +112 -0
  987. package/tests/grade_attempts.mjs +73 -0
  988. package/tests/grade_attribution.mjs +117 -0
  989. package/tests/grade_diff_hash.mjs +191 -0
  990. package/tests/grade_server_authoritative.mjs +305 -0
  991. package/tests/grade_unavailable_display.mjs +66 -0
  992. package/tests/grader.mjs +1960 -0
  993. package/tests/grader_bypass.mjs +57 -0
  994. package/tests/grader_panel.mjs +252 -0
  995. package/tests/grader_prompt_fencing.mjs +192 -0
  996. package/tests/helpers.mjs +52 -0
  997. package/tests/hierarchy-config.mjs +81 -0
  998. package/tests/init.mjs +463 -0
  999. package/tests/instance_config.mjs +76 -0
  1000. package/tests/instance_manifest.mjs +110 -0
  1001. package/tests/interaction_prefs.mjs +72 -0
  1002. package/tests/key-card.mjs +110 -0
  1003. package/tests/key-status.mjs +45 -0
  1004. package/tests/land_watch.mjs +115 -0
  1005. package/tests/lifecycle-card.mjs +145 -0
  1006. package/tests/lifecycle_breakdown_view.mjs +236 -0
  1007. package/tests/linkify_refs.mjs +264 -0
  1008. package/tests/live_channel.mjs +128 -0
  1009. package/tests/live_sse.mjs +122 -0
  1010. package/tests/llm-cache-route.mjs +110 -0
  1011. package/tests/llm-cache.mjs +140 -0
  1012. package/tests/llm-pricing.mjs +152 -0
  1013. package/tests/local_preview.mjs +136 -0
  1014. package/tests/main_audit.mjs +137 -0
  1015. package/tests/memory_isolation.mjs +431 -0
  1016. package/tests/memory_map.mjs +107 -0
  1017. package/tests/memory_pull.mjs +429 -0
  1018. package/tests/merge_lease.mjs +100 -0
  1019. package/tests/merge_lock.mjs +312 -0
  1020. package/tests/metrics.mjs +147 -0
  1021. package/tests/migration_allocation.mjs +146 -0
  1022. package/tests/migration_namespace.mjs +185 -0
  1023. package/tests/migrations_fresh_replay_guard.mjs +38 -0
  1024. package/tests/mirror_lineage_fulltree.mjs +45 -0
  1025. package/tests/mirror_lineage_proof.mjs +72 -0
  1026. package/tests/mirror_redact.mjs +193 -0
  1027. package/tests/model_alloc_prefs.mjs +63 -0
  1028. package/tests/module-scope-map.mjs +88 -0
  1029. package/tests/module_api.mjs +110 -0
  1030. package/tests/module_cli.mjs +292 -0
  1031. package/tests/module_contributions.mjs +148 -0
  1032. package/tests/module_loader.mjs +286 -0
  1033. package/tests/module_manifest.mjs +194 -0
  1034. package/tests/module_owned_tests.mjs +105 -0
  1035. package/tests/module_provenance.mjs +34 -0
  1036. package/tests/module_route_rank.mjs +147 -0
  1037. package/tests/module_seams.mjs +68 -0
  1038. package/tests/modules.mjs +156 -0
  1039. package/tests/modules_route.mjs +38 -0
  1040. package/tests/newcomer_floor.mjs +17 -0
  1041. package/tests/newcomer_restock.mjs +80 -0
  1042. package/tests/next_number.mjs +154 -0
  1043. package/tests/oauth_secret.mjs +60 -0
  1044. package/tests/onboard.mjs +70 -0
  1045. package/tests/onboarding_gate.mjs +267 -0
  1046. package/tests/onboarding_observability.mjs +344 -0
  1047. package/tests/onboarding_route_signals.mjs +175 -0
  1048. package/tests/onboarding_state.mjs +346 -0
  1049. package/tests/one_active_claim_per_session.mjs +111 -0
  1050. package/tests/orphaned_claim_ship.mjs +135 -0
  1051. package/tests/override_attribution.mjs +142 -0
  1052. package/tests/override_request_ownership.mjs +235 -0
  1053. package/tests/package_core.mjs +435 -0
  1054. package/tests/parallel-load.mjs +402 -0
  1055. package/tests/path_match.mjs +62 -0
  1056. package/tests/permission_path.mjs +151 -0
  1057. package/tests/platform_boot.mjs +167 -0
  1058. package/tests/pre_compact.mjs +60 -0
  1059. package/tests/preview_server.mjs +127 -0
  1060. package/tests/profile_route.mjs +197 -0
  1061. package/tests/provision.mjs +805 -0
  1062. package/tests/provisioning_github_app_routes.mjs +98 -0
  1063. package/tests/public_mirror_export.mjs +124 -0
  1064. package/tests/public_task_resolver.mjs +112 -0
  1065. package/tests/publish_branch_route.mjs +422 -0
  1066. package/tests/publish_manifest.mjs +184 -0
  1067. package/tests/publish_reconciler.mjs +728 -0
  1068. package/tests/rank_gate.mjs +463 -0
  1069. package/tests/rate_limit_public.mjs +217 -0
  1070. package/tests/read_session_export.mjs +89 -0
  1071. package/tests/recall_cli.mjs +82 -0
  1072. package/tests/recall_hints.mjs +119 -0
  1073. package/tests/recent_shipped_window.mjs +80 -0
  1074. package/tests/regrade_eligibility.mjs +202 -0
  1075. package/tests/render_prefs.mjs +122 -0
  1076. package/tests/repo_map.mjs +92 -0
  1077. package/tests/reward_gate.mjs +284 -0
  1078. package/tests/route_rank_check.mjs +243 -0
  1079. package/tests/route_validation.mjs +490 -0
  1080. package/tests/routine_timers.mjs +72 -0
  1081. package/tests/rubric_fixtures.mjs +140 -0
  1082. package/tests/run_routine.mjs +69 -0
  1083. package/tests/sandbox_stage.mjs +582 -0
  1084. package/tests/scrubber_corpus.mjs +257 -0
  1085. package/tests/search_chunker.mjs +209 -0
  1086. package/tests/search_ingest.mjs +96 -0
  1087. package/tests/search_ingest_db.mjs +88 -0
  1088. package/tests/search_isolation.mjs +204 -0
  1089. package/tests/search_route.mjs +95 -0
  1090. package/tests/secret_box.mjs +189 -0
  1091. package/tests/security_docs.mjs +186 -0
  1092. package/tests/security_route.mjs +108 -0
  1093. package/tests/served_paths_shipped.mjs +118 -0
  1094. package/tests/session-cards.mjs +142 -0
  1095. package/tests/session_506_regression.mjs +69 -0
  1096. package/tests/session_caps.mjs +238 -0
  1097. package/tests/session_cost.mjs +133 -0
  1098. package/tests/session_digest.mjs +73 -0
  1099. package/tests/session_eval.mjs +386 -0
  1100. package/tests/session_index.mjs +105 -0
  1101. package/tests/session_records.mjs +369 -0
  1102. package/tests/session_search.mjs +78 -0
  1103. package/tests/session_start_freshness.mjs +123 -0
  1104. package/tests/setup_smoke.mjs +154 -0
  1105. package/tests/ship_autolinkify.mjs +60 -0
  1106. package/tests/ship_automerge_injection.mjs +174 -0
  1107. package/tests/ship_broadcast_routing.mjs +125 -0
  1108. package/tests/ship_broadcast_server.mjs +175 -0
  1109. package/tests/ship_card.mjs +280 -0
  1110. package/tests/ship_ci_deploy.mjs +374 -0
  1111. package/tests/ship_preflight.mjs +368 -0
  1112. package/tests/ship_premerge.mjs +75 -0
  1113. package/tests/ship_resume.mjs +129 -0
  1114. package/tests/ship_upload_skip.mjs +89 -0
  1115. package/tests/ship_zero_commit.mjs +60 -0
  1116. package/tests/single_host_hall.mjs +98 -0
  1117. package/tests/skill_prefs.mjs +150 -0
  1118. package/tests/smoke_preflight.mjs +66 -0
  1119. package/tests/snapshot_picker.mjs +233 -0
  1120. package/tests/sound_prefs.mjs +198 -0
  1121. package/tests/sprite_facing.mjs +35 -0
  1122. package/tests/status-probe.mjs +89 -0
  1123. package/tests/status_backfill.mjs +94 -0
  1124. package/tests/stop_refcheck.mjs +127 -0
  1125. package/tests/streak.mjs +175 -0
  1126. package/tests/subdomain_auth.mjs +58 -0
  1127. package/tests/task_classifier_vocab.mjs +41 -0
  1128. package/tests/task_create_idempotency.mjs +96 -0
  1129. package/tests/task_goal_link.mjs +93 -0
  1130. package/tests/task_ownership_gate.mjs +125 -0
  1131. package/tests/terrain_picker.mjs +298 -0
  1132. package/tests/touches_overlap.mjs +75 -0
  1133. package/tests/triage_development.mjs +140 -0
  1134. package/tests/turn_in_place.mjs +280 -0
  1135. package/tests/upgrade.mjs +357 -0
  1136. package/tests/verify_task_guard.mjs +64 -0
  1137. package/tests/version_close.mjs +76 -0
  1138. package/tests/versions_route.mjs +93 -0
  1139. package/tests/walkability.mjs +188 -0
  1140. package/tests/wandering_prefs.mjs +176 -0
  1141. package/tests/worktree_disambiguation.mjs +105 -0
  1142. package/tests/worktree_guard.mjs +90 -0
@@ -0,0 +1,55 @@
1
+ # ADR 0082 — Server-side auto-resolution of generated-file & append-index merge conflicts
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-21
5
+ - **Track:** internal
6
+ - **Builds on:** [ADR 0055](<redacted>.md) (server-mediated publish — the box holds no push credential; the server pushes), [ADR 0063](<redacted>.md) / [ADR 0066](<redacted>.md) / [ADR 0062](<redacted>.md) §8 (the generated artifacts + the `otb-regen` merge driver, task 1243), [ADR 0016](<redacted>.md) (trust boundary — this does NOT touch it)
7
+ - **Task:** [#1385](https://example.com/builders#/task/1385) (idea [#349](https://example.com/builders#/idea/349))
8
+
9
+ ## Context
10
+
11
+ The active merge driver (task 1162, `github-push.mergeIfGreen`) lands a green PR the moment it is mergeable AND `CLEAN`, but bails on **any** conflict (`reason:'merge_conflict'`) and the publish-reconciler just moves on. Two conflict classes recur constantly in a multi-builder repo and are *not* genuine disagreements — they are mechanical collisions:
12
+
13
+ 1. **Generated artifacts** — `docs/repo-map.md`, `docs/file-map.md`, `docs/session-log-index.md`, and the nested `CLAUDE.md` symbol blocks. Two parallel branches each regenerate them, so they conflict on nearly every merge. Task 1243 already solved this *locally* with the `otb-regen` git merge driver (`scripts/gds/git-merge-regen.js`), which regenerates them from the merged tree.
14
+ 2. **The `docs/adr/README.md` append-index** — a hand-maintained table whose only recurring conflict is two branches each appending a new ADR row. There is no generator to rebuild it from, so `otb-regen` can't help it at all.
15
+
16
+ The gap: task 1243's machinery only runs in a **local** `git merge` (a builder's box, `/merge-mode`, ship's pre-stage). But the default ship path is **server-mediated** (ADR 0055) and lands via GitHub's own merge — and **GitHub's merge cannot run a custom merge driver** (`otb-regen`). So a confirmed PR that later conflicts only on these files sits open forever until a human with a credentialed checkout runs a local merge. This is the exact stall behind PR #300 and PR #167 (both on `docs/adr/README.md`).
17
+
18
+ The owner framed the goal as "kill the merge bottleneck" — and **explicitly rejected** the tempting alternative of lowering deploy/merge access down to the `thetes` rank. That would reopen the Builder 25 hole ([ADR 0043](<redacted>.md)): a lightly-trusted agent landing changes on a live prod payment system. The right fix changes *who does the mechanical work*, not *who is trusted to land code*.
19
+
20
+ ## Decision
21
+
22
+ Two pieces, both reusing the task-1243 machinery rather than reinventing it:
23
+
24
+ **1. `.gitattributes` coverage.**
25
+ - `docs/adr/README.md merge=union` — the built-in `union` driver keeps both sides' appended rows, the correct resolution for an append list. `union` is core git (no per-clone registration) and is honored by every *local* merge.
26
+ - `docs/session-log-index.md merge=otb-regen` + adding it to `REGENERABLE` in `git-merge-regen.js` (a whole-file `renderIndex(collectEntries())`, like `docs/repo-map.md`) — so the generated session index self-heals everywhere the rest do.
27
+
28
+ **2. `src/bongos/conflict-resolve.js` — a server-side resolver** wired into the publish-reconciler. When a confirmed task's PR reports `merge_conflict`, it:
29
+ 1. Clones the server's checkout into a throwaway temp dir (never the deploy worktree — mirrors `github-push.pushBundle`).
30
+ 2. Registers the `otb-regen` driver in that clone (`install-git-hooks.registerMergeDriver`); `union` needs none.
31
+ 3. Fetches fresh `origin/main` + the feature branch over the server's credentialed URL and checks out the branch.
32
+ 4. Runs `git merge origin/main`. The driver resolves the generated files; `union` resolves the ADR index; **any genuine hand-written conflict leaves the merge non-zero**, and we `git merge --abort` and leave the PR untouched for a human.
33
+ 5. On a fully-clean merge (asserted: no unmerged paths, no surviving `<<<<<<<`/`>>>>>>>` markers), pushes the resolved branch.
34
+
35
+ The PR's required checks (unit / trufflehog / audit / gate-review) re-run on the new head, and the next `mergeIfGreen` sweep lands it.
36
+
37
+ ## Why this is safe — and never worse than today
38
+
39
+ - **It bypasses no gate.** It pushes a *commit*; it does not merge to `main`. Every required check re-runs before anything lands. It cannot bypass the grader, gate-review, or rank checks — and **zero change to the trust boundary** (the rejected `thetes` alternative).
40
+ - **It resolves only what the driver/union resolve.** A real hand-conflict aborts to a human; the resolver invents nothing (`git-merge-regen` already exits non-zero if any marker survives a regeneration).
41
+ - **Isolated + best-effort + kill-switchable.** It works in a temp clone (can't race `~/deploy.sh`), is wrapped best-effort in the reconciler (a failure is logged, never thrown), and is killable via `CONFLICT_RESOLVE_DISABLED=1`. If anything goes wrong the strand is simply left exactly as it is today.
42
+ - **No `--force`, ever.** A non-fast-forward push (someone moved the branch) fails safely; the next sweep retries against the new tip.
43
+
44
+ ## Consequences
45
+
46
+ - Generated/index-only conflicts on the server path now self-heal within a reconciler sweep (~5 min) with no human and no credentialed checkout — the PR #300/[#167](https://example.com/builders#/task/167) class is closed going forward.
47
+ - The resolution push changes the PR head, so an SHA-pinned `gate-owner-approved` (ADR 0058) on a *gate-surface* PR would need re-approval. In practice these conflicts are on docs/index files (rarely gate-surface), so this is uncommon; when it happens, the behavior is the same one-click re-approval as any post-push change.
48
+ - `docs/adr/README.md` itself now carries `merge=union`, so this ADR's own index row — and every future one — stops conflicting.
49
+ - The generated-artifact set is defined once (`REGENERABLE` in `git-merge-regen.js`, mirrored by `.gitattributes` and the `fitness.js` freshness gate); adding a future generated file means adding it in those places together.
50
+
51
+ ## Alternatives considered
52
+
53
+ - **Lower deploy/merge access to `thetes`** (the owner's first instinct) — rejected: reopens the Builder 25 hole for zero benefit here (the stranded session was already Archon; rank was never the blocker).
54
+ - **Rely on GitHub honoring `union`/custom drivers server-side** — GitHub does not run custom merge drivers, and `union` honoring is unreliable across GitHub's merge surface; doing the merge locally on the server makes the outcome deterministic regardless.
55
+ - **A `gen-adr-index.js` generator** so `otb-regen` could rebuild `docs/adr/README.md` — rejected for now: the index's `Track`/`Topic` columns are human-authored and not derivable from the ADR files, so `union` is the correct, cheap resolution for an append list.
@@ -0,0 +1,143 @@
1
+ # ADR 0083 — Practical build plan for the modular architecture (strangler migration)
2
+
3
+ **Status:** Accepted (2026-06-21) · task [#1405](https://example.com/builders#/task/1405) (BV1.R36) · epic [#1388](https://example.com/builders#/task/1388) (BV1.R34) · spike that produced the design: [#1383](https://example.com/builders#/task/1383) → design research in [`docs/design/modular-architecture/`](../design/modular-architecture/) (5 docs, task [#1401](https://example.com/builders#/task/1401))
4
+
5
+ **Amended by:** [ADR 0091](<redacted>.md) (2026-06-26, BONGOS-V1 C7) — extends this strangler from the four *feature* modules into the **core itself**: bounds the kernel as an enumerated file roster (the "~3.5k-LOC kernel" this ADR kept referencing), defines the per-domain `db.js` carve mechanism, and classifies what the `src/module-api.js` doorway may expose. Nothing here is reversed; 0091 makes "the kernel" and "carve `db.js` per-domain" concrete.
6
+
7
+ **Builds on:** [ADR 0062](<redacted>.md) (instance/model decoupling — the core↔host split, §4 module registry, §5 module-owned migrations, §9 fitness functions), [ADR 0061](<redacted>.md) (context layers / nested CLAUDE.md), [ADR 0016](<redacted>.md) (server-enforced rank boundary), [ADR 0043](<redacted>.md) (protected paths), [ADR 0049](<redacted>.md) (`touches[]` advisory).
8
+
9
+ > **Numbering reconciliation (read this first).** The design docs, the epic [#1388](https://example.com/builders#/task/1388), and task [#1389](https://example.com/builders#/task/1389) all refer to the project-extensible module system as **"ADR 0080"**. That number was taken by the LLM-cache transport ADR ([ADR 0080](<redacted>.md)) before the module-system ADR was written — the same `0079→0081` collision class recorded in project memory. **The module-system decision record is THIS file, ADR 0083.** Where the design docs or those tasks say "ADR 0080 (module system / plugin API)", read "ADR 0083". ADR 0080 is unrelated (it is the LLM cache).
10
+
11
+ ---
12
+
13
+ ## Context
14
+
15
+ The modular architecture has been **scoped** — five research/design documents under [`docs/design/modular-architecture/`](../design/modular-architecture/) settle *what* to build and *why*. This ADR settles **how we practically build it**: the concrete, sequenced, CI-guarded migration, mapped 1:1 onto claimable GDS tasks.
16
+
17
+ The design's load-bearing conclusions (not re-argued here — see the design docs):
18
+
19
+ 1. **Reorganize, don't rewrite.** The foundation (trust boundary, GDS ship/grade/deploy pipeline, grader, ~143 migrations) is *sound*; the filing (fused game/core, a ~5.3k-LOC shared `db.js`, flat routes, inline `if (isModuleEnabled())` gates, hardcoded brand strings) is *wrong*. Rewrite when the foundation is wrong; reorganize when the filing is wrong ([01 §5](../design/modular-architecture/01-architecture.md)).
20
+ 2. **Modularity is one axis of four.** Move *only* modularity (how code is organized). **Stay** single-package, single-process, no-bundler ([01 §1](../design/modular-architecture/01-architecture.md)). Each "stay" has a clean future fork (marketplace → packages; untrusted modules → processes; a UI needing a build → that module owns its build) that this plan does not foreclose.
21
+ 3. **Boundaries are held by CI fitness functions, not discipline.** In an AI-built system this is decisive: an agent on a module-scoped task *cannot* silently erode the architecture, because a violation is a red build ([04 §3](../design/modular-architecture/04-module-lifecycle.md)).
22
+ 4. **The roster is ~16 modules + a ~3.5k-LOC kernel**, drawn from a `require()`-graph scan, not intuition ([02](../design/modular-architecture/02-module-map.md)). Sequence **coarse → medium**, stop before fine; **never cut through the lifecycle state machine**.
23
+ 5. **Modules talk through kernel-mediated seams** (ports + events), never by importing each other ([04 §1](../design/modular-architecture/04-module-lifecycle.md)).
24
+
25
+ ### What already exists (grounded at `cc8a5e0` / `494d1d77`)
26
+
27
+ The migration is **moving files into `modules/<key>/` and replacing inline gates with a loader** — not inventing the flag layer. The seeds are already in place:
28
+
29
+ | Seed | Where | Status |
30
+ |---|---|---|
31
+ | A module registry with a `contributes` map | `src/modules.js` (~240 LOC): `isModuleEnabled`, `enabledDisciplines`, `clientModules`, `loadModules` | **closed** — a hardcoded `KNOWN_MODULES` set of four; the loader opens it |
32
+ | Per-instance enablement config | `config/modules.json` (OTB: all four on) over `config/modules.neutral.json` (vanilla: all off) | works; loader keeps reading it |
33
+ | Inline mount gates (the lines a loader DELETES) | `server.js:139-143,176-178,186-191` (game rooms, world precreate, discord bot); `src/bongos/routes.js:122-123` (dev-box + discord routers); `src/bongos/routes/instance.js:119` (`devBoxEnabled`) | replace with loader-driven mount |
34
+ | Client UI gates | `window.__MODULES__` → `public-builders/dom-utils.js:103` `moduleOn()`; consumed in `builders.js`, `settings.js` | keep; loader keeps injecting `__MODULES__` |
35
+ | Fitness gate (6 checks) | `scripts/gds/fitness.js` → `tests/fitness.mjs` → the `unit` CI job (`pr-unit-tests.yml`) | **extend** with the boundary checks |
36
+ | One thin route mounter | `src/bongos/routes.js` (`buildGdsRouter()`), single mount at `src/bongos/serve-internal.js:155` | loader composes module routers behind auth here |
37
+ | Per-module migrations precedent | `migrations/game/` applied enabled-gated in `scripts/migrate.sh:62-67` (`MEDUSA_GDS_ONLY` gate); `schema_migrations` is **stem-keyed** so moving a file between dirs does **not** re-run it (`migrate.sh:25-26`) | **generalize** to `modules/<key>/migrations/` |
38
+ | A GDS-only schema verifier | `scripts/verify-gds-only-schema.sh` (the R52 carve-out test) | generalize per-module |
39
+ | The core↔host import-boundary check | `fitness.js` `checkCoreHostBoundary` (`HOST_GAME` regex, empty `GRANDFATHERED` set) | the template for the module-boundary checks |
40
+
41
+ **There is no `modules/` directory yet.** The kernel (`src/bongos/auth.js`, `pool.js`, `db.js`, `route-rank-check.js`, `permission-path-check.js`, the loader-to-be) stays where it is; modules move *out* around it.
42
+
43
+ ---
44
+
45
+ ## Decision
46
+
47
+ **Build the whole product into `core + modules` via an incremental strangler migration, one module at a time (most-isolated first), with each step shipping independently and guarded by CI fitness functions. Stay single-package, single-process, no-bundler. Enforce the one-way boundary by composition (the loader owns the mount) and by fitness (a violation is a red build), not by trust.**
48
+
49
+ The unit of work is a **module** = a vertical slice (its routes, DB tables, UI, skills, agent-context) reachable through **one published doorway** (`src/module-api.js`). The five rules ([01 §3](../design/modular-architecture/01-architecture.md)): (1) one doorway, one direction — modules import `module-api.js` only; core never imports a module; modules never import each other; (2) the host owns the mount; (3) a module owns a vertical slice; (4) shared state is namespaced (`<key>_*` tables, additive migrations); (5) a task is scoped to a module.
50
+
51
+ ### The doorway and the loader
52
+
53
+ - **`src/module-api.js`** — the stable, **semver'd** import surface, and the *only* core file a module may `require`. It re-exports the kernel capabilities a module legitimately needs: `requireBuilder` / `requireRank` (auth, from `src/bongos/auth.js`), a DB pool accessor (`src/bongos/pool.js`), the **seam registry** (`registerProvider`/`resolve` for ports; `emit`/`on` for events), config/branding/identity (`src/instance-config.js`, `config/branding.json`), and a logger. It carries a `CORE_VERSION` constant. Adding to it is a **minor** semver bump (safe); changing/removing is **major** ([04 §2](../design/modular-architecture/04-module-lifecycle.md)). *(The design docs call this `core/module-api.js`; we site it at `src/module-api.js` to match the existing `src/modules.js` sibling and epic [#1388](https://example.com/builders#/task/1388) step 1. "core/" is the conceptual kernel, not a directory move.)*
54
+ - **The loader** — replaces the closed `KNOWN_MODULES` registry in `src/modules.js`. It (a) **discovers** `modules/*/module.json` across roots, (b) **validates** each manifest against a schema, (c) checks `coreVersion` compatibility (fail-closed), (d) **resolves → loads → mounts** each enabled module's route factory **behind kernel-composed auth** (the module ships a route *recipe* + a required rank; the loader wraps audit → `requireBuilder` → `requireRank` around it — [01 §3a](../design/modular-architecture/01-architecture.md)), (e) starts/stops its pollers, (f) applies its migrations (enabled-gated). The existing `isModuleEnabled`/`enabledDisciplines`/`clientModules` exports stay as a **back-compat facade** over the loader so nothing downstream breaks during the move.
55
+ - **The seam registry** — the kernel switchboard ([04 §1](../design/modular-architecture/04-module-lifecycle.md)). **Ports** (required capability): the economy module registers a `reward` provider; at ship the lifecycle asks the kernel to resolve `reward` and calls it. **Events** (optional reaction): the lifecycle emits `task.shipped`; discord reacts if it cares. No module ever holds a reference to another.
56
+
57
+ ### How the boundary is enforced (trust = composition + fitness, never trust)
58
+
59
+ Two layers, composing with the existing rank boundary ([03 §8](../design/modular-architecture/03-builder-flows.md)): **rank** = *what* you may do (server-enforced, live, ADR 0016); **module** = *where* this task's code lands (worktree scope + a ship-time diff⊆module check).
60
+
61
+ New fitness checks, each a pure `checkXxx()` added to the `CHECKS` array in `fitness.js:285` (riding the `unit` job with **zero workflow changes** — they're picked up by `tests/fitness.mjs`):
62
+
63
+ 1. **core never imports a module** — mirror `checkCoreHostBoundary`: flag any `require()` under the kernel that resolves into `modules/`. Fresh `GRANDFATHERED` set, ratcheted to empty as moves land.
64
+ 2. **modules import only the published API** — walk each `modules/<key>/`, flag any `require()` resolving into core internals *other than* `src/module-api.js` (reject deep `src/bongos/db`, `src/bongos/auth`, …) and any resolving into a *sibling* module.
65
+ 3. **every module write-route is rank-gated** — **do not re-implement.** Parameterize `route-rank-check.js`'s `ROUTES_DIR` (`route-rank-check.js:26,151-159`) to *also* walk `modules/**/routes/`; module write-routes then inherit the exact "unknown write = blocker" rule Check 4 already enforces.
66
+ 4. **core carries no module-specific code** — assert no module key/domain term leaks into kernel files.
67
+ 5. **module migrations are additive + namespaced** — read `modules/<key>/migrations/`, regex-reject destructive DDL (`DROP TABLE`/`DROP COLUMN`/destructive `ALTER`) and assert a `<key>_`-prefixed object namespace.
68
+
69
+ Each new check returns `warnings` until the tree is clean, then flips to `violations` (the ratchet). Every check ships with a **negative test** (proves it actually catches a violation) alongside the clean-pass test, mirroring `tests/fitness.mjs`.
70
+
71
+ ### Module-owned migrations
72
+
73
+ Generalize the working `migrations/game/` precedent ([02 §1 grounded](../design/modular-architecture/02-module-map.md)):
74
+
75
+ - Teach `scripts/migrate.sh` to discover `modules/*/migrations/*.sql` and apply each **only if its module is enabled** (the `MEDUSA_GDS_ONLY` gate generalized to per-module enablement). `schema_migrations` stays **stem-keyed**, so relocating a migration from `migrations/game/` to `modules/game/migrations/` does **not** re-run it on prod — the existing safety guarantee carries the move for free.
76
+ - **Disable preserves data** — the entire mechanism is "don't apply," never "drop." There is no down-migration path and we keep it that way; a disabled module's tables simply are never created (or are left untouched).
77
+ - Generalize `scripts/verify-gds-only-schema.sh` into a per-module schema-presence/absence verifier.
78
+ - `scripts/migrate.sh` is a **gate HARD-FLOOR** (`gate-review.js`) and `migrations/` is **NEEDS_TRUST + a protected path** (`permission-path-check.js:78-80`): the runner change needs owner sign-off; new `modules/<key>/migrations/` subtrees inherit the protected-path treatment. The loader/migrate change is owner-gated by construction.
79
+
80
+ ### The four module moves — ordered by *measured* isolation
81
+
82
+ From the `require()`-graph + reference scan (not intuition — [02 §2](../design/modular-architecture/02-module-map.md), confirmed in this ADR's grounding pass):
83
+
84
+ | Order | Module | Coupling into core | Why this slot |
85
+ |---|---|---|---|
86
+ | **1** | **dev-box** | **0** refs in `server.js`/`routes.js` bodies; self-contained `box*.js` cluster; box-prefixed tables; routes already flag-gated at `routes.js:122` | **The template move.** Cleanest seam; every later move copies it. Only seam: ~16 read-only box-status lines in `routes/me.js`. |
87
+ | **2** | **game** | **0** refs in any `src/bongos/` core file; lives entirely outside `src/bongos/` (`src/rooms/`, `src/world/`, `public/game/`); **already** has `migrations/game/` + a game-less `platform-server.js` | Most pre-separated. Slot 2 only because its server/client render twins must move together and `server.js` carries its static-serve tail + the Colyseus "realtime capability" seam. |
88
+ | **3** | **discord** | bot + broadcast cleanly isolatable, but the link/role **UI is woven into core** — `routes/me.js` (63 refs) + `settings.js` (19) | Needs the profile/settings contribution seam first. |
89
+ | **4** | **art-pipeline** | **no own router** — its API lives *inside* core `routes/me.js` (art-key, ~32 refs); the `artist` discipline threads through `src/modules.js` `enabledDisciplines()`; ~18k LOC `art/` tree | Hardest clean cut; largest body; last. |
90
+
91
+ **The recurring seam** across dev-box/discord/art is **`src/bongos/routes/me.js`** (the builder-profile route embeds all three) and **`public-builders/settings.js`** (embeds all three UI panels). A **module→core contribution hook** (a registration callback for profile fields + settings panels) is the prerequisite that lets dev-box/discord/art leave core. Game has *zero* such coupling and needs no profile seam.
92
+
93
+ ### task→module affinity (the follow-on)
94
+
95
+ The research centerpiece ([00 §6](../design/modular-architecture/00-research-report.md)) — move the unit of work-affinity *up* from file paths to modules. Once the roster exists: a task declares **module affinity**; the agent loads only that module + the published API (smaller context, higher quality); parallel-safety becomes **module-disjointness** (cleaner than path overlap); drift detection becomes semantic ("you said dev-box, you touched game"); and the file-path `touches[]` (ADR 0049, already advisory) **retires** in favor of the module label + a ship-time diff⊆module check. This depends on the full move being done, so it is the **final tier** of this plan, not a precondition.
96
+
97
+ ---
98
+
99
+ ## The build plan → seeded tasks
100
+
101
+ Each phase maps to a claimable BONGOS-V1 task under criterion **C5 (`module-system-live`)**, dependency-ordered. (Seeded by `scripts/gds/seed-bongos-module-system-tasks.js`, companion migration `144`. R## numbers are assigned sequentially after the current max; the dependency edges below are authoritative.)
102
+
103
+ | Phase | Task (by role) | Delivers | Depends on |
104
+ |---|---|---|---|
105
+ | 0 · Doorway | `module-api.js` | the published, semver'd import surface + `CORE_VERSION` + nested CLAUDE.md | — |
106
+ | 0 · Doorway | fitness one-way checks | "core never imports a module" + "modules import only the API" (warn-mode; green on empty `modules/`) | module-api.js |
107
+ | 1 · Loader | manifest schema + validator | `module.json` schema (key, coreVersion, `contributes`, `provides`/`consumes`, `prerequisites`) + validator | — |
108
+ | 1 · Loader | the loader | discover → validate → coreVersion-check → mount-behind-auth → pollers → teardown; back-compat facade over `src/modules.js` | module-api.js, manifest schema |
109
+ | 1 · Loader | seam registry | kernel ports (`registerProvider`/`resolve`) + event bus (`emit`/`on`) | module-api.js |
110
+ | 2 · First move | profile/settings contribution seam | module→core hook for `routes/me.js` profile fields + `settings.js` panels | seam registry |
111
+ | 2 · First move | **move dev-box** → `modules/dev-box/` | move files; delete `routes.js:122` gate; loader mounts; OTB byte-identical | loader, profile seam |
112
+ | 3 · Trust | fitness module-route rank gate | parameterize `route-rank-check.js` to walk `modules/**/routes/` | loader |
113
+ | 3 · Trust | fitness core-clean + migration checks | "core carries no module code" + "module migrations additive/namespaced" (flip warn→violation) | loader, move dev-box |
114
+ | 4 · Migrations | module-owned migrations | generalize `migrate.sh` + `verify-gds-only-schema.sh` to `modules/<key>/migrations/` | loader |
115
+ | 5 · More moves | **move discord** → `modules/discord/` | bot/broadcast/routes + link UI via the profile seam | move dev-box, profile seam, module migrations |
116
+ | 5 · More moves | **move art-pipeline** → `modules/art-pipeline/` | carve art-key API out of `me.js`; `art/` tree; artist-discipline contribution | move dev-box, profile seam |
117
+ | 6 · Game | **move game** → `modules/game/` | rooms/world/`public/game`/`migrations/game`; Colyseus "realtime capability" seam | loader, module migrations |
118
+ | 7 · DX | `bongos module new <key>` + `bongos upgrade` | scaffolder (manifest + dirs + nested CLAUDE.md) + coreVersion pre-check | manifest schema, loader |
119
+ | 8 · Docs | rewrite `docs/modules-contract.md` + index sweep | plugin-API contract + module-author recipe; CLAUDE.md / file-map / architecture / ADR README | scaffolder, all moves |
120
+ | 8 · Proof | live demonstration | scaffold a throwaway module via `bongos module new`, mount it, ship it, OTB byte-identical; fitness catches a deliberate cross-module import | all moves, scaffolder |
121
+ | 9 · Follow-on | task→module affinity | `task.module`; module-disjoint parallel-safety; retire `touches[]`; module-scoped agent context | full roster moved |
122
+
123
+ **Proof of equivalence at every step** (as in ADR 0062's core/host split): after moving a module, OTB behaves **byte-for-byte the same**. That is the per-phase done-when.
124
+
125
+ ---
126
+
127
+ ## Consequences
128
+
129
+ **Positive.** The architecture becomes self-maintaining (fitness ratchet); AI agents get module-scoped context (higher quality, lower token cost — the research's biggest lever); a host can add/configure modules without forking core (the defining Cloud Bongos capability); parallel-safety gets cleaner (module-disjointness); the trust boundary is *extended* to module routes, never weakened. Each phase ships independently and is individually revertible — merging two modules back is cheap, the ratchet makes splitting safe, so the first cut is never a lock-in.
130
+
131
+ **Negative / cost.** ~16 boundaries to enforce (mitigated: fitness does it, not reviewers; start coarse). More ceremony per module (a manifest, a nested CLAUDE.md, maybe a seam). The lifecycle state machine must **not** be force-split (the one warning — [02 §4](../design/modular-architecture/02-module-map.md)). Several phases touch gate-protected surfaces (`migrate.sh` HARD-FLOOR, `routes.js`/`server.js`/`fitness.js`/`module-api.js` core trust surfaces) → owner Gate approval + admin-merge are expected on those PRs; this is the boundary working as designed, not friction to remove.
132
+
133
+ **Neutral.** Single-package / single-process / no-bundler are explicitly preserved; `start` stays `node server.js`. The future forks (packages, process isolation, per-module build) remain open and are deliberately *not* taken now.
134
+
135
+ ---
136
+
137
+ ## Alternatives considered
138
+
139
+ - **Ground-up rewrite — rejected.** Re-derives the sound parts (auth, ranks, tasks/claims/credits, grader, ship pipeline, ~143 migrations) for no modularity win, with an upside-down risk profile (long no-ship window → big-bang cutover) for a bootstrapped, ship-small, AI-first project ([01 §5](../design/modular-architecture/01-architecture.md)).
140
+ - **Coarse config A (~5 units, ADR 0080-as-written) — partially adopted as the *first* step, not the destination.** Proves the loader cheaply, but leaves ~70% of code a blob so AI-scoping barely improves. We ship A then peel medium ([02 §3](../design/modular-architecture/02-module-map.md)).
141
+ - **Fine config C (~22+ units, a module per route-group) — rejected.** Fights cohesion (tasks/claims/credits belong together), manifest sprawl, over-engineered for a small team. "As modular as the evidence supports, no finer."
142
+ - **Nx / Turborepo / Bazel / workspaces — rejected (for now).** Adds a build/link step for dependency-tree + caching benefits a single-process no-bundler app doesn't need ([00 §8](../design/modular-architecture/00-research-report.md)). In-repo `modules/<key>/` + a manifest + the existing `fitness.js` is the right lightweight choice; `eslint-plugin-boundaries` is the documented escape hatch if import-graph checks outgrow `fitness.js`.
143
+ - **In-process plugin sandboxing — deferred (the standard call).** First-party modules are trusted for *process safety*; the boundary that matters (**authz**) is enforced by composition (the loader owns the mount + wraps every entry behind auth the module can't remove) and fitness — *stronger* than Backstage/VS Code treat first-party plugins. True process isolation is the future fork for untrusted modules ([00 §4b](../design/modular-architecture/00-research-report.md)).
@@ -0,0 +1,86 @@
1
+ # 0084 — Auto-derived per-task rank floor (every task is rank-scoped; the claim gate bites)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-23
5
+ - **Deciders:** Lars (Archon), Claude
6
+
7
+ ## Context
8
+
9
+ Builders must not be able to claim tasks above their rank, and every task should
10
+ carry a deliberate rank criterion (Lars's directive, 2026-06-23). The *mechanism*
11
+ for the gate already existed and was sound: `tasks.requires_rank` (V3.R82, migration
12
+ 044; widened to include `thetes` in 068) plus a claim-time check in `db.claimTask` /
13
+ `claimTasksBatch` (`rankAllowsTask` → `INSUFFICIENT_RANK` 403) and a belt-and-braces
14
+ filter in `listClaimableTasks` that hides over-rank tasks from `/builder-start`.
15
+
16
+ But the gate never bit. Nothing ever *set* `requires_rank`: `POST /tasks` didn't
17
+ accept it, `createTask` didn't write it (so the column took its `NOT NULL DEFAULT
18
+ 'xenos'`), `PATCH /tasks/:id` couldn't edit it, and the planning-session skill never
19
+ emitted it. Net effect: essentially every task sat at `requires_rank='xenos'` — the
20
+ floor — so any builder at `thetes` or above could claim anything. The column was
21
+ inert; the gate guarded nothing. The hall didn't even display a task's required rank.
22
+
23
+ ## Decision
24
+
25
+ We will make a task's rank floor **auto-derived, always-set, overridable upward, and
26
+ visible**, and backfill the existing board.
27
+
28
+ - **Derive** the floor from what a task touches plus its sensitivity, reusing the
29
+ *same* protected-path matcher the trust boundary uses
30
+ (`permission-path-check.matchProtected`, ADR 0043).
31
+ `deriveRequiredRank(touches, securitySensitive)`: `security_sensitive` OR any touch
32
+ hitting a `PROTECTED_GLOB` ⇒ `metic`; everything else ⇒ `xenos`. One source of truth
33
+ for "this is sensitive" — the rank/authz/ship-grade/deploy/migration core (exactly
34
+ the paths a sub-Metic builder already cannot push to) floors at Metic; game / art /
35
+ docs / UI work stays open. The rule **never auto-assigns `archon`** — "only the
36
+ Archon may claim this" is a deliberate human statement, not something to infer.
37
+ - **Compose with an override** via `highestRank(floor, requested)`: the stored
38
+ `requires_rank` is always `max(floor, requested)`. An explicit value (on create, or
39
+ via `PATCH /tasks/:id`, Archon-only) can only **raise** the bar; a request below the
40
+ derived floor is clamped up (fail-closed). Flipping `security_sensitive` on ratchets
41
+ the floor up in the same atomic UPDATE; it never lowers a floor (an Archon can PATCH
42
+ down to the derived floor explicitly if a task was over-gated).
43
+ - **Backfill** (migration 145): every non-terminal task whose `requires_rank` is still
44
+ the `xenos` default rises to `metic` when it is `security_sensitive` or its `touches`
45
+ overlap the protected set. The SQL conditions are generated faithfully from
46
+ `PROTECTED_GLOBS` (all exact-file or dir-prefix, no wildcards), idempotent, raise-only.
47
+ - **Surface** the floor as a pill on the builders-hall task card when it is above
48
+ `xenos`.
49
+
50
+ ## Alternatives considered
51
+
52
+ - **Manual rank at scoping** (the planner picks per task; create requires it). Rejected
53
+ as the *primary* mechanism: it is exactly what silently failed — an optional field
54
+ nobody filled, so the whole board drifted to the floor. Discipline does not scale;
55
+ structure does. (Manual override *upward* is kept, on top of the derived floor.)
56
+ - **Just raise the column default** (unset ⇒ gated higher). Rejected: crude — it would
57
+ gate trivial game/art work behind Metic and empty the newcomer/general queue,
58
+ inverting the intent. The sensitivity signal must come from the task, not a blanket
59
+ default.
60
+ - **A second sensitivity list for ranks** (independent of the trust boundary). Rejected:
61
+ two lists drift — the SEC [#863](https://example.com/builders#/task/863) failure mode. Reusing `matchProtected` means the claim
62
+ floor and the git-push floor can never disagree.
63
+ - **Auto-assign `archon` to the most sensitive paths.** Rejected: an `archon` floor
64
+ means only the owner can ever claim that task, which would starve the board; Metic is
65
+ the right "trusted working rank" floor, and `archon` stays a deliberate manual override.
66
+
67
+ ## Consequences
68
+
69
+ - Every task now carries a deliberate, enforced rank floor; the existing claim gate
70
+ (`INSUFFICIENT_RANK`) and the `/builder-start` hide finally bite. The change is purely
71
+ in *setting* `requires_rank` — the enforcement code is untouched, and its tests
72
+ (`tests/rank_gate.mjs`) still pass, now extended with `deriveRequiredRank` /
73
+ `highestRank` cases.
74
+ - The claim floor and the ADR 0043 git-push floor share one matcher, so a task a
75
+ sub-Metic builder could not push is also one they cannot claim — coherent by
76
+ construction.
77
+ - The migration-145 SQL is a *snapshot* of `PROTECTED_GLOBS`; if a wildcard glob is ever
78
+ added, the historical snapshot will not change (new/edited tasks re-derive through the
79
+ JS helper, which is authoritative). The generator asserts no-wildcard to keep the
80
+ snapshot exact.
81
+ - An Archon can still gate a task to `archon` by hand (`PATCH requires_rank=archon`) when
82
+ a task genuinely should be owner-only.
83
+ - This is a trust-boundary-adjacent change (it sets the per-task claim floor); it rides
84
+ the gate-review hard floor (ADR 0043) and is Archon-authored. See
85
+ [`docs/canonical-permissions.md`](../canonical-permissions.md) (the per-task floor
86
+ section) for the mirror.
@@ -0,0 +1,39 @@
1
+ # ADR 0085 — Builders are uncapped by default (remove the default per-builder monthly spend cap)
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-23
5
+ - **Track:** internal
6
+ - **Builds on:** [ADR 0016](<redacted>.md) (the Archon override stays server-enforced), [ADR 0054](<redacted>.md) (session token cost — the spend this cap measured)
7
+ - **Reverses:** the default-cap half of GDS-V3 criterion **C3** (V3.R84, task [#302](https://example.com/builders#/task/302) — "per-builder monthly budget, Archon-configurable")
8
+ - **Task:** [#1499](https://example.com/builders#/task/1499)
9
+
10
+ ## Context
11
+
12
+ GDS-V3 criterion C3 (task 302) gave every builder a **month-to-date spend cap**: `cost_log` API/compute spend attributed to the builder since `date_trunc('month', now())`, compared against `builders.monthly_budget_usd`. When that column is `NULL` (the normal case), `classifyCostStatus()` fell back to a project-wide default of **$50/month**. At 100% the builder's `/me` `cost.level` flips to `'over'`, which **hard-blocks `/builder-ship` (before the grader runs) and the art pipeline**. An Archon could raise a specific builder's ceiling via `PATCH /builders/:id/budget`.
13
+
14
+ The default was framed in-code as "catch a runaway, not ration normal work." In practice it did the opposite. The dominant entry in a builder's `cost_log` is `session:<redacted> — **the API cost of running the assistant to do the work itself** (auto-captured per [ADR 0028](<redacted>.md)). On Opus, a handful of real sessions costs more than $50:
15
+
16
+ - Builder 95 (Jackson Rini), created 2026-06-22, hit `over` on day two: **$69.32 MTD across 5 interactive sessions** (largest single session $24.86) vs the $50 default. He was blocked from shipping anything — and every further session he ran to *try* to work pushed him deeper over, since the cost of working is itself the metered quantity.
17
+
18
+ So the default cap blocked the exact activity it was meant to enable, and would stall **every** productive new builder within a day or two — a structural newcomer trap, not a runaway guard. The owner's directive: *"Builders should have no budget limitations. Remove the default spend cap entirely."*
19
+
20
+ We considered fuller removal (delete the column, the override endpoint, and all blocking) but the owner chose to **keep a manual brake**: removing the *default* satisfies "no budget limitations" (no builder is capped unless someone deliberately caps them), while retaining the Archon override as a rarely-needed emergency stop on a genuine runaway — consistent with the project's $5K annual budget.
21
+
22
+ ## Decision
23
+
24
+ **A builder with no explicit budget is uncapped.** `classifyCostStatus(spend, budget)` no longer falls back to a default:
25
+
26
+ - `budget` is `NULL` / non-finite / `<= 0` → **uncapped**: returns `level: 'ok'`, `budget_mtd_usd: null`, `pct_used: 0`. Nothing blocks. The `DEFAULT_MONTHLY_BUDGET_USD = 50` constant is **removed**.
27
+ - `budget` is a **positive number** (an explicit Archon override via `PATCH /builders/:id/budget`) → unchanged: `warn` at ≥80%, `over` at ≥100%, which still blocks ship + art. This is the manual brake.
28
+
29
+ Spend is **still recorded and surfaced** — the per-builder `cost_log` rows, the `/public/cost-summary` dashboard, and the `/me` `cost` object are all unchanged. This ADR removes *blocking*, not *observability*; the $5K pool is still fully visible.
30
+
31
+ No schema change (`monthly_budget_usd` stays; `NULL` now means "uncapped" instead of "use the $50 default"). The only behavioral surface is the pure `classifyCostStatus`; every consumer (ship.js, art `cost_ledger.py`, the CLI session ping, the hall banner) already keys off `level`/`budget_mtd_usd`, so they need no logic change — an uncapped builder simply never trips them.
32
+
33
+ ## Consequences
34
+
35
+ - **Builders are unblocked by default.** No new builder stalls on their own session cost. Existing over-budget builders (e.g. Jackson Rini) are immediately unblocked with no operator action.
36
+ - **The brake survives.** An Archon can still cap a specific runaway builder by setting a positive `monthly_budget_usd`; clearing it (`null`) returns them to uncapped.
37
+ - **Cost stays honest.** Spend attribution, the savings ledger, and the public dashboard are untouched — we still see exactly where the $5K goes; we just don't gate work on it.
38
+ - **Project-wide guards are unaffected.** The separate autonomous-fleet spend brake (`autonomy-gate.js`, `OTB_AUTONOMY_CEILING_USD`) and the art-pipeline `HARD_STOP_USD` ledger cap are independent mechanisms and remain in force.
39
+ - **C3's intent narrows** from "every builder has a default ceiling" to "a ceiling is an opt-in, per-builder Archon tool." The onboarding drachmae/karma diagram note is updated to match.
@@ -0,0 +1,123 @@
1
+ # 0086 — Goal-scoped work hierarchy: assign goals, not tasks
2
+
3
+ - **Status:** Accepted (design recorded; build is task-pending via a planning session)
4
+ - **Date:** 2026-06-23
5
+ - **Deciders:** Lars (Archon), Claude
6
+
7
+ **Builds on:** [ADR 0016](<redacted>.md) (server-enforced rank boundary), [ADR 0025](<redacted>.md) (structured criterion↔task link), [ADR 0043](<redacted>.md) (protected paths + rank floor), [ADR 0049](<redacted>.md) (`touches[]` advisory), [ADR 0062](<redacted>.md) (instance/host decoupling — the config-preset pattern), [ADR 0083](<redacted>.md) (modular architecture — "a task is scoped to a module"), [ADR 0084](<redacted>.md) (auto-derived per-task rank floor), [ADR 0015](<redacted>.md) (task dependencies + auto-promotion), [ADR 0054](<redacted>.md) (cost-plus reward).
8
+
9
+ **Track:** `internal` (GDS / methodology — a Cloud Bongos platform capability).
10
+
11
+ ---
12
+
13
+ ## Context
14
+
15
+ Today only the Archon can create or edit tasks — `POST /tasks` and `PATCH /tasks/:id` are both `requireRank('archon')` ([`src/bongos/routes/tasks.js`](../../src/bongos/routes/tasks.js)). Lower-ranking builders (`xenos`, `thetes`) can only **file ideas** into `idea_inbox`; they have no ability to shape their own work toward an objective.
16
+
17
+ > **Update (2026-06-26, [ADR 0090](<redacted>.md)):** `POST /tasks` / `PATCH /tasks/:id` are now `requireRank('metic','archon')` — a *Metic* may author tasks directly. This ADR's goal-scoped, module-fenced authoring path (`POST /goals/:id/tasks`) is now the mechanism for **sub-Metic** ranks (`xenos`/`thetes`) specifically; everything below about the scope-subset wall and protected-path block is unchanged and still governs that path. Every task must be hand-authored by the owner first — a delegation bottleneck that wastes capable builders' judgment, and the opposite of the AI-first norm where agents do the building.
18
+
19
+ Lars's directive (2026-06-23): **stop assigning individual *tasks*; assign *goals*.** A builder working toward a goal should be able to **author and organize their own tasks** beneath it — but only within a **module scope** they cannot exceed, and never in a way that lets someone "pick a goal and then create tasks that hack stuff."
20
+
21
+ This slots directly into the modular architecture: [ADR 0083](<redacted>.md) Rule 5 already states *"a task is scoped to a module."* Goals are the mechanism that turns that rule into a **live, enforced permission** rather than a convention.
22
+
23
+ The structure decided over a design session is a six-tier hierarchy — most of which **already exists** in the GDS. Only **Goal** is a genuinely new tier:
24
+
25
+ | Tier | What it is | In the system today |
26
+ |---|---|---|
27
+ | **Project** | the instance itself (Example) | implicit (one project per install) — becomes a config preset |
28
+ | **Version** | a scope phase that sets goals | ✅ `versions` |
29
+ | **Goal** | a shared, module-scoped workspace | 🆕 **the one new tier** |
30
+ | **Criteria** | the tests for "goal met" | ✅ `done_when_criteria` — re-parented version → goal |
31
+ | **Task** | work fulfilling a criterion | ✅ `tasks` (link to criteria via `task_criteria`) |
32
+ | **Sub-task** | a task broken down | ✅ `tasks.parent_task_id` (one level) |
33
+
34
+ ---
35
+
36
+ ## Decision
37
+
38
+ **We will introduce a `goal` tier and reorganize work tracking into a six-level hierarchy — Project → Version → Goal → Criteria → Task → Sub-task — whose *structure* is a per-instance config preset (owner-set at onboarding) and whose *enforcement* is core. A goal is a shared, joinable, module-scoped workspace: joining it grants bounded authority to author tasks within the goal's modules, with scope set by a trusted rank and never self-granted.**
39
+
40
+ ### 1. The hierarchy is a configurable preset (onboarding)
41
+
42
+ The tier set is host-configured, not hardcoded — the [ADR 0062](<redacted>.md) core/host pattern applied to the work model.
43
+
44
+ - A new **`config/hierarchy.json`** (joins `branding.json` / `modules.json` as host config; loaded by a `hierarchy-config.js` mirroring `src/modules.js`) declares the tiers — names, order, and which tier carries **scope**, **membership**, and **criteria**. Example ships the six-tier preset above; the project owner fills/edits it **during onboarding**.
45
+ - **v1 scope of "editable":** the standard tier set with owner-set labels, enable/disable, and which tier owns scope/criteria/membership. Fully *arbitrary* custom tier graphs are a later extension — explicitly not built now.
46
+
47
+ ### 2. The Goal tier (shared, module-scoped) + criteria re-parenting
48
+
49
+ - **New `goals` table** — sits between `versions` and `done_when_criteria`. New (not `parent_task_id`: one-level, task lifecycle; not `done_when_criteria`: that *is* the criteria tier). Carries: `version_id`, `title`/`description`, **`scope_modules text[]`** (the wall), `status` (`open|achieved|archived`), `created_by`, `succeeded_by_goal_id` (rescope carry-forward).
50
+ - **Goals are shared, not owned** — a new **`goal_members`** table (many builders ↔ one goal; `lead`/`member` roles). **Membership**, not a single assignee, is what grants bounded task authoring.
51
+ - **Criteria re-parent under goals** — `done_when_criteria` gains a `goal_id` (backfill existing version criteria under a per-version default goal). A version is "done" when all its goals are achieved; the `/status` rollup becomes **Version → Goals → Criteria → Tasks** (extends [ADR 0025](<redacted>.md)).
52
+ - **Tasks** gain `goal_id`; sub-tasks remain `parent_task_id`; a task fulfils a criterion via the existing `task_criteria` link.
53
+
54
+ ### 3. Bounded task authoring (membership grants it; the create-time gate)
55
+
56
+ - **`POST /goals`** — `requireRank('metic','archon')`; **Archon-only when `scope_modules` includes a `protected` module.**
57
+ - **`POST /goals/:id/join` / `leave`** — open join for normal goals; **joining a sensitive-scope goal needs Archon approval** (reuse the access-request pattern, [`access-requests.js`](../../src/bongos/routes/access-requests.js)).
58
+ - **`POST /goals/:id/tasks`** — `requireBuilder` + an in-handler gate (the maneuverability grant), ordered + fail-closed: goal `open` and **caller is a member** (or Archon); version guards reused from `POST /tasks`; **scope subset** — every `touches[]` element covered by the goal's `scope_modules` globs (`touchesOverlap`, [`path-match.js`](../../src/bongos/path-match.js)); **protected-path block** — `checkPermissionPaths` ([`permission-path-check.js`](../../src/bongos/permission-path-check.js)) so a sub-Metic member cannot author a task touching the protected core; then `db.createTask` stamping `goal_id`. `POST /tasks` / `PATCH /tasks/:id` stay byte-identical (Archon-only) for ungoverned creation.
59
+ - **Rank floor is auto-derived, not a bespoke cap.** Per [ADR 0084](<redacted>.md), a created task's `requires_rank` is auto-derived from its touches + sensitivity (`deriveRequiredRank` → `metic` for protected/sensitive, else `xenos`) and can only be raised. So a goal member need not (and cannot) self-set a rank that escapes their own gate — and a sensitive task auto-floors to `metic`, which a sub-Metic author could not claim. No new cap mechanism; this composes with the one that already exists.
60
+
61
+ ### 4. The scope wall (set by the planner, never self-granted; "ask to widen")
62
+
63
+ - **New `src/bongos/module-scope-map.js`** — each module key → its path globs + a `protected` flag, for the full ~16-module roster from the [modular-architecture design](../design/modular-architecture/02-module-map.md). `protected: true` where globs intersect `PROTECTED_GLOBS` ([ADR 0043](<redacted>.md)) — the lifecycle/ship-pipeline, migrations, security, authz core. It **auto-tightens** as [ADR 0083](<redacted>.md) moves code into `modules/<key>/`, converging on that ADR's task→module affinity (where `touches[]` retires in favour of the module label + a ship-time diff⊆module check). The carve precedes the feature (Lars: "carve more modules first").
64
+ - A goal's `scope_modules` is set by the assigner at planning time — the **one moment scope is defined**, which is precisely why it is **never self-granted**. Widening goes through a request a trusted rank approves (Archon for a protected module).
65
+
66
+ ### 5. Dependencies
67
+
68
+ - **One polymorphic "blocked-until-done" edge** — a new `dependencies(from_kind, from_id, to_kind, to_id)` over `{task, goal, criterion}`; the existing `tasks.dependencies[]` (task→task) migrates in. "Done" = task/sub-task `shipped`, criterion `satisfied`, goal `achieved`.
69
+ - **One enforcement point** — it resolves down to the existing **claim gate** ([ADR 0015](<redacted>.md)): claiming a task checks its own deps plus deps inherited from its goal/criterion; achieving/shipping a node auto-promotes its dependents.
70
+ - **Cross-goal and cross-version is allowed** (Lars, 2026-06-23). A dependency is a **reference, not a grant** — it never widens module scope, so cross-module deps are safe; cross-goal deps become the visible coordination contract between two shared workspaces. Containment (the tree) is never a dependency; the graph is acyclic.
71
+
72
+ ### 6. Achievement (auto-flag → planner review → auto-achieve) + lifecycle
73
+
74
+ - **Auto-flag.** When every task linked to a criterion has shipped, the server **auto-flags that criterion "met — pending review"** — deterministic, from the `task_criteria` links + ship status, no manual propose step (a `pending_review` flag; the existing `satisfied` bool is set on confirm).
75
+ - **Planner reviews, obviously and triage-style.** Flagged criteria surface as a clear review queue, walked one-at-a-time via a new **`/goal-review` skill** that mirrors `/idea-triage` (confirm / reject / note). The **planner (Metic+)** confirms — resolving "who confirms" so the Archon is not in every goal's closing loop. (This re-ranks the existing criterion-satisfy route from Archon-only to Metic+.) Confirming a goal's last criterion **auto-flips the goal `open → achieved`**.
76
+ - **Lifecycle / rescope.** `open → achieved → archived` (archived is re-openable). The same `/goal-review` cadence dispositions achieved goals (archive vs carry forward). At version rescope (next `/planning-session`), achieved goals are carried forward (`succeeded_by_goal_id`) or replaced — "previous or new" at each tier.
77
+ - **`/planning-session` becomes the scope phase, levelled up:** it defines a version's **goals**, each with its **criteria** and **module scope** (and optional seed tasks/join policy), uploaded atomically as today; sensitive-scope goals get Archon sign-off there.
78
+
79
+ ### 7. How the boundary holds (reuse + defense-in-depth)
80
+
81
+ The create-time gate sees only *declared* touches (advisory — git merge is the real collision detector, [ADR 0049](<redacted>.md)), so it is the first filter, **not** the enforcement boundary. The existing **ship-time gates remain authoritative on the real diff**: the grader's `permissionPathPrePass`/`routeRankPrePass` + `serverSideGuards` ([`grader.js`](../../src/bongos/grader.js)), the `gate-review` ESCALATE floor, and the post-push `main-audit`. A mis-declared task still cannot *merge* if its real diff hits protected paths. Two CI fitness checks ([`fitness.js`](../../scripts/gds/fitness.js)) guard drift: goal routes are pinned in `route-rank-check.EXPECTED_RANKS`, and the scope code must *import* `PROTECTED_GLOBS`, never re-declare it.
82
+
83
+ ### Deferred (explicit non-decisions)
84
+
85
+ - **Rewards** — whether *achieving a goal* earns anything beyond the per-task cost-plus already paid ([ADR 0054](<redacted>.md)), and how any reward splits among a goal's members. The leaning is karma by default (budget-safe, since drachmae are real money) with contribution-weighted splits, but this is **not yet decided** and rides a follow-on.
86
+ - **A sub-Metic builder joining a protected-scope goal** — letting a newcomer work *inside* the dangerous core under a tightly-scoped, Archon-granted goal amends the [ADR 0043](<redacted>.md) hard floor (and needs the ship-time gates to become goal-aware). Deliberately **last**, behind its own security-reviewed ADR. Until then, protected-scope goals require a Metic+ holder.
87
+ - **An AI relevance / anti-hack judge** at create/claim time (reusing the grader subagent harness; advisory-first, flag-for-Metic, never hard-blocking a newcomer) — a later phase; the deterministic scope + protected-path gates ship first.
88
+
89
+ ---
90
+
91
+ ## The build plan (phases → planning-session tasks)
92
+
93
+ Each phase ships independently; implementing tasks are created via `/planning-session` under the live internal version (a criterion cluster alongside the [ADR 0083](<redacted>.md) BV1 module work).
94
+
95
+ | Phase | Delivers | Depends on |
96
+ |---|---|---|
97
+ | 1 · Carve + config | `module-scope-map.js` (roster + `protected` flags); `config/hierarchy.json` + `hierarchy-config.js` (preset, onboarding-edited) | — |
98
+ | 2 · Goal entity | migration (`goals`, `goal_members`, `done_when_criteria.goal_id` + backfill, `tasks.goal_id`); `db.js` helpers; `/status` rollup through goals; join/leave + goal view + `?goal_id=` filter | 1 |
99
+ | 3 · Bounded authoring | `goal-scope-check.js` (pure); `routes/goals.js` create gate; sub-tasks; fitness checks; abuse-matrix tests | 1, 2 |
100
+ | 4 · Deps + achievement | polymorphic `dependencies` + claim-gate resolution; criterion auto-flag → `/goal-review` (confirm/reject) → goal auto-achieve; archive/reopen + rescope carry-forward; "ask to widen"; ideas-promote-to-any-tier | 2, 3 |
101
+ | 5 · (own ADR) | AI relevance judge; sub-Metic membership in protected-scope goals | 3, 4 |
102
+
103
+ ---
104
+
105
+ ## Alternatives considered
106
+
107
+ - **Reuse `parent_task_id` for goals (a goal = a parent task) — rejected.** One-level cap ([`hierarchy.js`](../../src/bongos/hierarchy.js)), wrong lifecycle (a goal is a standing grant, not shippable work that earns credit on ship), and a task has no place for scope or membership.
108
+ - **Reuse `done_when_criteria` as goals — rejected.** That table *is* the criteria tier; overloading it with membership + a creation grant conflates "definition of done" with "who may do work." A goal *links to* criteria; it is not one.
109
+ - **Single-owner goals — rejected** (Lars). Goals are shared workspaces; a single assignee would force mega-claims and block collaboration. Membership grants the authority; contribution (not membership alone) is what any future reward weights on.
110
+ - **A bespoke per-task rank cap at goal-create — rejected in favour of [ADR 0084](<redacted>.md).** The auto-derived floor already prevents a member minting a task that escapes their gate; a second mechanism would be a second list that drifts (the SEC [#863](https://example.com/builders#/task/863) failure mode).
111
+ - **Restrict dependencies to within a single goal — rejected** (Lars). Real dependencies cross goals; self-containment forces mega-goals or fakery. A dependency is only a reference, so cross-goal is safe and surfaces coordination.
112
+ - **Hard-code the hierarchy / build a full tier-editor UI now — both rejected.** A config preset edited at onboarding (the [ADR 0062](<redacted>.md) pattern) is the right middle: configurable per instance without a heavy runtime editor.
113
+ - **Open task creation to all ranks generally (no goal) — rejected.** That removes the scope wall entirely; the whole safety model is that authority is *bounded by an assigned goal's modules*, not granted by rank alone.
114
+
115
+ ---
116
+
117
+ ## Consequences
118
+
119
+ **Positive.** Lower-rank builders gain real maneuverability (author + organize their own work) without weakening the trust boundary — authority is bounded by an assigned, module-scoped goal and enforced server-side. It fills [ADR 0083](<redacted>.md) Rule 5 and reuses almost everything (versions, criteria, tasks, sub-tasks, the protected-path matcher, the auto-derived rank floor, the dependency/auto-promotion engine, the access-request pattern, the idea-triage cadence shape). The "carve more modules first" map is also an ADR-0083 deliverable. Each phase ships independently and is individually revertible.
120
+
121
+ **Negative / cost.** Schema changes to two core tables (`done_when_criteria` re-parenting under goals; `tasks.goal_id`) plus new `goals`/`goal_members`/`dependencies` tables and a criteria backfill — touches the lifecycle/`migrations` core, so those PRs ride the gate hard-floor and need owner sign-off (the boundary working as designed). The `/status` rollup, `/planning-session`, and the criterion-satisfy route all change. It is a deliberate **widening of the trust boundary** (sub-Metic builders can now create tasks), justified by the layered scope + protected-path + auto-rank-floor + ship-gate defenses; that widening is exactly why this is its own ADR.
122
+
123
+ **Neutral.** The reward model and sub-Metic-in-protected-scope membership are deferred to follow-ons; until they land, behavior is conservative (no goal bonus; protected-scope goals need a Metic+ holder). The configurable hierarchy ships as a preset; arbitrary tier graphs remain a future fork, not foreclosed.
@@ -0,0 +1,49 @@
1
+ # ADR 0087 — Bongos app architecture + the model-agnostic feedback handoff contract
2
+
3
+ **Date:** 2026-06-26
4
+ **Context:** Bongos App `BONGOS-V1` / criterion C4 (the feedback loop closes — capture lands in a coding agent), task [#1312](https://example.com/builders#/task/1312) (`BV1.R33`). Records the architecture the R01–R14 rungs built and pins the contract the three handoff paths (R12 [#1307](https://example.com/builders#/task/1307), R13 [#1308](https://example.com/builders#/task/1308), R14 [#1309](https://example.com/builders#/task/1309)) share. Builds on [ADR 0045](<redacted>.md) (the Dev Box desktop app, now absorbed), [ADR 0072](<redacted>.md) (signing posture), [ADR 0083](<redacted>.md) (the modular core), and the [ADR 0062](<redacted>.md) core↔host split.
5
+ **Status:** Accepted.
6
+ **Track:** `internal` (development system → the Cloud Bongos desktop app line; bongos succeeds the GDS as the primary builder surface after GDS-V4).
7
+
8
+ ## Problem — feedback has nowhere to land
9
+
10
+ The whole point of the Bongos app is to shrink the distance between "I see something wrong on screen" and "a coding agent is fixing it." A builder records a short spoken walkthrough — *"this header is wrong, see the spacing, fix this"* — drawing on the screen as they talk. The app already turns that into a tight, model-agnostic `prompt.md` + a handful of screenshots (R06–R11). But a bundle sitting in `~/CloudBongos/feedback/` is inert. The missing half is the **handoff**: getting that bundle *into* a Claude session, reliably, across the two surfaces a builder actually uses (Claude Desktop and Claude Code) — without fighting the CLI's unreliable clipboard-image paste.
11
+
12
+ This ADR records (a) the app's overall shape, and (b) the one contract all the handoff paths agree on, so a fourth path (Cursor, Codex, a future agent) can be added without redesign.
13
+
14
+ ## The architecture (what R01–R14 built)
15
+
16
+ **One umbrella desktop app that absorbs the Dev Box app.** `bongos-app/` is the single signed Cloud Bongos desktop app ([#1298](https://example.com/builders#/task/1298)). The existing Dev Box app ([ADR 0045](<redacted>.md)) becomes a *module* of it rather than a sibling install — one Electron shell, one app-pairing auth (`~/.config/otb/gds-session.json`), one branded `/downloads` distribution, one in-app updater, one Apple Developer ID ([ADR 0072](<redacted>.md)). The result offers both the Dev Box switch and the new feedback toolbar.
17
+
18
+ **A three-stage pipeline: capture → synthesize → handoff.**
19
+
20
+ 1. **Capture** (R04–R09) — a Zoom-style floating, click-through overlay toolbar over any target. Screen/window + mic capture (R06), a snapshot grabber (R07), freeze-frame markup (R08), and on-device Whisper transcription (R09). The three raw streams (word-timestamped transcript, timestamped frames, markup moments) are collected in the renderer.
21
+ 2. **Synthesize** (R10–R11) — `timeline.js` aligns the three streams onto one millisecond clock and runs a salience pass that escalates only the frames the speech points at (deictic words) or the user marked up; `bundle.js` assembles the aligned timeline into one deterministic, model-agnostic `prompt.md` + the escalated frame images, written to `~/CloudBongos/feedback/<id>/`.
22
+ 3. **Handoff** (R12–R14) — the three documented ways that bundle reaches a coding agent (below).
23
+
24
+ **The Rung-3 capture floor; element-select deferred to V2.** V1 captures at the **visual** rung — pixels (screen region + frames + freeze-frame markup) plus voice. This is the robust floor: it works over *any* app on screen with no per-app integration, and needs only Screen-Recording + Microphone grants. Higher-fidelity **element-level reads** (resolving the actual UI element under the cursor via macOS Accessibility / a DOM bridge — the "rung-2" reads) are **deferred to V2**: the permission wizard (R05) requests Accessibility *lazily*, only when those reads land, never up front. Capturing pixels-not-elements is a deliberate V1 scope cut, not an accident — it keeps V1 universal and the permission ask minimal.
25
+
26
+ **Bongos as the GDS successor.** The longer arc ([ADR 0072](<redacted>.md) track line): the Bongos app is where building moves *after* GDS-V4 — the feedback loop (see → say → ship) becomes the primary way an owner directs AI builders, with the GDS's task/claim/ship machinery underneath. This ADR is the first architectural record of that intent.
27
+
28
+ ## Decision — the model-agnostic handoff contract
29
+
30
+ **A bundle is a self-contained directory; every image is referenced by absolute file path, never inlined.** That single rule is the contract. `~/CloudBongos/feedback/<id>/` holds `prompt.md` (a timestamped transcript walkthrough + the ask, with each screenshot referenced as `![caption](/abs/path.png)`) and the escalated frame images. Because the images are *paths*, the text prompt stays tiny (~5–11k tokens for a typical 1–3 min session) and **any** agent can open them with its own file-read — Claude Code's Read tool, Claude Desktop's drag-in, a future Cursor/Codex adapter. No base64, no decoding, no per-agent payload format. The full format is documented in [`bongos-app/README.md`](../../bongos-app/README.md).
31
+
32
+ **One shared `latest` pointer; three readers.** Every write of a bundle (`bundle.js writeBundle`) records it as `latest` — an atomic `latest.json` pointer plus a best-effort `latest/` symlink — in `bongos-app/src/handoff.js`. All three handoff paths resolve "the newest bundle" through that one `resolveLatest()`, so they can never drift:
33
+
34
+ 1. **Claude Desktop — file-bundle + clipboard (R12).** A toolbar button copies `prompt.md` to the clipboard and opens the bundle folder; the user pastes the prompt and drags the images into the composer (Desktop accepts mixed text + images). A one-liner spells out exactly what to do. (`handoff.js` + the `feedback:produce` / `feedback:handoff-desktop` IPC in `main.js`.)
35
+ 2. **Claude Code — the `/feedback` slash command (R13).** Running `/feedback` shells `node scripts/gds/feedback-latest.js`, which prints the `prompt.md` body + the absolute path of every frame; Claude then `Read`s each path so the screenshots enter context. This sidesteps the CLI's unreliable clipboard-image paste — Claude reads the frames from disk, not from a pasted blob.
36
+ 3. **MCP — `get_latest_feedback` (R14, optional "direct" path).** A local, zero-dependency stdio MCP server (`bongos-app/src/mcp-server.js`, launched by `scripts/bongos-mcp.js`) exposes one tool that returns the prompt text + the screenshots' **file paths** (never base64 — inlining would blow the MCP tool-result size cap). Both Desktop and Code can pull the latest bundle hands-free once the server is registered. Optional/stretch for V1 — the file-bundle + `/feedback` paths already close the loop.
37
+
38
+ ### Why hand-rolled MCP (no SDK dependency)
39
+
40
+ MCP's stdio transport is newline-delimited JSON-RPC 2.0. The four methods a single read-only tool needs (`initialize`, `tools/list`, `tools/call`, `ping`) are ~100 lines, so we implement them directly rather than bundle the MCP SDK into the Electron app. This keeps the app's install size + dependency surface flat ([CLAUDE.md §4](../../CLAUDE.md) cost discipline) and makes the server testable with no network and no extra install. v1 speaks protocol version `2024-11-05` (echoing the client's if it sends a known one) and advertises exactly the one tool.
41
+
42
+ ## Consequences
43
+
44
+ - **Adding a fourth agent is an adapter, not a redesign.** A new target (Cursor, Codex) consumes the *same* bundle via the *same* `resolveLatest()` — the contract already says "prompt text + absolute image paths." The handoff layer is the seam ([ADR 0081](<redacted>.md)'s swappable-adapter pattern, applied to feedback).
45
+ - **The `latest` pointer is the single source of truth for "newest bundle."** A reader never scans for itself unless the pointer is missing (then `resolveLatest()` self-heals by scanning for the newest dir with a `prompt.md`). `latest.json` is authoritative cross-platform; the `latest/` symlink is a convenience that may be absent on Windows without symlink privilege — readers never depend on it.
46
+ - **`writeBundle` now has a side effect beyond writing the bundle** (it records `latest`). This is intentional and best-effort: a pointer failure is swallowed and never loses the bundle already on disk.
47
+ - **Frames are paths everywhere, base64 nowhere.** Enforced by the bundle format (R11) and re-asserted by the R14 tool result + the test suite. The day an agent needs bytes, it reads the path — the cap-safe choice.
48
+ - **Element-select is the headline V2 lift.** When rung-2 element reads land, the bundle gains structured element context *alongside* the pixels; the handoff contract (paths, not payloads) does not change.
49
+ - **Budget: $0 new recurring cost.** Zero-dependency MCP, on-device transcription, local file bundles. The app rides the already-paid Apple Developer ID ([ADR 0072](<redacted>.md)).