@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,716 @@
1
+ #!/usr/bin/env bash
2
+ # C7 core-carve proof — BV1.R74 (#1578) · ADR 0091 + ADR 0093 · criterion C7 gds-core-modularized.
3
+ #
4
+ # The single live demonstration C7's tranche-1+2 hinges on. ADR 0091 extended the
5
+ # ADR 0083 strangler to the CORE itself: bound the kernel as a real artifact and
6
+ # carve the core domains out of the ~6k-LOC src/bongos/db.js monolith into
7
+ # modules/<key>/ — memory (R72), grading (R73), then economy (R77, ADR 0093:
8
+ # credits + cost ledger + streaks + achievements + leaderboard behind the `reward`
9
+ # kernel PORT) and security (R79, ADR 0093: red-team reports + bounty behind the
10
+ # `security` kernel PORT — the FEATURE; security-the-PROPERTY stays kernel) and
11
+ # builder-settings (R80, ADR 0093: the per-builder prefs domain — wandering /
12
+ # skill / sound / render — + builder-needs behind the `builder-settings` kernel
13
+ # PORT; the `GET /me` aggregator stays a thin core facade) and onboarding (R81,
14
+ # ADR 0093: the admission · onboarding-state-machine · newcomer-restock domain
15
+ # behind the `onboarding` kernel PORT — the core lifecycle/auth/profile readers
16
+ # resolve it; the access-request admission routes mount in the module). Every
17
+ # prior task asserted ITS slice; this script asserts the WHOLE claim in one
18
+ # runnable command, so "is the core-carve pattern proven?" has a yes/no answer
19
+ # anyone can re-run.
20
+ #
21
+ # It proves five things, each the done-when of the carve (ADR 0091 §1-4 + the
22
+ # "byte-for-byte the same" discipline of ADR 0083 / 0062):
23
+ # 1. memory + grading live as modules/ (valid manifests, loader-discovered,
24
+ # grading provides the `grade` port).
25
+ # 2. db.js shrank by their slices — the kernel slice (db-kernel.js) and the
26
+ # memory query slice left the monolith; grading's CAPABILITY (grader.js) is
27
+ # module-only (its grade-ATTEMPT persistence stays lifecycle, ADR 0091 §4).
28
+ # 3. the kernel is bounded + fitness green — KERNEL_FILES is the real roster
29
+ # (R70), and fitness.js has zero hard failures incl. the four C7 boundary
30
+ # checks.
31
+ # 4. a capability resolves via a kernel PORT (R73) — grading registers `grade`;
32
+ # the lifecycle resolves it via seams.resolveOptional('grade'); NO core file
33
+ # requires the grader directly.
34
+ # 5. OTB behaves byte-identically — every DB-free test that exercises a CARVED
35
+ # surface (the module system, grading + the grade port, memory/search/recall)
36
+ # passes unchanged. These are the precise behavioral evidence the carve
37
+ # changed structure, not behavior, and they are reproducible in ANY checkout.
38
+ # The comprehensive regression backstop is CI's run-unit-tests.js (the full
39
+ # 193-file gate); FULL_SUITE=1 runs that too, but note it includes infra
40
+ # tests (preview/sandbox/box) that need a live preview server + git remote
41
+ # and so only go green in a CI-like environment, not a credential-less
42
+ # worktree. SKIP_SUITE=1 skips leg 5 (structure-only, legs 1-4).
43
+ #
44
+ # Read-only. No network, no DB, no writes. Re-runnable any time; the ONGOING
45
+ # guard already lives in CI (fitness.js + run-unit-tests.js on every PR), so this
46
+ # is the consolidated demonstration, not a new gate.
47
+ #
48
+ # Usage:
49
+ # bash scripts/gds/coreB-carve-proof.sh # legs 1-4 + carve-test leg
50
+ # FULL_SUITE=1 bash scripts/gds/coreB-carve-proof.sh # also run the full CI gate
51
+ # SKIP_SUITE=1 bash scripts/gds/coreB-carve-proof.sh # legs 1-4 only (fast)
52
+
53
+ set -uo pipefail
54
+ cd "$(dirname "$0")/../.." # repo root (consistent with portability-smoke-*.sh)
55
+
56
+ PASS=0; FAIL=0
57
+ ok() { echo "PASS $1"; PASS=$((PASS+1)); }
58
+ bad() { echo "FAIL $1"; FAIL=$((FAIL+1)); }
59
+ # nrun SNIPPET: exit 0 iff the node snippet runs clean (process.exit(0)).
60
+ nrun() { node -e "$1" >/dev/null 2>&1; }
61
+
62
+ echo "=== C7 core-carve proof: memory + grading + economy + security as modules (ADR 0091 + 0093) ==="
63
+
64
+ # --- 1. memory + grading live as modules/ ------------------------------------
65
+ if nrun "const m=require('./modules/memory/module.json');process.exit(m.key==='memory'?0:1)"; then
66
+ ok "modules/memory/module.json valid (key=memory)"
67
+ else
68
+ bad "modules/memory/module.json missing or key!=memory"
69
+ fi
70
+ if nrun "const m=require('./modules/grading/module.json');process.exit(m.key==='grading'&&(m.provides||[]).includes('grade')?0:1)"; then
71
+ ok "modules/grading/module.json valid (key=grading, provides the 'grade' port)"
72
+ else
73
+ bad "modules/grading/module.json missing, key!=grading, or does not provide 'grade'"
74
+ fi
75
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('memory')&&k.includes('grading')?0:1)"; then
76
+ ok "the loader discovers both 'memory' and 'grading' as modules"
77
+ else
78
+ bad "loader does not discover both memory + grading (discoveredModuleKeys)"
79
+ fi
80
+
81
+ # --- 2. db.js shrank by their slices -----------------------------------------
82
+ [ -f src/bongos/db-kernel.js ] \
83
+ && ok "kernel db slice extracted — src/bongos/db-kernel.js (identity/audit/rank/withTx, R69)" \
84
+ || bad "src/bongos/db-kernel.js missing (the first slice to leave db.js)"
85
+
86
+ if grep -qE "builder_memory|memory_files" src/bongos/db.js 2>/dev/null; then
87
+ bad "memory domain queries still present in core src/bongos/db.js (slice did not leave)"
88
+ else
89
+ ok "memory domain queries absent from core src/bongos/db.js (slice left the monolith)"
90
+ fi
91
+ if grep -qE "builder_memory" modules/memory/memory.js 2>/dev/null; then
92
+ ok "memory domain queries now live in modules/memory/memory.js"
93
+ else
94
+ bad "memory domain queries not found in modules/memory/memory.js"
95
+ fi
96
+
97
+ # grading's CAPABILITY (the adversarial panel) is module-only; its grade-ATTEMPT
98
+ # persistence (applyGrade -> task_grades) correctly STAYS in core as lifecycle
99
+ # (ADR 0091 §4 — extract the capability, keep the state machine).
100
+ if [ -f modules/grading/grader.js ] && ! [ -f src/bongos/grader.js ]; then
101
+ ok "grading capability is module-only (modules/grading/grader.js; no core src/bongos/grader.js)"
102
+ else
103
+ bad "grader.js not cleanly module-owned (expected modules/grading/grader.js, no src/bongos/grader.js)"
104
+ fi
105
+
106
+ # --- 3. the kernel is bounded + fitness green (R70) --------------------------
107
+ if nrun "const {KERNEL_FILES:K}=require('./scripts/gds/fitness.js');process.exit(K.length>=15&&K.includes('src/bongos/db-kernel.js')&&K.includes('src/bongos/auth.js')?0:1)"; then
108
+ ok "KERNEL_FILES is the real bounded roster (incl. db-kernel.js + auth.js, not the old 6)"
109
+ else
110
+ bad "KERNEL_FILES is not the real roster (missing db-kernel.js/auth.js or too small)"
111
+ fi
112
+ if nrun "const r=require('./scripts/gds/fitness.js').runAll();process.exit(r.filter(x=>x.hardFail).length===0?0:1)"; then
113
+ ok "fitness.js: zero hard failures (the CI architecture gate is green)"
114
+ else
115
+ bad "fitness.js has hard failures (architecture boundary regressed)"
116
+ fi
117
+ if nrun "const r=require('./scripts/gds/fitness.js').runAll();const want=['core never imports a module','modules import only the published API','core carries no module code'];const ok=want.every(n=>{const c=r.find(x=>x.name===n);return c&&!c.hardFail;});process.exit(ok?0:1)"; then
118
+ ok "the three ENFORCING C7 boundary checks pass (core↮module, module→API-only, no module code in core)"
119
+ else
120
+ bad "one of the ENFORCING C7 boundary checks is missing or failing"
121
+ fi
122
+
123
+ # --- 4. a capability resolves via a kernel PORT (R73) ------------------------
124
+ grep -q "registerProvider('grade'" modules/grading/routes/grade.js 2>/dev/null \
125
+ && ok "grading registers the 'grade' provider at boot (modules/grading/routes/grade.js)" \
126
+ || bad "grading does not registerProvider('grade')"
127
+
128
+ # tasks.js carved to modules/lifecycle/routes/ at R86; public.js (the status read) stays core.
129
+ if grep -q "resolveOptional('grade')" modules/lifecycle/routes/tasks.js 2>/dev/null \
130
+ && grep -q "resolveOptional('grade')" src/bongos/routes/public.js 2>/dev/null; then
131
+ ok "the lifecycle resolves grading via the kernel port (seams.resolveOptional('grade') in modules/lifecycle/routes/tasks.js + core public.js)"
132
+ else
133
+ bad "the lifecycle does not resolve 'grade' via the seam in both modules/lifecycle/routes/tasks.js and core public.js"
134
+ fi
135
+ if grep -rnE "require\(['\"][^'\"]*grader['\"]\)" src/ server.js 2>/dev/null | grep -qv node_modules; then
136
+ bad "a core file still require()s the grader directly (the port is bypassed)"
137
+ else
138
+ ok "no core file require()s the grader directly — the edge is severed (ADR 0091 §4)"
139
+ fi
140
+
141
+ # --- 4b. economy carved + registers the `reward` PORT (R77 / ADR 0093) --------
142
+ if nrun "const m=require('./modules/economy/module.json');process.exit(m.key==='economy'&&(m.provides||[]).includes('reward')&&['cost','leaderboard','reward'].every(r=>(m.contributes.routes||[]).includes(r))?0:1)"; then
143
+ ok "modules/economy/module.json valid (key=economy, provides 'reward', routes cost+leaderboard+reward)"
144
+ else
145
+ bad "modules/economy/module.json missing/invalid (key, provides 'reward', or contributes.routes)"
146
+ fi
147
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('economy')?0:1)"; then
148
+ ok "the loader discovers 'economy' as a module"
149
+ else
150
+ bad "loader does not discover 'economy' (discoveredModuleKeys)"
151
+ fi
152
+
153
+ # economy LEDGER SQL left db.js. The bare token credit_log/cost_log still appears
154
+ # in db.js for OUT-OF-SCOPE domains the carve deliberately leaves (the rank-change
155
+ # ceremony + deactivate/reactivate audit rows write credit_log; builderAnalytics
156
+ # reads cost_log) AND for the lifecycle state-machine idempotency GUARDS the carve
157
+ # keeps verbatim (applyGrade/confirmTask: `SELECT 1 FROM credit_log … task.confirmed`,
158
+ # ADR 0093 §2). So we assert the precise ECONOMY-LEDGER signal instead: the cost_log
159
+ # WRITER and every credit-GRANT (the economy reasons) left the monolith.
160
+ if grep -qE "INSERT INTO cost_log" src/bongos/db.js 2>/dev/null; then
161
+ bad "the cost_log WRITER (logCost) still lives in core src/bongos/db.js (economy ledger did not leave)"
162
+ else
163
+ ok "the cost_log writer left src/bongos/db.js (economy ledger writer is module-only)"
164
+ fi
165
+ if grep -qE "'task\.confirmed'|'idea_promotion_bonus'|'session\.token_reward'|'ship\.net_negative'" src/bongos/db.js 2>/dev/null | grep -qE "INSERT INTO credit_log"; then
166
+ bad "an economy credit-GRANT INSERT still lives in core src/bongos/db.js"
167
+ elif grep -nE "INSERT INTO credit_log" src/bongos/db.js 2>/dev/null | grep -qE "task\.confirmed|idea_promotion_bonus|session\.token_reward|ship\.net_negative"; then
168
+ bad "an economy credit-GRANT INSERT still lives in core src/bongos/db.js"
169
+ else
170
+ ok "every economy credit-GRANT left src/bongos/db.js (only rank-change/audit credit_log rows remain — out of scope)"
171
+ fi
172
+ # economy SQL now lives in the module.
173
+ if grep -q credit_log modules/economy/credits.js 2>/dev/null; then
174
+ ok "economy credit ledger SQL now lives in modules/economy/credits.js"
175
+ else
176
+ bad "economy credit ledger SQL not found in modules/economy/credits.js"
177
+ fi
178
+ if grep -q cost_log modules/economy/cost.js 2>/dev/null; then
179
+ ok "economy cost ledger SQL now lives in modules/economy/cost.js"
180
+ else
181
+ bad "economy cost ledger SQL not found in modules/economy/cost.js"
182
+ fi
183
+ # the moved standalone files are gone from core.
184
+ if [ ! -f src/bongos/cost.js ] && [ ! -f src/bongos/streak.js ] && [ ! -f src/bongos/achievements.js ] && [ ! -f src/bongos/cost-summary-shape.js ]; then
185
+ ok "the moved standalone economy files are gone from core (cost/streak/achievements/cost-summary-shape)"
186
+ else
187
+ bad "a moved economy file still exists under src/bongos/ (cost/streak/achievements/cost-summary-shape)"
188
+ fi
189
+ # economy registers the `reward` port; the lifecycle resolves it.
190
+ grep -q "registerProvider('reward'" modules/economy/routes/reward.js 2>/dev/null \
191
+ && ok "economy registers the 'reward' provider at boot (modules/economy/routes/reward.js)" \
192
+ || bad "economy does not registerProvider('reward')"
193
+ # the lifecycle db slice carved to modules/lifecycle/db.js at R86 — it resolves the reward port there.
194
+ if grep -q "resolveOptional('reward')" modules/lifecycle/db.js 2>/dev/null; then
195
+ ok "the lifecycle resolves economy via the kernel port (seams.resolveOptional('reward') in modules/lifecycle/db.js)"
196
+ else
197
+ bad "the lifecycle does not resolve 'reward' via the seam in modules/lifecycle/db.js"
198
+ fi
199
+ # no core file requires the moved economy files directly (llm-pricing stays core).
200
+ if grep -rnE "require\(['\"][^'\"]*/(cost|streak|achievements|cost-summary-shape)['\"]\)" src/ server.js 2>/dev/null | grep -v node_modules | grep -v module-api | grep -v 'modules/economy' | grep -qv llm-pricing; then
201
+ bad "a core file still require()s a moved economy file directly (the port is bypassed)"
202
+ else
203
+ ok "no core file require()s a moved economy file directly — the edge is severed (ADR 0093 §2)"
204
+ fi
205
+
206
+ # --- 4c. security FEATURE carved + registers the `security` PORT (R79 / ADR 0093) --
207
+ # security-the-FEATURE (red-team reports + bounty) is a module; security-the-PROPERTY
208
+ # (permission-path/route-rank + the /security/adr+docs threat-model plane) STAYS kernel
209
+ # (02-module-map §5). We assert both halves landed on the right side of the line.
210
+ if nrun "const m=require('./modules/security/module.json');process.exit(m.key==='security'&&(m.provides||[]).includes('security')&&(m.contributes.routes||[]).includes('reports')?0:1)"; then
211
+ ok "modules/security/module.json valid (key=security, provides 'security' port, routes reports)"
212
+ else
213
+ bad "modules/security/module.json missing/invalid (key, provides 'security', or contributes.routes)"
214
+ fi
215
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('security')?0:1)"; then
216
+ ok "the loader discovers 'security' as a module"
217
+ else
218
+ bad "loader does not discover 'security' (discoveredModuleKeys)"
219
+ fi
220
+ # the report/bounty domain file moved out of core into the module.
221
+ if [ ! -f src/bongos/security.js ] && [ -f modules/security/security.js ]; then
222
+ ok "the security FEATURE domain is module-only (modules/security/security.js; no core src/bongos/security.js)"
223
+ else
224
+ bad "security.js not cleanly module-owned (expected modules/security/security.js, no src/bongos/security.js)"
225
+ fi
226
+ if grep -qE "vulnerability_reports" modules/security/security.js 2>/dev/null; then
227
+ ok "the vulnerability_reports / bounty SQL now lives in modules/security/security.js"
228
+ else
229
+ bad "vulnerability_reports SQL not found in modules/security/security.js"
230
+ fi
231
+ # security-the-PROPERTY stayed kernel: the trust matchers + the adr/docs route plane.
232
+ if [ -f src/bongos/route-rank-check.js ] && [ -f src/bongos/permission-path-check.js ] && grep -qE "/security/(adr|docs)" src/bongos/routes/security.js 2>/dev/null; then
233
+ ok "security-the-PROPERTY stayed kernel (route-rank/permission-path matchers + /security/adr+docs in core routes/security.js)"
234
+ else
235
+ bad "security-the-PROPERTY did not stay kernel (matchers or the adr/docs route plane went missing from core)"
236
+ fi
237
+ # security registers the `security` port; the public bounty-table resolves it.
238
+ grep -q "registerProvider('security'" modules/security/routes/reports.js 2>/dev/null \
239
+ && ok "security registers the 'security' provider at boot (modules/security/routes/reports.js)" \
240
+ || bad "security does not registerProvider('security')"
241
+ if grep -q "resolveOptional('security')" src/bongos/routes/public.js 2>/dev/null; then
242
+ ok "core resolves the security bounty schedule via the kernel port (resolveOptional('security') in public.js)"
243
+ else
244
+ bad "core does not resolve 'security' via the seam in public.js (the bounty table import was not severed)"
245
+ fi
246
+ # no core file requires the moved security DOMAIN file directly. The match is
247
+ # scoped to the old domain path (require('../security') / './security') and
248
+ # EXCLUDES the property router core legitimately keeps: require('./routes/security')
249
+ # (the /security/adr+docs plane that stayed kernel — 02-module-map §5).
250
+ if grep -rnE "require\(['\"]\.\.?/security['\"]\)" src/ server.js 2>/dev/null | grep -v node_modules | grep -q .; then
251
+ bad "a core file still require()s the moved security domain file directly (the port is bypassed)"
252
+ else
253
+ ok "no core file require()s the moved security.js domain directly — the edge is severed (ADR 0093 §1; routes/security.js property plane stays)"
254
+ fi
255
+
256
+ # --- 4d. builder-settings carved + registers the `builder-settings` PORT (R80 / ADR 0093) --
257
+ # The per-builder PREFS domain (wandering·skill·sound·render) + builder-needs is a
258
+ # module; the `GET /me` aggregator stays a thin core facade resolving the port
259
+ # (02-module-map §2). We assert the prefs libs + their db slice moved, the routes
260
+ # split, and the edge from me.js + cascade-dispatch is severed.
261
+ if nrun "const m=require('./modules/builder-settings/module.json');process.exit(m.key==='builder-settings'&&(m.provides||[]).includes('builder-settings')&&(m.contributes.routes||[]).includes('settings')?0:1)"; then
262
+ ok "modules/builder-settings/module.json valid (key=builder-settings, provides 'builder-settings' port, routes settings)"
263
+ else
264
+ bad "modules/builder-settings/module.json missing/invalid (key, provides 'builder-settings', or contributes.routes)"
265
+ fi
266
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('builder-settings')?0:1)"; then
267
+ ok "the loader discovers 'builder-settings' as a module"
268
+ else
269
+ bad "loader does not discover 'builder-settings' (discoveredModuleKeys)"
270
+ fi
271
+ # the five pref libs + builder-needs moved out of core into the module.
272
+ if [ ! -f src/bongos/skill-prefs.js ] && [ ! -f src/bongos/sound-prefs.js ] && [ ! -f src/bongos/wandering-prefs.js ] && [ ! -f src/bongos/render-prefs.js ] && [ ! -f src/bongos/event-sound-prefs.js ] && [ ! -f src/bongos/builder-needs.js ]; then
273
+ ok "the prefs libs + builder-needs are module-only (no src/bongos/{skill,sound,wandering,render,event-sound}-prefs.js / builder-needs.js)"
274
+ else
275
+ bad "a moved builder-settings file still exists under src/bongos/ (a pref lib or builder-needs.js)"
276
+ fi
277
+ if [ -f modules/builder-settings/skill-prefs.js ] && [ -f modules/builder-settings/builder-needs.js ]; then
278
+ ok "the prefs libs + builder-needs now live in modules/builder-settings/"
279
+ else
280
+ bad "the prefs libs / builder-needs not found in modules/builder-settings/"
281
+ fi
282
+ # the prefs db SLICE left core db.js (the skill_model_prefs writer is the signal).
283
+ if grep -qE "SET skill_model_prefs" src/bongos/db.js 2>/dev/null; then
284
+ bad "the prefs db slice (setBuilderSkillPrefs) still lives in core src/bongos/db.js (slice did not leave)"
285
+ else
286
+ ok "the prefs db slice left src/bongos/db.js (skill_model_prefs/sound_prefs/behavior_prefs writers are module-only)"
287
+ fi
288
+ if grep -qE "skill_model_prefs" modules/builder-settings/db.js 2>/dev/null; then
289
+ ok "the prefs db slice now lives in modules/builder-settings/db.js"
290
+ else
291
+ bad "the prefs db slice not found in modules/builder-settings/db.js"
292
+ fi
293
+ # builder-settings registers the `builder-settings` port; me.js resolves it.
294
+ grep -q "registerProvider('builder-settings'" modules/builder-settings/routes/settings.js 2>/dev/null \
295
+ && ok "builder-settings registers the 'builder-settings' provider at boot (modules/builder-settings/routes/settings.js)" \
296
+ || bad "builder-settings does not registerProvider('builder-settings')"
297
+ if grep -q "resolveOptional('builder-settings')" src/bongos/routes/me.js 2>/dev/null \
298
+ && grep -q "resolveOptional('builder-settings')" src/bongos/cascade-dispatch.js 2>/dev/null; then
299
+ ok "core resolves builder-settings via the kernel port (resolveOptional('builder-settings') in me.js + cascade-dispatch.js)"
300
+ else
301
+ bad "core does not resolve 'builder-settings' via the seam in both me.js and cascade-dispatch.js"
302
+ fi
303
+ # no core file requires a moved prefs lib directly.
304
+ if grep -rnE "require\(['\"][^'\"]*/(skill-prefs|sound-prefs|wandering-prefs|render-prefs|event-sound-prefs|builder-needs)['\"]\)" src/ server.js 2>/dev/null | grep -v node_modules | grep -v 'modules/builder-settings' | grep -q .; then
305
+ bad "a core file still require()s a moved prefs lib directly (the port is bypassed)"
306
+ else
307
+ ok "no core file require()s a moved prefs lib directly — the edge is severed (ADR 0093 §1)"
308
+ fi
309
+
310
+ # --- 4e. onboarding carved + registers the `onboarding` PORT (R81 / ADR 0093) --
311
+ # The admission · onboarding-state-machine · newcomer-restock domain is a module;
312
+ # the core lifecycle (db.js claim/ship), auth callbacks, and the me/builders
313
+ # profile readers resolve the `onboarding` kernel port (the FIRST core→module
314
+ # port direction db.js drives alongside `reward`). The access-request admission
315
+ # routes mount in the module. We assert the domain files + their db slice moved,
316
+ # the port is registered + resolved in db.js, and the edge is severed.
317
+ if nrun "const m=require('./modules/onboarding/module.json');process.exit(m.key==='onboarding'&&(m.provides||[]).includes('onboarding')&&(m.contributes.routes||[]).includes('onboarding')?0:1)"; then
318
+ ok "modules/onboarding/module.json valid (key=onboarding, provides 'onboarding' port, routes onboarding)"
319
+ else
320
+ bad "modules/onboarding/module.json missing/invalid (key, provides 'onboarding', or contributes.routes)"
321
+ fi
322
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('onboarding')?0:1)"; then
323
+ ok "the loader discovers 'onboarding' as a module"
324
+ else
325
+ bad "loader does not discover 'onboarding' (discoveredModuleKeys)"
326
+ fi
327
+ # the onboarding domain files moved out of core into the module.
328
+ if [ ! -f src/bongos/onboarding.js ] && [ ! -f src/bongos/onboarding-state.js ] && [ ! -f src/bongos/newcomer-restock.js ] && [ ! -f src/bongos/approval-broadcast.js ] && [ ! -f src/bongos/routes/access-requests.js ]; then
329
+ ok "the onboarding domain files are module-only (no src/bongos/{onboarding,onboarding-state,newcomer-restock,approval-broadcast}.js / routes/access-requests.js)"
330
+ else
331
+ bad "a moved onboarding file still exists under src/bongos/ (onboarding/onboarding-state/newcomer-restock/approval-broadcast/access-requests)"
332
+ fi
333
+ if [ -f modules/onboarding/onboarding-state.js ] && [ -f modules/onboarding/routes/access-requests.js ]; then
334
+ ok "the onboarding domain + admission routes now live in modules/onboarding/"
335
+ else
336
+ bad "the onboarding state machine / access-request routes not found in modules/onboarding/"
337
+ fi
338
+ # the onboarding db SLICE left core db.js (the newcomerInstanceStats query is the signal).
339
+ if grep -qE "async function newcomerInstanceStats" src/bongos/db.js 2>/dev/null; then
340
+ bad "the onboarding db slice (newcomerInstanceStats) still lives in core src/bongos/db.js (slice did not leave)"
341
+ else
342
+ ok "the onboarding db slice left src/bongos/db.js (newcomerInstanceStats is module-only)"
343
+ fi
344
+ if grep -qE "newcomerInstanceStats" modules/onboarding/db.js 2>/dev/null; then
345
+ ok "the onboarding db slice now lives in modules/onboarding/db.js"
346
+ else
347
+ bad "the onboarding db slice not found in modules/onboarding/db.js"
348
+ fi
349
+ # onboarding registers the `onboarding` port; the lifecycle (db.js) resolves it.
350
+ grep -q "registerProvider('onboarding'" modules/onboarding/routes/onboarding.js 2>/dev/null \
351
+ && ok "onboarding registers the 'onboarding' provider at boot (modules/onboarding/routes/onboarding.js)" \
352
+ || bad "onboarding does not registerProvider('onboarding')"
353
+ # the lifecycle's claim/ship carved to modules/lifecycle/db.js at R86 (it ticks the
354
+ # onboarding stage there); core auth.js (the auth callbacks) stays and resolves it too.
355
+ if grep -q "resolveOptional('onboarding')" modules/lifecycle/db.js 2>/dev/null \
356
+ && grep -q "resolveOptional('onboarding')" src/bongos/auth.js 2>/dev/null; then
357
+ ok "the lifecycle + core resolve onboarding via the kernel port (resolveOptional('onboarding') in modules/lifecycle/db.js + core auth.js)"
358
+ else
359
+ bad "the lifecycle or core does not resolve 'onboarding' via the seam (modules/lifecycle/db.js + auth.js)"
360
+ fi
361
+ # no core file requires a moved onboarding domain file directly. The match is
362
+ # scoped to the moved domain basenames; the onboarding CLIs (setup/onboarding-
363
+ # config/onboarding-analyze/newcomer-floor) stay under scripts/, outside this scan.
364
+ if grep -rnE "require\(['\"][^'\"]*/(onboarding-state|newcomer-restock|approval-broadcast)['\"]\)" src/ server.js 2>/dev/null | grep -v node_modules | grep -v 'modules/onboarding' | grep -q .; then
365
+ bad "a core file still require()s a moved onboarding file directly (the port is bypassed)"
366
+ else
367
+ ok "no core file require()s a moved onboarding file directly — the edge is severed (ADR 0093 §1)"
368
+ fi
369
+
370
+ # --- 4f. sessions/BFG carved — like memory, registers NO port (R82 / ADR 0093) --
371
+ # The session-records corpus + its data plane + the BFG cross-builder scorer +
372
+ # the session-pulse helpers carved to modules/sessions/. Unlike economy/security/
373
+ # onboarding, sessions registers NO kernel port (provides: []) — exactly like
374
+ # memory: CORE never calls back into it (the ship-time digest write is an HTTP POST
375
+ # to the module's own /sessions route). The ONE outward edge is the economy
376
+ # `reward` port the module resolves (token reward + sumCreditsForTasks) — a
377
+ # module↔module seam, never a sibling require. We assert the domain files + the
378
+ # session_records db slice moved, the route mounts via the loader, and the BFG
379
+ # reaches the kernel only through the doorway.
380
+ if nrun "const m=require('./modules/sessions/module.json');process.exit(m.key==='sessions'&&(m.provides||[]).length===0&&(m.contributes.routes||[]).includes('sessions')?0:1)"; then
381
+ ok "modules/sessions/module.json valid (key=sessions, registers NO port like memory, routes sessions)"
382
+ else
383
+ bad "modules/sessions/module.json missing/invalid (key, should provide no port, or contributes.routes)"
384
+ fi
385
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('sessions')?0:1)"; then
386
+ ok "the loader discovers 'sessions' as a module"
387
+ else
388
+ bad "loader does not discover 'sessions' (discoveredModuleKeys)"
389
+ fi
390
+ # the session domain files (bfg + pulse + the route) moved out of core into the module.
391
+ if [ ! -f src/bongos/bfg.js ] && [ ! -f src/bongos/pulse.js ] && [ ! -f src/bongos/routes/sessions.js ] \
392
+ && [ -f modules/sessions/bfg.js ] && [ -f modules/sessions/pulse.js ] && [ -f modules/sessions/routes/sessions.js ]; then
393
+ ok "the session domain files are module-only (no src/bongos/{bfg,pulse}.js / routes/sessions.js; all in modules/sessions/)"
394
+ else
395
+ bad "a session domain file did not move cleanly (expected modules/sessions/{bfg,pulse,routes/sessions}.js, none in src/bongos/)"
396
+ fi
397
+ # the session_records db SLICE left core db.js (the upsert writer is the signal).
398
+ if grep -qE "INSERT INTO session_records" src/bongos/db.js 2>/dev/null; then
399
+ bad "the session_records writer (upsertSessionRecordTx) still lives in core src/bongos/db.js (slice did not leave)"
400
+ else
401
+ ok "the session_records db slice left src/bongos/db.js (upsert/search/fetch are module-only)"
402
+ fi
403
+ if grep -qE "INSERT INTO session_records" modules/sessions/db.js 2>/dev/null; then
404
+ ok "the session_records db slice now lives in modules/sessions/db.js"
405
+ else
406
+ bad "the session_records db slice not found in modules/sessions/db.js"
407
+ fi
408
+ # sessions resolves the economy `reward` port (the module↔module seam) and the
409
+ # core route mount left routes.js (mountModuleRoutes mounts it now).
410
+ if grep -q "resolveOptional('reward')" modules/sessions/db.js 2>/dev/null \
411
+ && grep -q "resolveOptional('reward')" modules/sessions/routes/sessions.js 2>/dev/null; then
412
+ ok "sessions resolves the economy 'reward' port (resolveOptional('reward') in db.js + routes/sessions.js — module↔module seam)"
413
+ else
414
+ bad "sessions does not resolve the 'reward' port via the seam in both db.js and routes/sessions.js"
415
+ fi
416
+ if grep -q "require('./routes/sessions')" src/bongos/routes.js 2>/dev/null; then
417
+ bad "core routes.js still require()s ./routes/sessions directly (the route mount was not severed)"
418
+ else
419
+ ok "no core file require()s the moved sessions route directly — mountModuleRoutes mounts it (ADR 0093 §1)"
420
+ fi
421
+
422
+ # --- 4g. autonomy/MAS carved — NO port; OBSERVES lifecycle (R83 / ADR 0093) ----
423
+ # The Multi-Agent System (ADR 0024): the autonomy gate, the conductor/architect/
424
+ # run-routine CLIs, and the in-process routine timers carved to modules/autonomy/.
425
+ # The cross-cutting domain — it OBSERVES lifecycle. Two inbound core→autonomy edges
426
+ # inverted: the routine timer (was routineTimers.start() in server.js) is now a
427
+ # loader-started POLLER (contributes.pollers), and the precheck route (was mounted
428
+ # in routes.js) a module route. Like sessions/memory it registers NO kernel port;
429
+ # its ONE outward edge is the lifecycle `tallyPeerVotes` capability it resolves
430
+ # through the DOORWAY (api.tallyPeerVotes — a tracked lifecycle leak), never a core
431
+ # require. We assert the manifest, the loader discovery, the moved files, the
432
+ # autonomy_runs db slice, the poller seam, the doorway capability, and that both
433
+ # severed edges (the timer start + the route mount) left core.
434
+ if nrun "const m=require('./modules/autonomy/module.json');process.exit(m.key==='autonomy'&&(m.provides||[]).length===0&&(m.contributes.routes||[]).includes('autonomy')&&(m.contributes.pollers||[]).includes('routine-timers')?0:1)"; then
435
+ ok "modules/autonomy/module.json valid (key=autonomy, NO port like sessions, routes autonomy + pollers routine-timers)"
436
+ else
437
+ bad "modules/autonomy/module.json missing/invalid (key, should provide no port, contributes.routes/pollers)"
438
+ fi
439
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('autonomy')?0:1)"; then
440
+ ok "the loader discovers 'autonomy' as a module"
441
+ else
442
+ bad "loader does not discover 'autonomy' (discoveredModuleKeys)"
443
+ fi
444
+ # the carved domain files (the routine-timers poller + the precheck route) moved
445
+ # out of core into the module.
446
+ if [ ! -f src/bongos/routine-timers.js ] && [ ! -f src/bongos/routes/autonomy.js ] \
447
+ && [ -f modules/autonomy/pollers/routine-timers.js ] && [ -f modules/autonomy/routes/autonomy.js ]; then
448
+ ok "the autonomy domain files are module-only (no src/bongos/routine-timers.js / routes/autonomy.js; all in modules/autonomy/)"
449
+ else
450
+ bad "an autonomy domain file did not move cleanly (expected modules/autonomy/{pollers/routine-timers,routes/autonomy}.js, none in src/bongos/)"
451
+ fi
452
+ # the autonomy_runs db SLICE left core db.js (the INSERT writer is the signal).
453
+ if grep -qE "INSERT INTO autonomy_runs" src/bongos/db.js 2>/dev/null; then
454
+ bad "the autonomy_runs writer (recordAutonomyRun) still lives in core src/bongos/db.js (slice did not leave)"
455
+ else
456
+ ok "the autonomy_runs db slice left src/bongos/db.js (recordAutonomyRun/lastAutonomyHead are module-only)"
457
+ fi
458
+ if grep -qE "INSERT INTO autonomy_runs" modules/autonomy/db.js 2>/dev/null; then
459
+ ok "the autonomy_runs db slice now lives in modules/autonomy/db.js"
460
+ else
461
+ bad "the autonomy_runs db slice not found in modules/autonomy/db.js"
462
+ fi
463
+ # the routine timer reaches the lifecycle tallyPeerVotes capability through the
464
+ # `lifecycle` kernel PORT (the doorway leak retired at BV1.R86), not a core require.
465
+ if grep -q "require('../../../src/module-api')" modules/autonomy/pollers/routine-timers.js 2>/dev/null \
466
+ && grep -q "resolveOptional('lifecycle')" modules/autonomy/pollers/routine-timers.js 2>/dev/null; then
467
+ ok "the routine-timers poller resolves 'tallyPeerVotes' via the lifecycle PORT (resolveOptional('lifecycle') — never a core require; the doorway leak retired at R86)"
468
+ else
469
+ bad "the routine-timers poller does not reach tallyPeerVotes through the lifecycle port"
470
+ fi
471
+ # both severed edges left core: the timer start (server.js) and the route mount (routes.js).
472
+ if grep -q "require('./bongos/routine-timers')" server.js 2>/dev/null || grep -q "routineTimers.start" server.js 2>/dev/null; then
473
+ bad "server.js still starts routineTimers directly (the poller seam did not replace the hardcoded start)"
474
+ elif grep -q "require('./routes/autonomy')" src/bongos/routes.js 2>/dev/null; then
475
+ bad "core routes.js still require()s ./routes/autonomy directly (the route mount was not severed)"
476
+ else
477
+ ok "no core file starts the timer or mounts the autonomy route directly — the loader (startModulePollers + mountModuleRoutes) wires both (ADR 0093 §1)"
478
+ fi
479
+
480
+ # --- 4h. status-UI carved — the FIRST web-surface module (R84 / ADR 0093) ------
481
+ # The public status dashboard (public-status/, ~3k LOC) became a first-class
482
+ # WEB-SURFACE module (02-module-map §6). Unlike every backend carve it has NO db
483
+ # slice, NO kernel port, and NO routes — it is pure static assets + a
484
+ # contributes.webSurfaces manifest declaration the loader hands serve-internal,
485
+ # which serves the module's public/ dir on the status. host. We assert the
486
+ # manifest, the loader discovery, the moved static surface, the generalized serving
487
+ # seam (serve-internal resolves moduleWebSurfaces, no hardcoded public-status), and
488
+ # that the old repo-root path is gone from core.
489
+ if nrun "const m=require('./modules/status-ui/module.json');const ws=(m.contributes&&m.contributes.webSurfaces)||[];process.exit(m.key==='status-ui'&&(m.provides||[]).length===0&&!(m.contributes.routes||[]).length&&ws.length===1&&ws[0].host==='status.'&&ws[0].dir==='public'?0:1)"; then
490
+ ok "modules/status-ui/module.json valid (key=status-ui, NO port + NO routes, webSurfaces=[{host:status.,dir:public}])"
491
+ else
492
+ bad "modules/status-ui/module.json missing/invalid (key, should declare webSurfaces with no port/routes)"
493
+ fi
494
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('status-ui')?0:1)"; then
495
+ ok "the loader discovers 'status-ui' as a module"
496
+ else
497
+ bad "loader does not discover 'status-ui' (discoveredModuleKeys)"
498
+ fi
499
+ # the static surface moved out of the repo root into the module.
500
+ if [ ! -d public-status ] && [ -f modules/status-ui/public/index.html ] && [ -f modules/status-ui/public/status.js ]; then
501
+ ok "the status surface is module-only (no repo-root public-status/; modules/status-ui/public/{index.html,status.js} present)"
502
+ else
503
+ bad "the status surface did not move cleanly (expected modules/status-ui/public/, no repo-root public-status/)"
504
+ fi
505
+ # the loader exposes the web-surface seam, and the live status-ui surface resolves through it.
506
+ if nrun "const l=require('./src/module-loader/loader.js');const {isModuleEnabled}=require('./src/modules.js');const s=l.moduleWebSurfaces({isEnabled:isModuleEnabled}).find(x=>x.key==='status-ui');process.exit(s&&s.host==='status.'&&require('node:fs').existsSync(require('node:path').join(s.dir,'index.html'))?0:1)"; then
507
+ ok "loader.moduleWebSurfaces resolves the live status-ui surface (host status., serves its index.html)"
508
+ else
509
+ bad "loader.moduleWebSurfaces does not resolve the status-ui surface"
510
+ fi
511
+ # serve-internal serves via the GENERALIZED seam (moduleWebSurfaces), with no hardcoded public-status path.
512
+ if grep -q "moduleWebSurfaces" src/bongos/serve-internal.js 2>/dev/null && ! grep -q "public-status" src/bongos/serve-internal.js 2>/dev/null; then
513
+ ok "serve-internal serves web surfaces via the loader seam (moduleWebSurfaces) — no hardcoded public-status path (ADR 0083 §Decision #4)"
514
+ else
515
+ bad "serve-internal still hardcodes public-status or does not use the moduleWebSurfaces seam"
516
+ fi
517
+
518
+ # --- 4i. hall-UI carved — the LARGEST web-surface module (R85 / ADR 0093) ------
519
+ # The authenticated builders' hall (public-builders/, ~13k LOC) became a first-class
520
+ # WEB-SURFACE module (02-module-map §6) — the largest of the two web surfaces. Like
521
+ # status-UI it has NO db slice, NO kernel port, and NO routes; it declares
522
+ # contributes.webSurfaces:[{host:"builders.",dir:"public"}] so the loader DISCOVERS
523
+ # it (feeding the scope map, fitness keys, docs, window.__MODULES__). UNLIKE the
524
+ # generic status surface, the hall keeps its DEDICATED serving block in serve-internal
525
+ # (the apex /builders/* shim, canonical redirects, the citizen/Archon page gates,
526
+ # per-page asset-stamping, and the module hall-widget injection) — it is partitioned
527
+ # OUT of the generic web-surface loop and served from BUILDERS_DIR = modules/hall-ui/
528
+ # public/. We assert the manifest, the loader discovery, the moved static surface, the
529
+ # resolved web-surface descriptor, and that no repo-root public-builders/ path remains
530
+ # in core serve-internal.
531
+ if nrun "const m=require('./modules/hall-ui/module.json');const ws=(m.contributes&&m.contributes.webSurfaces)||[];process.exit(m.key==='hall-ui'&&(m.provides||[]).length===0&&!(m.contributes.routes||[]).length&&ws.length===1&&ws[0].host==='builders.'&&ws[0].dir==='public'?0:1)"; then
532
+ ok "modules/hall-ui/module.json valid (key=hall-ui, NO port + NO routes, webSurfaces=[{host:builders.,dir:public}])"
533
+ else
534
+ bad "modules/hall-ui/module.json missing/invalid (key, should declare webSurfaces with no port/routes)"
535
+ fi
536
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('hall-ui')?0:1)"; then
537
+ ok "the loader discovers 'hall-ui' as a module"
538
+ else
539
+ bad "loader does not discover 'hall-ui' (discoveredModuleKeys)"
540
+ fi
541
+ # the static surface moved out of the repo root into the module.
542
+ if [ ! -d public-builders ] && [ -f modules/hall-ui/public/index.html ] && [ -f modules/hall-ui/public/builders.js ]; then
543
+ ok "the hall surface is module-only (no repo-root public-builders/; modules/hall-ui/public/{index.html,builders.js} present)"
544
+ else
545
+ bad "the hall surface did not move cleanly (expected modules/hall-ui/public/, no repo-root public-builders/)"
546
+ fi
547
+ # the loader exposes the web-surface seam, and the live hall-ui surface resolves through it.
548
+ if nrun "const l=require('./src/module-loader/loader.js');const {isModuleEnabled}=require('./src/modules.js');const s=l.moduleWebSurfaces({isEnabled:isModuleEnabled}).find(x=>x.key==='hall-ui');process.exit(s&&s.host==='builders.'&&require('node:fs').existsSync(require('node:path').join(s.dir,'index.html'))?0:1)"; then
549
+ ok "loader.moduleWebSurfaces resolves the live hall-ui surface (host builders., serves its index.html)"
550
+ else
551
+ bad "loader.moduleWebSurfaces does not resolve the hall-ui surface"
552
+ fi
553
+ # serve-internal serves the hall from the MODULE dir (BUILDERS_DIR), with no hardcoded
554
+ # repo-root public-builders path. The dedicated block stays (it is NOT the generic loop).
555
+ if grep -q "modules', 'hall-ui', 'public'" src/bongos/serve-internal.js 2>/dev/null && ! grep -qE "'public-builders'|\"public-builders\"" src/bongos/serve-internal.js 2>/dev/null; then
556
+ ok "serve-internal serves the hall from modules/hall-ui/public (BUILDERS_DIR) — no hardcoded repo-root public-builders path (BV1.R85)"
557
+ else
558
+ bad "serve-internal still hardcodes a repo-root public-builders path or does not point BUILDERS_DIR at modules/hall-ui/public"
559
+ fi
560
+
561
+ # --- 4j. lifecycle carved — the LAST core domain + the `lifecycle` PORT (R86) ---
562
+ # The build state machine (tasks·claims·versions·done-when·goals·dependencies·
563
+ # ship orchestration) — the most-coupled core domain — carved to modules/lifecycle/.
564
+ # It registers the `lifecycle` kernel PORT and RETIRES the three ADR-0091 §3 doorway
565
+ # leaks (createTask / VOTABLE_TASK_STATUSES / tallyPeerVotes), so the db.js residue
566
+ # is now exactly the kernel identity/auth/twin slice + db-kernel.js (ADR 0093 §3).
567
+ # We assert the manifest, the loader discovery, the moved domain files + db slice,
568
+ # the port registration + resolution, the retired leaks, and the inverted poller.
569
+ if nrun "const m=require('./modules/lifecycle/module.json');process.exit(m.key==='lifecycle'&&(m.provides||[]).includes('lifecycle')&&['tasks','claims','versions','done-when','goals','dependencies','gate-approvals','analytics'].every(r=>(m.contributes.routes||[]).includes(r))&&(m.contributes.pollers||[]).includes('publish-reconciler')?0:1)"; then
570
+ ok "modules/lifecycle/module.json valid (key=lifecycle, provides 'lifecycle' port, the lifecycle routes + the publish-reconciler poller)"
571
+ else
572
+ bad "modules/lifecycle/module.json missing/invalid (key, provides 'lifecycle', contributes.routes/pollers)"
573
+ fi
574
+ if nrun "const k=require('./scripts/gds/fitness.js').discoveredModuleKeys();process.exit(k.includes('lifecycle')?0:1)"; then
575
+ ok "the loader discovers 'lifecycle' as a module"
576
+ else
577
+ bad "loader does not discover 'lifecycle' (discoveredModuleKeys)"
578
+ fi
579
+ # the lifecycle domain libs + routes moved out of core into the module.
580
+ if [ ! -f src/bongos/task-classifier.js ] && [ ! -f src/bongos/done-when.js ] && [ ! -f src/bongos/hierarchy.js ] \
581
+ && [ ! -f src/bongos/github-push.js ] && [ ! -f src/bongos/merge-lock.js ] && [ ! -f src/bongos/routes/tasks.js ] \
582
+ && [ -f modules/lifecycle/task-classifier.js ] && [ -f modules/lifecycle/routes/tasks.js ] && [ -f modules/lifecycle/db.js ]; then
583
+ ok "the lifecycle domain is module-only (no src/bongos/{task-classifier,done-when,hierarchy,github-push,merge-lock}.js or routes/tasks.js; all in modules/lifecycle/)"
584
+ else
585
+ bad "a moved lifecycle file still exists under src/bongos/ (a lib or a route)"
586
+ fi
587
+ # the lifecycle state-machine SQL SLICE left core db.js (claimTask/shipTask/createTask are the signal).
588
+ if grep -qE "^async function (claimTask|shipTask|createTask|resolveClaim)\b" src/bongos/db.js 2>/dev/null; then
589
+ bad "the lifecycle state-machine functions still live in core src/bongos/db.js (slice did not leave)"
590
+ else
591
+ ok "the lifecycle state-machine SQL left src/bongos/db.js — the residue is the kernel identity/auth/twin slice (ADR 0093 §3)"
592
+ fi
593
+ if grep -qE "async function (claimTask|shipTask|createTask)\b" modules/lifecycle/db.js 2>/dev/null; then
594
+ ok "the lifecycle state-machine SQL now lives in modules/lifecycle/db.js (claim/ship/createTask/…)"
595
+ else
596
+ bad "the lifecycle state-machine SQL not found in modules/lifecycle/db.js"
597
+ fi
598
+ # lifecycle registers the `lifecycle` port; core read routes + cascade-dispatch resolve it.
599
+ grep -q "registerProvider('lifecycle'" modules/lifecycle/routes/lifecycle.js 2>/dev/null \
600
+ && ok "lifecycle registers the 'lifecycle' provider at boot (modules/lifecycle/routes/lifecycle.js)" \
601
+ || bad "lifecycle does not registerProvider('lifecycle')"
602
+ if grep -q "resolveOptional('lifecycle')" src/bongos/routes/public.js 2>/dev/null \
603
+ && grep -q "resolveOptional('lifecycle')" src/bongos/cascade-dispatch.js 2>/dev/null; then
604
+ ok "core resolves the lifecycle port (resolveOptional('lifecycle') in public.js + cascade-dispatch.js)"
605
+ else
606
+ bad "core does not resolve 'lifecycle' via the seam in both public.js and cascade-dispatch.js"
607
+ fi
608
+ # the three ADR-0091 §3 doorway leaks retired (off the doorway, behind the port).
609
+ if grep -qE "^ createTask:|^ get VOTABLE_TASK_STATUSES|^ tallyPeerVotes:" src/module-api.js 2>/dev/null; then
610
+ bad "a retired lifecycle leak (createTask/VOTABLE_TASK_STATUSES/tallyPeerVotes) is still on the doorway (src/module-api.js)"
611
+ else
612
+ ok "the three lifecycle doorway leaks retired (createTask/VOTABLE_TASK_STATUSES/tallyPeerVotes off src/module-api.js — the last leak deletion, ADR 0093 §3)"
613
+ fi
614
+ # the consumers of the retired leaks resolve the lifecycle port instead.
615
+ if grep -q "resolveOptional('lifecycle')" modules/onboarding/db.js 2>/dev/null \
616
+ && grep -q "resolveOptional('lifecycle')" modules/discord/discord-reaction.js 2>/dev/null \
617
+ && grep -q "resolveOptional('lifecycle')" modules/autonomy/pollers/routine-timers.js 2>/dev/null; then
618
+ ok "the leak consumers resolve the lifecycle port (onboarding createTask · discord VOTABLE · autonomy tallyPeerVotes)"
619
+ else
620
+ bad "a retired-leak consumer (onboarding/discord/autonomy) does not resolve the lifecycle port"
621
+ fi
622
+ # the publish-reconciler poller inverted: server.js no longer starts it directly.
623
+ if grep -q "publishReconciler.start" server.js 2>/dev/null || grep -q "require('./src/bongos/publish-reconciler')" server.js 2>/dev/null; then
624
+ bad "server.js still starts the publish reconciler directly (the poller seam did not replace the hardcoded start)"
625
+ else
626
+ ok "no core file starts the publish reconciler directly — the loader (startModulePollers) wires the lifecycle poller (ADR 0093 §1)"
627
+ fi
628
+
629
+ # --- 5. OTB behaves byte-identically -----------------------------------------
630
+ # The DB-free tests that exercise the CARVED surfaces. If the carve changed only
631
+ # structure (not behavior), every one passes unchanged. Curated like the sets in
632
+ # run-unit-tests.js — a new module/grading/memory test is opted in deliberately.
633
+ CARVE_TESTS=(
634
+ # module system (the kernel machinery the carve rides on) — module_loader +
635
+ # module_manifest also cover the R84/R85 web-surface seam (moduleWebSurfaces +
636
+ # the webSurfaces manifest key, incl. the live status-ui + hall-ui surfaces);
637
+ # fitness/modules cover status-ui + hall-ui membership; module_contributions
638
+ # exercises the hall's dom-utils settings-panel seam (now read from
639
+ # modules/hall-ui/public/); atlas pins the hall's Repo Atlas renderer contract.
640
+ fitness module_api module_seams module_loader modules module_manifest
641
+ module_cli module_route_rank module_contributions module-scope-map atlas
642
+ # grading — R73: carved capability + the `grade` kernel port
643
+ grader grader_panel grader_prompt_fencing grader_bypass
644
+ grade_attempts grade_attribution grade_server_authoritative
645
+ grade_unavailable_display regrade_eligibility
646
+ # memory + search + recall — R72: carved domain
647
+ memory_map search_route search_chunker search_ingest search_ingest_db
648
+ search_isolation recall_cli recall_hints
649
+ # economy — R77 / ADR 0093: carved domain + the `reward` kernel port
650
+ credit_grant cost cost_audit cost_budget_status cost_summary_shape streak
651
+ grade_attribution confirm_attribution diff_derived_signals
652
+ # security — R79 / ADR 0093: FEATURE carved (reports+bounty); PROPERTY stays
653
+ # kernel. These DB-free tests exercise the property plane that stayed in core
654
+ # routes/security.js + its rank pins (byte-identical after the route split).
655
+ security_route security_docs
656
+ # builder-settings — R80 / ADR 0093: the prefs domain carved + the
657
+ # `builder-settings` kernel port. The pure shapers (byte-identical after the move).
658
+ skill_prefs sound_prefs wandering_prefs render_prefs builder_needs cascade-dispatch
659
+ # onboarding — R81 / ADR 0093: the admission · state-machine · newcomer-restock
660
+ # domain carved + the `onboarding` kernel port. The state-machine engine + the
661
+ # gate middleware + the restock stamper + the route-signal pass-through (the
662
+ # route now resolves the port — registered in the test) — byte-identical.
663
+ onboarding_state onboarding_gate newcomer_restock onboarding_route_signals
664
+ # sessions/BFG — R82 / ADR 0093: the session-records corpus + data plane + BFG
665
+ # scorer + session-pulse carved (NO port, like memory). The search ORDER-BY/clamp
666
+ # guards (module db), the SR-17 disk-fill bounds (module route + module db,
667
+ # reward port registered in the test), the 6D evaluator + #506 regression, the
668
+ # ship-time digest builder, and the backfill scope-parser — byte-identical.
669
+ session_search session_caps session_eval session_506_regression session_digest
670
+ session_records backfill_sessions
671
+ # autonomy/MAS — R83 / ADR 0093: the autonomy gate + conductor/architect CLIs +
672
+ # the routine timers carved (NO port, like sessions; OBSERVES lifecycle via the
673
+ # poller seam + the `lifecycle` port for tallyPeerVotes). The pure gate decision
674
+ # (inert until armed), the peer-vote timer's run function (pure w.r.t. injected
675
+ # deps), and the conductor/architect/run-routine CLI logic — byte-identical.
676
+ autonomy_gate routine_timers conductor architect run_routine
677
+ # lifecycle — R86 / ADR 0093 §3: the build state machine carved (the LAST + most-
678
+ # coupled domain) + the `lifecycle` kernel port + the three retired doorway leaks.
679
+ # The pure DB-free surfaces: the task-kind/votable classifier, the done-when
680
+ # criterion progress shaper, github-push ancestry/land-proof/merge-driver, the
681
+ # ship-card + ship-preflight pure guards, merge-lock, conflict-resolve, the
682
+ # publish-reconciler's pure run, the goal-achievement rollup, and the context-pack
683
+ # bounds (which read the classifier) — all byte-identical after the move.
684
+ task_classifier_vocab criterion_progress github_push_ancestry github_push_land_proof
685
+ github_push_merge_driver ship_card ship_preflight merge_lock conflict_resolve
686
+ publish_reconciler goal_achievement context_pack
687
+ )
688
+ if [ "${SKIP_SUITE:-0}" = "1" ]; then
689
+ echo " (byte-identical leg skipped — SKIP_SUITE=1; run without it to exercise carved surfaces)"
690
+ else
691
+ echo "--- running ${#CARVE_TESTS[@]} DB-free tests that exercise the carved surfaces ---"
692
+ carve_fail=0
693
+ for t in "${CARVE_TESTS[@]}"; do
694
+ if NODE_ENV=test node "tests/$t.mjs" >/dev/null 2>&1; then
695
+ echo " ok $t"
696
+ else
697
+ echo " FAIL $t"; carve_fail=$((carve_fail+1))
698
+ fi
699
+ done
700
+ [ "$carve_fail" -eq 0 ] \
701
+ && ok "all ${#CARVE_TESTS[@]} carved-surface tests pass unchanged — behavior is byte-identical post-carve" \
702
+ || bad "$carve_fail carved-surface test(s) failed — behavior is NOT byte-identical"
703
+
704
+ if [ "${FULL_SUITE:-0}" = "1" ]; then
705
+ echo "--- FULL_SUITE=1: also running the full CI 'unit' gate (run-unit-tests.js) ---"
706
+ if node scripts/gds/run-unit-tests.js; then
707
+ ok "full DB-free unit gate passes (run-unit-tests.js)"
708
+ else
709
+ bad "full DB-free unit gate has failures — inspect (infra tests need a CI-like env: preview server + git remote)"
710
+ fi
711
+ fi
712
+ fi
713
+
714
+ # --- summary -----------------------------------------------------------------
715
+ echo "=== C7 core-carve proof: $PASS passed, $FAIL failed ==="
716
+ [ "$FAIL" -eq 0 ]