@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,435 @@
1
+ // tests/fitness.mjs — architecture fitness functions (task 1225 / Path C, ADR 0062 §9).
2
+ import assert from 'node:assert/strict';
3
+ import { test } from 'node:test';
4
+ import { createRequire } from 'node:module';
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+
8
+ const require = createRequire(import.meta.url);
9
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
10
+ const fitness = require(path.join(ROOT, 'scripts', 'gds', 'fitness.js'));
11
+
12
+ test('all fitness checks pass with no hard failures (the CI gate)', () => {
13
+ const results = fitness.runAll();
14
+ const failed = results.filter((r) => r.hardFail);
15
+ assert.equal(failed.length, 0, 'hard failures:\n' + failed.map((r) => ` ${r.name}:\n` + r.violations.map((v) => ' - ' + v).join('\n')).join('\n'));
16
+ });
17
+
18
+ test('core↔host boundary holds — only grandfathered escapes present', () => {
19
+ const r = fitness.checkCoreHostBoundary();
20
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
21
+ });
22
+
23
+ test('core↔host boundary actually CATCHES a host-game import (not a no-op gate)', () => {
24
+ const coreFile = path.join(ROOT, 'src', 'bongos', 'routes', 'tasks.js');
25
+ // After BV1.R49 the game module lives in modules/game/ — a direct import from core is flagged.
26
+ // From src/bongos/routes/ (3 levels deep), '../../../' reaches the repo root.
27
+ assert.ok(fitness.resolvesToHostGame(coreFile, '../../../modules/game/rooms/WorldRoom'), 'importing a game room into the core must be flagged');
28
+ assert.ok(fitness.resolvesToHostGame(coreFile, '../../../modules/game/world/terrain'), 'importing game world code into the core must be flagged');
29
+ assert.ok(fitness.resolvesToHostGame(coreFile, '../../../modules/game/db'), 'game db helper is host-game code — flagged');
30
+ assert.equal(fitness.GRANDFATHERED.size, 0, 'zero grandfathered exceptions');
31
+ // intra-core import is fine
32
+ assert.equal(fitness.resolvesToHostGame(coreFile, '../auth'), null, 'intra-core import is allowed');
33
+ });
34
+
35
+ test('root CLAUDE.md budget: under the hard ceiling and charter present', () => {
36
+ const r = fitness.checkClaudeMdBudget();
37
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
38
+ });
39
+
40
+ test('CLAUDE.md char/token budget actually fires on within-line bloat (not a no-op)', () => {
41
+ // One enormous single line that contains the charter heading: it passes the LINE
42
+ // ceiling (1 line) and the charter check, so ONLY the char/token budget can flag
43
+ // it — proving the token guard is real (mirrors the boundary "actually catches" test).
44
+ const bloated = '## Working with this file (content charter) ' + 'x'.repeat(fitness.ROOT_CHAR_HARD_MAX + 1000);
45
+ const r = fitness.checkClaudeMdBudget({ text: bloated });
46
+ assert.equal(r.hardFail, true, 'a file over the char ceiling must hard-fail even with few lines');
47
+ assert.ok(r.violations.some((v) => /char/i.test(v) && /token/i.test(v)), 'the violation must name the char/token budget');
48
+ });
49
+
50
+ test('CLAUDE.md char budget is ratcheted and ordered (target < ceiling, live file under it)', () => {
51
+ assert.ok(fitness.ROOT_CHAR_TARGET < fitness.ROOT_CHAR_HARD_MAX, 'target must sit below the hard ceiling');
52
+ const r = fitness.checkClaudeMdBudget();
53
+ assert.equal(r.hardFail, false, 'the live CLAUDE.md must be under the char ceiling (ratchet locked in)');
54
+ });
55
+
56
+ test('nested CLAUDE.md present for every high-traffic dir', () => {
57
+ const r = fitness.checkNestedDocsPresent();
58
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
59
+ assert.deepEqual(fitness.HIGH_TRAFFIC, ['src/bongos', 'src/bongos/routes', 'scripts/gds']);
60
+ });
61
+
62
+ test('no route bypasses server-side rank checks (ADR 0016)', () => {
63
+ const r = fitness.checkRankGuards();
64
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
65
+ });
66
+
67
+ test('generated repo map is fresh (Path C enforces Path B)', () => {
68
+ const r = fitness.checkGeneratedArtifactsFresh();
69
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
70
+ });
71
+
72
+ test('deterministic cron routines: live routines are clean (no judgment instructions)', () => {
73
+ const r = fitness.checkDeterministicRoutines();
74
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
75
+ });
76
+
77
+ test('deterministic routine check actually CATCHES judgment + divergence (not a no-op)', () => {
78
+ const clean = fitness.scanDeterministicBody('clean', {
79
+ mode: 'deterministic',
80
+ steps: [{ command: 'node x.js', sink: 'none' }],
81
+ body: 'Runs the checker.\n```bash\nnode x.js\n```\nIt never pushes and does NOT edit files.',
82
+ });
83
+ assert.deepEqual(clean, [], 'clean body (negated boundaries) must pass: ' + clean.join('; '));
84
+
85
+ const push = fitness.scanDeterministicBody('bad', { mode: 'deterministic', steps: [{ command: 'node x.js' }], body: 'Then run git push origin main.' });
86
+ assert.ok(push.some((v) => /git push/.test(v)), 'a git push must be flagged');
87
+
88
+ const edit = fitness.scanDeterministicBody('bad', { mode: 'deterministic', steps: [{ command: 'node x.js' }], body: 'Use the `Edit` tool to fix the file.' });
89
+ assert.ok(edit.some((v) => /Edit\/Write/.test(v)), 'an Edit tool instruction must be flagged');
90
+
91
+ const diverge = fitness.scanDeterministicBody('bad', { mode: 'deterministic', steps: [{ command: 'node x.js' }], body: '```bash\nnode other.js --do\n```' });
92
+ assert.ok(diverge.some((v) => /diverge/.test(v)), 'a prose command not in steps must be flagged');
93
+
94
+ const nosteps = fitness.scanDeterministicBody('bad', { mode: 'deterministic', steps: [], body: 'nothing' });
95
+ assert.ok(nosteps.some((v) => /no steps/.test(v)), 'deterministic with no steps must be flagged');
96
+
97
+ // a non-deterministic routine is ignored entirely
98
+ assert.deepEqual(fitness.scanDeterministicBody('judg', { mode: 'judgment', steps: [], body: 'run git push' }), []);
99
+ });
100
+
101
+ // --- module boundary checks (BV1.R40 / task 1409, ADR 0083) ---
102
+
103
+ test('module boundary: both checks pass (green) on the current tree', () => {
104
+ const a = fitness.checkCoreNeverImportsModule();
105
+ const b = fitness.checkModulesImportOnlyApi();
106
+ assert.equal(a.hardFail, false, a.violations.concat(a.warnings).join('\n'));
107
+ assert.equal(b.hardFail, false, b.violations.concat(b.warnings).join('\n'));
108
+ // modules/ now holds dev-box + art-pipeline (the M07/M08 moves); both import
109
+ // only the doorway and the core imports neither → zero findings even though
110
+ // the ratchet is now ENFORCING (BV1.R45).
111
+ assert.equal(a.violations.length + a.warnings.length, 0, 'core→module findings: ' + a.warnings.concat(a.violations).join('; '));
112
+ assert.equal(b.violations.length + b.warnings.length, 0, 'module→core findings: ' + b.warnings.concat(b.violations).join('; '));
113
+ });
114
+
115
+ test('module boundary ratchet is FLIPPED — enforcing by default (BV1.R45)', () => {
116
+ // the live default (nothing toggled) is enforcing: a new cross-boundary import
117
+ // is now a hard fail, not a warning. The note reflects the mode, and the clean
118
+ // post-M07 tree stays green.
119
+ const a = fitness.checkCoreNeverImportsModule();
120
+ const b = fitness.checkModulesImportOnlyApi();
121
+ assert.match(a.note, /ENFORCING/, 'core→module check must report ENFORCING');
122
+ assert.match(b.note, /ENFORCING/, 'module→core check must report ENFORCING');
123
+ assert.equal(a.hardFail, false, a.violations.join('\n'));
124
+ assert.equal(b.hardFail, false, b.violations.join('\n'));
125
+ });
126
+
127
+ test('resolvesToModule: a core require into modules/<key>/ is detected', () => {
128
+ const coreFile = path.join(ROOT, 'src', 'bongos', 'x.js');
129
+ assert.equal(fitness.resolvesToModule(coreFile, '../../modules/dev-box/box.js'), 'dev-box');
130
+ assert.equal(fitness.resolvesToModule(coreFile, './sibling.js'), null);
131
+ });
132
+
133
+ test('moduleImportViolation: doorway + intra-module OK; deep-core + sibling flagged', () => {
134
+ const f = path.join(ROOT, 'modules', 'demo', 'routes', 'x.js');
135
+ assert.equal(fitness.moduleImportViolation(f, '../../../src/module-api'), null, 'the doorway is allowed');
136
+ assert.equal(fitness.moduleImportViolation(f, '../db.js'), null, 'intra-module relative is allowed');
137
+ assert.equal(fitness.moduleImportViolation(f, 'express'), null, 'bare npm specs are allowed');
138
+ assert.match(fitness.moduleImportViolation(f, '../../../src/bongos/db') || '', /core internals/);
139
+ assert.match(fitness.moduleImportViolation(f, '../../dev-box/box') || '', /sibling module/);
140
+ });
141
+
142
+ test('module boundary actually CATCHES violations when enforcing (ratchet flip)', () => {
143
+ // prove the checks are not no-ops: with enforcing on, a synthetic violation hard-fails.
144
+ fitness._setModuleBoundaryEnforcing(true);
145
+ try {
146
+ const f = path.join(ROOT, 'modules', 'demo', 'x.js');
147
+ assert.ok(fitness.moduleImportViolation(f, '../../src/bongos/db'), 'deep-core import must be a violation');
148
+ // the live checks stay green (dev-box + art-pipeline are clean) even when enforcing
149
+ assert.equal(fitness.checkCoreNeverImportsModule().hardFail, false);
150
+ assert.equal(fitness.checkModulesImportOnlyApi().hardFail, false);
151
+ } finally {
152
+ fitness._setModuleBoundaryEnforcing(true); // restore the live default (ENFORCING, BV1.R45)
153
+ }
154
+ });
155
+
156
+ // --- core carries no module code (BV1.R45 / task 1414, ADR 0083 §Decision #4) ---
157
+
158
+ test('core-carries-no-module-code: the live kernel machinery is clean', () => {
159
+ const r = fitness.checkCoreCarriesNoModuleCode();
160
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
161
+ // the check is live, not vacuous — it discovered the real module keys
162
+ // (incl. the net-new `demo` proof module, BV1.R52 / task 1424, `ideas`, BV1.R78,
163
+ // `security`, BV1.R79, `builder-settings`, BV1.R80, `onboarding`, BV1.R81,
164
+ // `sessions`, BV1.R82, `autonomy`, BV1.R83, `status-ui`, BV1.R84,
165
+ // `hall-ui`, BV1.R85, and the net-new `provisioning` feature module, ADR 0111)
166
+ assert.deepEqual(fitness.discoveredModuleKeys().sort(), ['art-pipeline', 'autonomy', 'builder-settings', 'character-anim', 'demo', 'dev-box', 'discord', 'economy', 'game', 'grading', 'hall-ui', 'ideas', 'lifecycle', 'memory', 'onboarding', 'provisioning', 'security', 'sessions', 'status-ui']);
167
+ });
168
+
169
+ test('core-carries-no-module-code actually CATCHES a hardcoded key (and ignores comments)', () => {
170
+ // a key named in CODE is a violation
171
+ const hit = fitness.scanKernelForModuleKeys("if (key === 'dev-box') mountSpecially();", ['dev-box', 'art-pipeline']);
172
+ assert.ok(hit.some((v) => /dev-box/.test(v)), 'a hardcoded module key in code must be flagged');
173
+ // the same key in a comment / doc-example line is NOT a violation
174
+ const clean = fitness.scanKernelForModuleKeys("// e.g. logger('dev-box')\n * the dev-box doorway\nconst x = 1;", ['dev-box']);
175
+ assert.deepEqual(clean, [], 'a key on a comment line must be ignored: ' + clean.join('; '));
176
+ // token-delimited: `dev-box` must not fire inside the larger token `dev-boxes`
177
+ assert.deepEqual(fitness.scanKernelForModuleKeys("const x = 'dev-boxes';", ['dev-box']), [], 'a substring inside a larger token must not fire');
178
+ // no keys discovered → never fires (vacuous-safe before the first move)
179
+ assert.deepEqual(fitness.scanKernelForModuleKeys("mount('dev-box')", []), []);
180
+ });
181
+
182
+ // --- kernel imports no domain (BV1.R70, ADR 0091 §1) ---
183
+
184
+ test('kernel-imports-no-domain: WARN-mode ratchet, the bounded roster is live', () => {
185
+ const r = fitness.checkKernelImportsNoDomain();
186
+ // It never reds the build (WARN-mode until tranche-2 carves clear the leaks)...
187
+ assert.equal(r.hardFail, false, 'must stay WARN-mode until the kernel is clean');
188
+ // ...and it is live, not vacuous — the roster is the real ~3.5k-LOC kernel, far
189
+ // wider than the original 6 machinery files.
190
+ assert.ok(fitness.KERNEL_FILES.length >= 15, `roster should be the full kernel, got ${fitness.KERNEL_FILES.length}`);
191
+ assert.ok(fitness.KERNEL_FILES.includes('src/bongos/db-kernel.js'), 'the R69 kernel db slice must be in the roster');
192
+ assert.ok(fitness.KERNEL_FILES.includes('src/bongos/auth.js'), 'the authz boundary must be in the roster');
193
+ });
194
+
195
+ test('kernel-imports-no-domain actually CATCHES a kernel→domain import (not a no-op)', () => {
196
+ const kset = new Set(fitness.KERNEL_FILES);
197
+ // a kernel file reaching a non-kernel core domain IS a leak
198
+ assert.equal(
199
+ fitness.kernelDomainImport('src/bongos/auth.js', './onboarding-state', kset),
200
+ 'src/bongos/onboarding-state.js',
201
+ 'a kernel→domain import must be flagged'
202
+ );
203
+ // kernel → kernel is clean
204
+ assert.equal(fitness.kernelDomainImport('src/bongos/auth.js', './pool', kset), null, 'kernel→kernel import must be clean');
205
+ assert.equal(fitness.kernelDomainImport('src/module-api.js', './bongos/db-kernel', kset), null, 'doorway→db-kernel must be clean');
206
+ // grandfathered infra/util is clean
207
+ assert.equal(fitness.kernelDomainImport('src/bongos/module-scope-map.js', './path-match', kset), null, 'kernel→path-match util must be clean');
208
+ assert.equal(fitness.kernelDomainImport('src/bongos/pool.js', '../db', kset), null, 'pool→raw base pool must be clean');
209
+ // a bare npm/node spec is never our concern
210
+ assert.equal(fitness.kernelDomainImport('src/bongos/auth.js', 'node:os', kset), null, 'a bare spec must be ignored');
211
+ // the still-fused db.js monolith IS a tracked leak (not allowlisted)
212
+ assert.equal(fitness.kernelDomainImport('src/module-api.js', './bongos/db', kset), 'src/bongos/db.js', 'reaching the db.js monolith must be flagged');
213
+ });
214
+
215
+ // --- module migrations additive + namespaced (BV1.R45 / task 1414, ADR 0083 §Decision #5) ---
216
+
217
+ test('module-migrations-additive: the live tree is clean (no module migrations yet)', () => {
218
+ const r = fitness.checkModuleMigrationsAdditive();
219
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
220
+ });
221
+
222
+ test('module-migrations-additive actually CATCHES destructive + non-namespaced DDL', () => {
223
+ // the SQL namespace prefix derives from the key: dev-box → dev_box
224
+ assert.equal(fitness.moduleNamespace('dev-box'), 'dev_box');
225
+
226
+ // additive + namespaced → clean (table, index-on-own-table, additive ALTER)
227
+ const good = fitness.moduleMigrationViolations('dev-box',
228
+ 'CREATE TABLE IF NOT EXISTS dev_box_runs (id serial primary key);\n' +
229
+ 'CREATE INDEX idx_dev_box_runs_id ON dev_box_runs (id);\n' +
230
+ 'ALTER TABLE dev_box_runs ADD COLUMN note text;');
231
+ assert.deepEqual(good, [], 'an additive, namespaced migration must pass: ' + good.join('; '));
232
+
233
+ // destructive DDL is rejected
234
+ assert.ok(fitness.moduleMigrationViolations('dev-box', 'DROP TABLE dev_box_runs;').some((v) => /destructive/i.test(v)), 'DROP TABLE must be flagged');
235
+ assert.ok(fitness.moduleMigrationViolations('dev-box', 'ALTER TABLE dev_box_runs DROP COLUMN note;').some((v) => /destructive/i.test(v)), 'ALTER … DROP must be flagged');
236
+ assert.ok(fitness.moduleMigrationViolations('dev-box', 'TRUNCATE dev_box_runs;').some((v) => /destructive/i.test(v)), 'TRUNCATE must be flagged');
237
+
238
+ // a CHECK-enum WIDENING (drop-if-exists + re-add the SAME-named constraint) is
239
+ // additive-in-spirit and ALLOWED (task 1978: provisioning gains 'standalone')
240
+ const widen = fitness.moduleMigrationViolations('dev-box',
241
+ 'ALTER TABLE dev_box_runs DROP CONSTRAINT IF EXISTS dev_box_runs_shape_check;\n' +
242
+ "ALTER TABLE dev_box_runs ADD CONSTRAINT dev_box_runs_shape_check CHECK (shape IN ('a','b','c'));");
243
+ assert.deepEqual(widen, [], 'a CHECK-enum widening (drop+re-add same constraint) must pass: ' + widen.join('; '));
244
+ // but a BARE drop constraint (no matching re-add) is STILL destructive
245
+ assert.ok(fitness.moduleMigrationViolations('dev-box', 'ALTER TABLE dev_box_runs DROP CONSTRAINT dev_box_runs_shape_check;').some((v) => /destructive/i.test(v)), 'a bare DROP CONSTRAINT (no re-add) must still be flagged');
246
+
247
+ // a created object outside the <key>_ namespace is rejected
248
+ assert.ok(fitness.moduleMigrationViolations('dev-box', 'CREATE TABLE runs (id int);').some((v) => /namespace/i.test(v)), 'a table outside dev_box_ must be flagged');
249
+ // a module migration altering a CORE table is rejected (reach core via the seam)
250
+ assert.ok(fitness.moduleMigrationViolations('dev-box', 'ALTER TABLE builders ADD COLUMN x int;').some((v) => /namespace/i.test(v)), 'altering a core table must be flagged');
251
+
252
+ // a commented-out destructive line is ignored
253
+ assert.deepEqual(
254
+ fitness.moduleMigrationViolations('dev-box', '-- DROP TABLE dev_box_runs;\nCREATE TABLE dev_box_runs (id int);'),
255
+ [], 'a commented-out DROP must be ignored',
256
+ );
257
+ });
258
+
259
+ // --- Check 11b: migration filenames namespaced + no stem collision (ADR 0108 §5 / task 1885) ---
260
+
261
+ test('migration-namespacing: the live tree is clean (all bare files grandfathered)', () => {
262
+ const r = fitness.checkMigrationNamespacing();
263
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
264
+ assert.ok(/core \+ /.test(r.note), 'note reports the per-source counts');
265
+ });
266
+
267
+ test('migration-namespacing actually CATCHES a new bare core migration (not a no-op gate)', () => {
268
+ // The pure helper the check is built on: a bare core migration ABOVE the legacy cutoff
269
+ // must be flagged as needing the core_ prefix (else it could collide with an instance/
270
+ // module migration across repos). Proves the gate has teeth without polluting the tree.
271
+ const migNs = require(path.join(ROOT, 'scripts', 'gds', 'migration-namespace.js'));
272
+ const v = migNs.filenameViolation('core', '188_new_bare.sql');
273
+ assert.ok(v && /core_-prefixed/.test(v), 'a new bare core migration must be flagged');
274
+ assert.equal(migNs.filenameViolation('core', 'core_188_new_bare.sql'), null, 'the namespaced form passes');
275
+ });
276
+
277
+ test('migration-namespacing actually CATCHES a cross-source stem collision (the silent-skip bug)', () => {
278
+ const migNs = require(path.join(ROOT, 'scripts', 'gds', 'migration-namespace.js'));
279
+ const collisions = migNs.stemCollisions([
280
+ { source: 'core', basename: '188_x.sql' },
281
+ { source: 'instance', basename: '188_x.sql' },
282
+ ]);
283
+ assert.equal(collisions.length, 1, 'a stem shared by two sources must be reported');
284
+ assert.equal(collisions[0].stem, '188_x');
285
+ });
286
+
287
+ // --- goal scope map imports PROTECTED_GLOBS (BV1.R54 / task 1508, ADR 0086 §7) ---
288
+
289
+ test('scope map import check: the live module-scope-map.js passes', () => {
290
+ const r = fitness.checkScopeMapImportsProtected();
291
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
292
+ });
293
+
294
+ test('scope map import check actually CATCHES a re-declared / un-imported PROTECTED_GLOBS (not a no-op)', () => {
295
+ // clean: imports the single source + derives, no second list
296
+ const clean = fitness.scanScopeMapSource(
297
+ "const { PROTECTED_GLOBS } = require('./permission-path-check');\nconst p = PROTECTED_GLOBS;",
298
+ );
299
+ assert.deepEqual(clean, [], 'an importing source must pass: ' + clean.join('; '));
300
+
301
+ // re-declares the list (the SEC #863 second-list drift) → flagged
302
+ const copied = fitness.scanScopeMapSource(
303
+ "const { touchesOverlap } = require('./path-match');\nconst PROTECTED_GLOBS = ['migrations/'];",
304
+ );
305
+ assert.ok(copied.some((v) => /re-declares PROTECTED_GLOBS/.test(v)), 'a copied second list must be flagged');
306
+
307
+ // does not import permission-path-check at all → flagged
308
+ const missing = fitness.scanScopeMapSource("const x = require('./path-match');\n// no protected source");
309
+ assert.ok(missing.some((v) => /must IMPORT PROTECTED_GLOBS/.test(v)), 'a missing import must be flagged');
310
+ });
311
+
312
+ // --- hall widgets are registry-owned, not hardcoded (BV1.R75 / ADR 0062 §4) ---
313
+
314
+ test('hall section registry check: the live index.html passes (no hardcoded sections)', () => {
315
+ const r = fitness.checkHallSectionRegistry();
316
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
317
+ });
318
+
319
+ test('hall section registry check actually CATCHES a hardcoded <section class="scroll"> (not a no-op)', () => {
320
+ // clean: an empty <main> — every widget comes from the registry.
321
+ const clean = fitness.scanHallSectionRegistry('<body><main></main></body>');
322
+ assert.deepEqual(clean, [], 'an empty <main> must pass: ' + clean.join('; '));
323
+
324
+ // a hardcoded hall section back in <main> → flagged.
325
+ const hardcoded = fitness.scanHallSectionRegistry(
326
+ '<main>\n <section class="scroll" id="profile-scroll"><h2>Standing</h2></section>\n</main>',
327
+ );
328
+ assert.equal(hardcoded.length, 1, 'one inline hall section must be caught');
329
+
330
+ // a comment that merely MENTIONS the markup is NOT a violation (the carve note).
331
+ const commented = fitness.scanHallSectionRegistry(
332
+ '<!-- no <section class="scroll"> may be hardcoded into <main> -->\n<main></main>',
333
+ );
334
+ assert.deepEqual(commented, [], 'a comment mentioning the markup must not trip the scan');
335
+
336
+ // a non-scroll <section> in <main> (e.g. a future layout wrapper) is fine.
337
+ const otherSection = fitness.scanHallSectionRegistry('<main><section class="hero"></section></main>');
338
+ assert.deepEqual(otherSection, [], 'a non-widget <section> must not be flagged');
339
+ });
340
+
341
+ // --- the demo proof module: BV1.R52 / task 1424 (ADR 0083) ----------------------
342
+ // The net-new `modules/demo/` module is the live acceptance proof for the module
343
+ // system. These tests lock in BOTH directions: the live demo module is clean, AND
344
+ // fitness REJECTS the two one-way-rule violations against the REAL demo paths
345
+ // (a sibling-module import, and an ungated module write route).
346
+
347
+ test('demo proof module is live + clean (boundary + rank + migration green)', () => {
348
+ // discovered with the other modules (asserted above) and clean on every gate.
349
+ assert.ok(fitness.discoveredModuleKeys().includes('demo'), 'demo is a discovered module');
350
+ assert.equal(fitness.checkModulesImportOnlyApi().hardFail, false, 'demo imports only the doorway');
351
+ assert.equal(fitness.checkCoreNeverImportsModule().hardFail, false, 'core never imports demo');
352
+ assert.equal(fitness.checkRankGuards().hardFail, false, 'demo write route is rank-gated');
353
+ assert.equal(fitness.checkModuleMigrationsAdditive().hardFail, false, 'demo migration is additive + namespaced');
354
+ });
355
+
356
+ test('demo RED-LINE (a): a cross-module import (demo → dev-box internals) is REJECTED', () => {
357
+ // the exact violation the BV1.R52 transcript injects: demo deep-importing a
358
+ // sibling module. moduleImportViolation runs on the real demo route path.
359
+ const demoRoute = path.join(ROOT, 'modules', 'demo', 'routes', 'demo.js');
360
+ const v = fitness.moduleImportViolation(demoRoute, '../../dev-box/box');
361
+ assert.ok(v && /sibling module "dev-box"/.test(v), 'demo importing dev-box internals must be flagged: ' + v);
362
+ // the doorway is still allowed (the legitimate single core import)
363
+ assert.equal(fitness.moduleImportViolation(demoRoute, '../../../src/module-api'), null, 'the doorway import is allowed');
364
+ });
365
+
366
+ test('demo RED-LINE (b): an ungated demo write route is REJECTED (hard fail)', () => {
367
+ // the route-rank classifier on an ungated POST → 'unknown' → blocker. (The
368
+ // classifier anchors on a `router.<method>(` declaration, so the router var
369
+ // must be named `router` — exactly as the real route file declares it.)
370
+ const ungated = "const express = require('express');\nmodule.exports = () => {\n const router = express.Router();\n router.post('/demo/ping', (req, res) => res.json({}));\n return router;\n};\n";
371
+ const rrc = require(path.join(ROOT, 'src', 'bongos', 'route-rank-check.js'));
372
+ const ping = rrc.classifyText(ungated).find((c) => c.key === 'POST /demo/ping');
373
+ assert.ok(ping && ping.rank === 'unknown', 'an ungated POST must classify as unknown (→ blocker)');
374
+ // and the gated form the live module ships classifies to a known rank
375
+ const gated = "const api = require('../../../src/module-api');\nconst express = require('express');\nmodule.exports = () => {\n const router = express.Router();\n router.post('/demo/ping', api.requireRank('metic', 'archon'), (req, res) => res.json({}));\n return router;\n};\n";
376
+ const gping = rrc.classifyText(gated).find((c) => c.key === 'POST /demo/ping');
377
+ assert.equal(gping.rank, 'metic+archon', 'the rank-gated write route classifies to a known rank');
378
+ });
379
+
380
+ // --- no hardcoded host identity in portable code (BV1.R76 / task 1705) ---
381
+
382
+ test('identity gate: the live portable tree is clean (widened directory scan)', () => {
383
+ const r = fitness.checkKernelPromptsNoHardcodedIdentity();
384
+ assert.equal(r.hardFail, false, r.violations.join('\n'));
385
+ assert.equal(r.violations.length, 0, 'unexpected brand leaks: ' + r.violations.join('; '));
386
+ // prove it's a WIDE scan, not the old 9-file allowlist.
387
+ assert.match(r.note, /src\/bongos\/\*\* \+ modules\/\*\*/, 'the note must describe the directory-wide scan');
388
+ assert.ok(/(\d+) portable source/.exec(r.note)[1] > 50, 'a directory scan covers many files, not nine');
389
+ });
390
+
391
+ test('identity gate actually CATCHES a re-hardcode (code, URL, HTML) — not a no-op', () => {
392
+ const { scanPromptIdentity } = fitness;
393
+ assert.equal(scanPromptIdentity('x.js', 'const t = "Amazonprimea";').length, 1, 'a bare code literal must be caught');
394
+ // the ://-safe comment strip must NOT hide a literal inside a URL
395
+ assert.equal(scanPromptIdentity('x.js', 'const u = "https://amazonprimea.com/x";').length, 1, 'a leak inside a URL must be caught');
396
+ assert.equal(scanPromptIdentity('x.html', '<title>Amazonprimea</title>').length, 1, 'an HTML title leak must be caught');
397
+ assert.equal(scanPromptIdentity('x.js', 'const p = "Off the Boats";').length, 1, 'the product name must be caught');
398
+ });
399
+
400
+ test('identity gate skips comments + instance-injected tokens (no false positives)', () => {
401
+ const { scanPromptIdentity } = fitness;
402
+ assert.equal(scanPromptIdentity('x.js', '// see amazonprimea.com for context').length, 0, 'a full-line comment is skipped');
403
+ assert.equal(scanPromptIdentity('x.js', 'doThing(); // amazonprimea note').length, 0, 'a trailing comment is skipped');
404
+ assert.equal(scanPromptIdentity('x.js', '/* Amazonprimea history */\nconst ok = 1;').length, 0, 'a block comment is skipped');
405
+ assert.equal(scanPromptIdentity('x.html', '<!-- Amazonprimea note -->').length, 0, 'an HTML comment is skipped');
406
+ assert.equal(scanPromptIdentity('x.html', '<title>{{worldName}} — the gate</title>').length, 0, 'a {{worldName}} token carries no literal');
407
+ });
408
+
409
+ // --- write-route validation build check (BV1.R12 / task 1999, ADR 0118) ---
410
+
411
+ test('write-route validation check: the live tree is clean (R11 sweep reached 100%)', () => {
412
+ const r = fitness.checkWriteRoutesValidated();
413
+ assert.equal(r.hardFail, false, 'unvalidated write routes:\n' + r.violations.join('\n'));
414
+ assert.ok(/dynamic-key prefs routes validate by lib/.test(r.note), 'note explains the exemption');
415
+ });
416
+
417
+ test('write-route validation check actually CATCHES an unvalidated write route (not a no-op)', () => {
418
+ const { scanUnvalidatedWriteRoutes } = fitness;
419
+ const model = [
420
+ { method: 'POST', route: '/widgets', body: { readsBody: true, validated: false }, file: 'x.js' }, // BAD
421
+ { method: 'POST', route: '/gadgets', body: { readsBody: true, validated: true }, file: 'x.js' }, // ok — validated
422
+ { method: 'POST', route: '/pings', body: { readsBody: false, validated: false }, file: 'x.js' }, // ok — reads no body
423
+ { method: 'GET', route: '/widgets', body: { readsBody: true, validated: false }, file: 'x.js' }, // ok — not a write
424
+ { method: 'PATCH', route: '/me/render', body: { readsBody: true, validated: false }, file: 'x.js' }, // ok — exempt (dynamic-key)
425
+ { method: 'PUT', route: '/things/:id', body: null, file: 'x.js' }, // ok — no body model
426
+ ];
427
+ const flagged = scanUnvalidatedWriteRoutes(model);
428
+ assert.equal(flagged.length, 1, 'exactly the one unvalidated body-reading write route is flagged: ' + JSON.stringify(flagged));
429
+ assert.ok(/POST \/widgets/.test(flagged[0]), 'the offending route is named');
430
+ });
431
+
432
+ test('write-route validation exemptions are the known dynamic-key prefs routes only', () => {
433
+ const exempt = [...fitness.WRITE_VALIDATION_EXEMPT];
434
+ assert.ok(exempt.length >= 1 && exempt.every((e) => e.startsWith('PATCH /me/')), 'exemptions are all /me/* prefs patches: ' + exempt.join(', '));
435
+ });
@@ -0,0 +1,104 @@
1
+ // tests/fitness_two_root.mjs
2
+ //
3
+ // ADR 0108 §Consequences #4 (configurable-root W6 / task 1886) — prove the guardrails resolve
4
+ // INSTANCE content through resolveInstanceRoot(), not a hardcoded repo root. If the split were a
5
+ // no-op (still `__dirname/../..`), pointing OTB_INSTANCE_ROOT at a different tree would change
6
+ // NOTHING. These tests DIVERGE the roots (real core root, temp instance root) and assert the
7
+ // instance-owned reads follow the instance root — impossible with the old single hardcoded root.
8
+ //
9
+ // The roots are captured at module-require time, so each case runs fitness/the generators in a
10
+ // CHILD process with OTB_INSTANCE_ROOT set (OTB_ is an accepted legacy env prefix; ADR 0108 §1).
11
+ //
12
+ // Run: node tests/fitness_two_root.mjs
13
+
14
+ import { strict as assert } from 'node:assert';
15
+ import { execFileSync } from 'node:child_process';
16
+ import { mkdtempSync, writeFileSync, mkdirSync } from 'node:fs';
17
+ import { tmpdir } from 'node:os';
18
+ import { join, dirname } from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+
21
+ const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
22
+ let passed = 0;
23
+ let failed = 0;
24
+ function t(name, fn) {
25
+ try { fn(); passed++; console.log(` PASS ${name}`); }
26
+ catch (e) { failed++; console.log(` FAIL ${name}\n ${e.message}`); }
27
+ }
28
+
29
+ // Run a snippet of node with OTB_INSTANCE_ROOT set, returning parsed stdout JSON.
30
+ function runWith(instanceRoot, snippet) {
31
+ const out = execFileSync(process.execPath, ['-e', snippet], {
32
+ encoding: 'utf8',
33
+ env: { ...process.env, OTB_INSTANCE_ROOT: instanceRoot },
34
+ cwd: ROOT,
35
+ });
36
+ return JSON.parse(out);
37
+ }
38
+
39
+ // ---- fitness: the CLAUDE.md-budget check reads the INSTANCE's CLAUDE.md --------------------
40
+ t('checkClaudeMdBudget reads the CLAUDE.md at resolveInstanceRoot(), not a hardcoded root', () => {
41
+ const dir = mkdtempSync(join(tmpdir(), 'w6-inst-'));
42
+ // Oversized CLAUDE.md WITH the charter heading, so ONLY the char/token budget can fire. This
43
+ // violation can appear only if the check read THIS fixture (the real repo CLAUDE.md is well under
44
+ // the ceiling), which proves the read followed OTB_INSTANCE_ROOT.
45
+ writeFileSync(join(dir, 'CLAUDE.md'), '## Working with this file (content charter)\n' + 'x'.repeat(60000));
46
+ const r = runWith(dir, `
47
+ const f = require(${JSON.stringify(join(ROOT, 'scripts/gds/fitness.js'))});
48
+ process.stdout.write(JSON.stringify(f.checkClaudeMdBudget()));
49
+ `);
50
+ assert.equal(r.hardFail, true, 'the fixture CLAUDE.md is over the char ceiling → must hard-fail');
51
+ assert.ok(r.violations.some((v) => /char/i.test(v)), 'the char/token budget violation must fire');
52
+ });
53
+
54
+ t('checkClaudeMdBudget still PASSES when the instance root is the real repo (byte-identical default)', () => {
55
+ const r = runWith(ROOT, `
56
+ const f = require(${JSON.stringify(join(ROOT, 'scripts/gds/fitness.js'))});
57
+ process.stdout.write(JSON.stringify(f.checkClaudeMdBudget()));
58
+ `);
59
+ assert.equal(r.hardFail, false, 'the live CLAUDE.md is under the ceiling');
60
+ });
61
+
62
+ // ---- fitness: core checks stay on the CORE root regardless of instance root ------------------
63
+ t('checkNestedDocsPresent stays clean even with a divergent (empty) instance root', () => {
64
+ const dir = mkdtempSync(join(tmpdir(), 'w6-inst-'));
65
+ // HIGH_TRAFFIC nested docs (src/bongos, scripts/gds, …) are CORE — they must still resolve against
66
+ // the real core root even though the instance root is an empty temp dir. If they wrongly used the
67
+ // instance root, all three would be "missing" → hard fail.
68
+ const r = runWith(dir, `
69
+ const f = require(${JSON.stringify(join(ROOT, 'scripts/gds/fitness.js'))});
70
+ process.stdout.write(JSON.stringify(f.checkNestedDocsPresent()));
71
+ `);
72
+ assert.equal(r.hardFail, false, 'core nested docs resolve against the core root, not the instance root');
73
+ });
74
+
75
+ // ---- gen-file-map: resolves entirely against the INSTANCE root ------------------------------
76
+ t('gen-file-map lists the INSTANCE root .claude/skills, not the core repo', () => {
77
+ const dir = mkdtempSync(join(tmpdir(), 'w6-inst-'));
78
+ mkdirSync(join(dir, '.claude', 'skills', 'only-one-skill'), { recursive: true });
79
+ mkdirSync(join(dir, '.claude', 'scheduled-tasks'), { recursive: true });
80
+ const model = runWith(dir, `
81
+ const path = require('node:path');
82
+ const g = require(${JSON.stringify(join(ROOT, 'scripts/gds/gen-file-map.js'))});
83
+ process.stdout.write(JSON.stringify(g.buildModel()));
84
+ `);
85
+ const skills = model.find((s) => s.id === 'skills');
86
+ assert.ok(skills, 'a skills section is present');
87
+ assert.deepEqual(skills.entries.map((e) => e.name), ['only-one-skill'],
88
+ 'gen-file-map read the temp instance .claude/skills (one dir), not the real repo (~30 skills)');
89
+ });
90
+
91
+ // ---- gen-repo-map: still maps CORE code when the instance root diverges ----------------------
92
+ t('gen-repo-map maps CORE files (fitness.js) regardless of a divergent instance root', () => {
93
+ const dir = mkdtempSync(join(tmpdir(), 'w6-inst-')); // empty instance root
94
+ const model = runWith(dir, `
95
+ const g = require(${JSON.stringify(join(ROOT, 'scripts/gds/gen-repo-map.js'))});
96
+ const m = g.buildModel();
97
+ process.stdout.write(JSON.stringify({ files: m.files.length, hasFitness: m.byFile.some((f) => f.rel === 'scripts/gds/fitness.js') }));
98
+ `);
99
+ assert.ok(model.files > 50, `core scan should still find many files (got ${model.files})`);
100
+ assert.equal(model.hasFitness, true, 'the core file scripts/gds/fitness.js is mapped from the core root');
101
+ });
102
+
103
+ console.log(`\nfitness_two_root: ${passed} passed, ${failed} failed`);
104
+ process.exit(failed ? 1 : 0);
@@ -0,0 +1,34 @@
1
+ {
2
+ "_comment": "Hand-built #506-shaped session digest (6D.5, ADR 0027). The real 2026-06-01 #506 transcript is not retained locally, so this is a faithful reconstruction of the post-mortem's documented shape: a one-line welcome-copy fix (2 work turns) drowned in GDS plumbing + footgun recovery (~94% overhead), with the three hand-labelled footguns that became #513/#514/#468. Identity is generic per V3.R12. This is the regression gate's INPUT — session-eval.js must keep reproducing the findings the test asserts.",
3
+ "session_id": "fixture506-0000-0000-0000-000000000506",
4
+ "github_login": "session-506-builder",
5
+ "rank": "archon",
6
+ "task_ids": [506],
7
+ "total_tokens": 28670,
8
+ "duration_seconds": 5400,
9
+ "metrics": {
10
+ "assistant_turns": 9,
11
+ "user_turns": 6,
12
+ "tool_use_count": 9,
13
+ "tool_result_count": 6,
14
+ "tool_error_count": 3
15
+ },
16
+ "detail": [
17
+ { "i": 0, "role": "assistant", "tools": ["Bash"], "snippet": "node scripts/gds/start.js — survey claimable", "in": 4000, "out": 150, "cache_read": 0, "cache_creation": 0 },
18
+ { "i": 1, "role": "assistant", "tools": ["Bash"], "snippet": "node scripts/gds/claim.js 506", "in": 3500, "out": 120, "cache_read": 0, "cache_creation": 0 },
19
+ { "i": 2, "role": "user", "tool_results": 1 },
20
+ { "i": 3, "role": "assistant", "tools": ["Read"], "snippet": "read the welcome copy string in public/", "in": 1000, "out": 80, "cache_read": 0, "cache_creation": 0 },
21
+ { "i": 4, "role": "assistant", "tools": ["Edit"], "snippet": "change the one welcome-copy line", "in": 500, "out": 60, "cache_read": 0, "cache_creation": 0 },
22
+ { "i": 5, "role": "user", "tool_results": 1 },
23
+ { "i": 6, "role": "assistant", "tools": ["Bash"], "snippet": "node scripts/gds/ship.js 506 --kind chore", "in": 5000, "out": 200, "cache_read": 0, "cache_creation": 0 },
24
+ { "i": 7, "role": "user", "tool_results": 1, "tool_errors": 1, "snippet": "error: bad_kind — kind must be one of: feature, bug, infra, refactor" },
25
+ { "i": 8, "role": "assistant", "tools": ["Bash"], "snippet": "retry node scripts/gds/ship.js 506 --kind feature", "in": 3000, "out": 150, "cache_read": 0, "cache_creation": 0 },
26
+ { "i": 9, "role": "user", "tool_results": 1, "tool_errors": 1, "snippet": "status_not_patchable: status is not editable via PATCH; use POST /tasks/:id/promote" },
27
+ { "i": 10, "role": "assistant", "tools": ["Bash"], "snippet": "try PATCH status then the promote route", "in": 2800, "out": 130, "cache_read": 0, "cache_creation": 0 },
28
+ { "i": 11, "role": "user", "tool_results": 1, "tool_errors": 1, "snippet": "smoke-write.sh: FAIL 4c assertion expected confirmed got completed — 1 failed" },
29
+ { "i": 12, "role": "assistant", "tools": ["Bash"], "snippet": "node scripts/gds/ship.js 506 — subagent grader v4: panel of 4 workers", "in": 4500, "out": 300, "cache_read": 0, "cache_creation": 0 },
30
+ { "i": 13, "role": "user", "tool_results": 1 },
31
+ { "i": 14, "role": "assistant", "tools": ["Bash"], "snippet": "psql realign description; git merge --no-ff; push; deploy", "in": 3000, "out": 180, "cache_read": 0, "cache_creation": 0 },
32
+ { "i": 15, "role": "user", "tool_results": 1 }
33
+ ]
34
+ }