@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,608 @@
1
+ #!/usr/bin/env node
2
+ // Onboarding-diagram generator (task #357; conceptual diagrams added #436).
3
+ //
4
+ // Regenerates the data-driven onboarding diagrams from LIVE facts so they stay
5
+ // an accurate snapshot of the architecture with no human in the loop:
6
+ // 01-task-lifecycle ← task-status set (+ structural transitions)
7
+ // 02-rank-ladder ← rank enum + wired ranks + default
8
+ // 05-versioning ← live versions (id/status)
9
+ // 03-drachmae-karma ← per-piece backing-task status + seeded-achievement count
10
+ // 04-architecture ← per-piece backing-task status: the ADR 0024 memory
11
+ // chain + the dev-box / box→prod ship flow, merged into
12
+ // one "complete architecture" map (was 04-server-repo-
13
+ // memory + 06-dev-box; consolidated under task 1059)
14
+ //
15
+ // It writes each .mmd from a template, renders the SVG (crisp, pannable) + PNG
16
+ // (fallback) via scripts/render-diagrams.sh, and rewrites the data-driven slices
17
+ // of assertions.json so the drift checker agrees. As of ADR 0110 pt.3 (task 2027)
18
+ // the .svg/.png renders are GITIGNORED and regenerated at DEPLOY (deploy-prod.sh
19
+ // runs render-diagrams.sh against the tracked .mmd, using the host's installed
20
+ // Chrome); only the .mmd + assertions.json are tracked. So ship.js runs this with
21
+ // --no-render (sources only) — pass --no-render anywhere a headless browser is
22
+ // absent or the renders aren't wanted in the working tree.
23
+ //
24
+ // The 2 CONCEPTUAL diagrams (03-drachmae-karma, 04-architecture) used to be
25
+ // hand-authored and only flagged on drift. As of #436 they are auto-generated
26
+ // too: each feature-piece is LIVE iff its backing GDS task is 'shipped', so their
27
+ // LIVE/PLANNED labels + edge styles are driven by live data and never need a
28
+ // hand-fix. CAVEAT — they reduce to the AUTHENTICATED /tasks/:id status, so when
29
+ // no GDS session is available (headless run, no creds) facts.gatherFacts returns
30
+ // conceptual=null and this generator SKIPS 03/04 (leaving the files untouched)
31
+ // rather than emit wrong data. The 3 mechanical diagrams have no such dependency
32
+ // and always regenerate. The drift checker remains as a belt-and-braces backstop.
33
+ //
34
+ // Idempotent: if the regenerated content matches what's on disk, nothing
35
+ // changes. Run on every deploy (ship.js / merge-mode call it before deploying).
36
+ //
37
+ // Usage:
38
+ // node scripts/gds/gen-diagrams.js # regenerate + render
39
+ // node scripts/gds/gen-diagrams.js --check # report if anything WOULD change, write nothing (exit 2 if so)
40
+ // node scripts/gds/gen-diagrams.js --no-render # write .mmd + assertions only
41
+
42
+ const fs = require('node:fs');
43
+ const path = require('node:path');
44
+ const { spawnSync } = require('node:child_process');
45
+ const { apiCall } = require('./cli-lib.js');
46
+ const facts = require('./diagram-facts.js');
47
+
48
+ const REPO = path.join(__dirname, '..', '..');
49
+ const DIR = path.join(REPO, 'docs/onboarding/diagrams');
50
+ const ASSERT_PATH = path.join(DIR, 'assertions.json');
51
+
52
+ // --- instance branding (R58, task 1197) ------------------------------------
53
+ // The conceptual diagrams (03/04) carry instance identity:
54
+ // the currency name, the public host, the world/product name. Read them from
55
+ // the branding contract so a neutral instance renders neutral diagrams and an
56
+ // owner's instance renders its own — no hard-coded OTB/Amazonprimea tokens, no
57
+ // prod IP. Fail-safe to the neutral defaults (the generator must run headless,
58
+ // and a branding validation error must not break diagram regeneration).
59
+ // NOTE: the diagram FILE ids (e.g. 03-drachmae-karma) are structural — the hall
60
+ // UI, drift checker, and onboarding docs key off them — and are intentionally
61
+ // NOT rebranded here; this task parameterizes the rendered CONTENT.
62
+ function brand() {
63
+ let b = {};
64
+ try { b = require('../../src/branding').branding(); } catch { /* fail-to-neutral */ }
65
+ const currency = (b.currency && b.currency.label) || 'credits';
66
+ const worldName = (b.identity && b.identity.worldName) || 'Cloud Bongos';
67
+ const productName = (b.identity && b.identity.productName) || worldName;
68
+ let host = 'localhost:3000';
69
+ try { host = new URL((b.domains && b.domains.publicOrigin) || 'http://localhost:3000').host; } catch { /* keep default */ }
70
+ return { currency, worldName, productName, host };
71
+ }
72
+ const cap = (s) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s);
73
+
74
+ // --- structural knowledge the DB doesn't carry -----------------------------
75
+
76
+ // Which Greek band each rank sits in (the enum order encodes it, but name it
77
+ // explicitly so a reordered enum still groups correctly). Unknown ranks fall
78
+ // into an "unclassified" band so a newly-added enum value still renders.
79
+ // Arrays are in intended top-to-bottom (highest→lowest) order; within-band
80
+ // render order follows these arrays (NOT enum order), so a live rank lands in
81
+ // the right vertical slot. `thetes` is the graduated-newcomer rank (#692 / ADR
82
+ // 0034) — a sub-citizen sitting between metic and xenos, so it lives in the
83
+ // outsider band, not among the (reserved) citizen wealth-classes.
84
+ const RANK_BANDS = {
85
+ divine: ['olympian', 'hermes', 'oracle', 'demigod'],
86
+ citizen: ['archon', 'strategos', 'boule', 'aristoi', 'hippeis', 'zeugitai'],
87
+ outsider: ['metic', 'thetes', 'xenos', 'periokoi', 'doulos', 'helot'],
88
+ };
89
+ const BAND_LABEL = {
90
+ divine: 'Divine — above the system',
91
+ citizen: 'Citizen — the working ladder',
92
+ outsider: 'Outsider / sub-citizen — sandboxed',
93
+ unclassified: 'Unclassified — new enum value, place me',
94
+ };
95
+
96
+ // Standard task-lifecycle transitions. Edges render only when BOTH endpoints
97
+ // are in the live status set; a live status not mentioned here renders as a
98
+ // flagged standalone node.
99
+ const LIFECYCLE_EDGES = [
100
+ ['[*]', 'backlog', 'task created'],
101
+ ['backlog', 'ready', 'deps shipped / promote'],
102
+ ['ready', 'active', '/builder-claim'],
103
+ ['active', 'blocked', 'blocker filed'],
104
+ ['blocked', 'active', 'blocker resolved'],
105
+ ['active', 'ready', '/builder-release (no credits)'],
106
+ ['active', 'completed', '/builder-ship: declared done + smoke tests'],
107
+ ['completed', 'confirmed', 'grader passes ◀ CREDITS AWARDED HERE'],
108
+ ['confirmed', 'shipped', 'CI + gate-review → auto-merge + deploy'],
109
+ ['backlog', 'abandoned', 'dropped'],
110
+ ];
111
+
112
+ // --- templates (pure functions of facts) -----------------------------------
113
+
114
+ function lifecycleMmd(f) {
115
+ const statuses = new Set(f.task_statuses);
116
+ const known = new Set(LIFECYCLE_EDGES.flatMap(([a, b]) => [a, b]).filter((s) => s !== '[*]'));
117
+ const lines = [
118
+ '---',
119
+ 'title: Task lifecycle — from backlog to shipped (AUTO-GENERATED from live facts — do not hand-edit; see scripts/gds/gen-diagrams.js)',
120
+ '---',
121
+ 'stateDiagram-v2',
122
+ ];
123
+ for (const [a, b, label] of LIFECYCLE_EDGES) {
124
+ const aok = a === '[*]' || statuses.has(a);
125
+ const bok = b === '[*]' || statuses.has(b);
126
+ if (aok && bok) lines.push(` ${a} --> ${b}: ${label}`);
127
+ }
128
+ lines.push(' shipped --> [*]: live in production');
129
+ // Landing (confirmed→shipped) + the rank/surface auto-merge gate. Static policy
130
+ // text (ADR 0058/0042/0043), mirrored in docs/onboarding/primer.md "How work
131
+ // lands". Only rendered when both confirmed and shipped are live statuses, so the
132
+ // note never references a status the diagram doesn't show.
133
+ if (statuses.has('confirmed') && statuses.has('shipped')) {
134
+ lines.push(' note right of confirmed');
135
+ lines.push(' Landing (confirmed→shipped): the PR must pass CI');
136
+ lines.push(' (tests + secret scan + gate-review), then the server');
137
+ lines.push(' auto-merges and main deploys — nobody pushes main by');
138
+ lines.push(' hand. A stalled green PR is swept in ~5 min; /merge-mode');
139
+ lines.push(' is the manual fallback.');
140
+ lines.push(' --');
141
+ lines.push(' What may AUTO-merge, by what the change touches:');
142
+ lines.push(' - normal work (game / art / docs / tests): any rank');
143
+ lines.push(' - a protected gate surface: Metic+ only;');
144
+ lines.push(' Xenos / Thetes wait for an Archon');
145
+ lines.push(' - the safety core (hard floor): always an Archon');
146
+ lines.push(' end note');
147
+ }
148
+ // Any live status with no structural transitions yet — surface it, don't hide it.
149
+ const orphans = [...statuses].filter((s) => !known.has(s));
150
+ for (const o of orphans) {
151
+ lines.push(` ${o} : ${o} (new status — wire its transitions in gen-diagrams.js)`);
152
+ }
153
+ return lines.join('\n') + '\n';
154
+ }
155
+
156
+ function rankLadderMmd(f) {
157
+ const wired = new Set(f.wired_ranks);
158
+ const bandOf = (r) => {
159
+ for (const [band, members] of Object.entries(RANK_BANDS)) if (members.includes(r)) return band;
160
+ return 'unclassified';
161
+ };
162
+ const marker = (r) => (wired.has(r) ? '●' : '○');
163
+ const note = (r) => {
164
+ const bits = [];
165
+ if (r === f.default_rank) bits.push('default for new builders');
166
+ if (wired.has(r)) bits.push('LIVE'); else bits.push('reserved');
167
+ return bits.join(', ');
168
+ };
169
+
170
+ const lines = [
171
+ '---',
172
+ 'title: Builder rank ladder — live vs reserved (AUTO-GENERATED from live facts — do not hand-edit; see scripts/gds/gen-diagrams.js)',
173
+ '---',
174
+ 'flowchart TB',
175
+ ' LEGEND["● LIVE (enforced by builders.rank) ○ reserved (enum value, no wiring yet)"]',
176
+ ];
177
+ // Bands in fixed top-to-bottom order, only those with members present.
178
+ // Within a band, render in the curated RANK_BANDS array order (highest→lowest)
179
+ // intersected with the live enum — so e.g. metic→thetes→xenos reads correctly
180
+ // regardless of the enum's historical column order.
181
+ const order = ['divine', 'citizen', 'outsider', 'unclassified'];
182
+ const byBand = {};
183
+ for (const band of order) {
184
+ const members = (RANK_BANDS[band] || []).filter((r) => f.rank_enum.includes(r));
185
+ if (members.length) byBand[band] = members;
186
+ }
187
+ // Any enum rank not classified into a named band still renders (don't hide it).
188
+ const classified = new Set(Object.values(RANK_BANDS).flat());
189
+ const extras = f.rank_enum.filter((r) => !classified.has(r));
190
+ if (extras.length) byBand.unclassified = [...(byBand.unclassified || []), ...extras];
191
+ const presentBands = order.filter((b) => byBand[b] && byBand[b].length);
192
+ presentBands.forEach((band, bi) => {
193
+ const safe = `B_${band}`;
194
+ lines.push(` subgraph ${safe}["${BAND_LABEL[band]}"]`);
195
+ lines.push(' direction TB');
196
+ const members = byBand[band];
197
+ members.forEach((r, i) => {
198
+ const id = `r_${r}`;
199
+ lines.push(` ${id}["${marker(r)} ${r} — ${note(r)}"]`);
200
+ if (i > 0) lines.push(` r_${members[i - 1]} --> ${id}`);
201
+ });
202
+ lines.push(' end');
203
+ if (bi > 0) lines.push(` B_${presentBands[bi - 1]} --> ${safe}`);
204
+ });
205
+ // Permissions block (the live citizen ranks). Static text, but keyed on which
206
+ // ranks are actually wired so it doesn't claim authority that isn't enforced.
207
+ lines.push(' subgraph PERMS["Permissions — server-enforced (auth.requireRank, no caching; ADR 0016)"]');
208
+ lines.push(' direction TB');
209
+ if (wired.has('archon')) lines.push(' P_archon["archon: create/promote/PATCH tasks · version close · grant ranks · override claims"]');
210
+ if (wired.has('metic')) lines.push(' P_metic["metic: claim any task · idea triage · blocker review · planning/priority · file red-team; CANNOT create tasks or grant ranks"]');
211
+ if (wired.has('thetes')) lines.push(' P_thetes["thetes (auto-graduated after 3 ships): claim the whole general queue; NO scope-shaping — cannot triage, file red-team, resolve blockers, or create/edit tasks"]');
212
+ if (wired.has(f.default_rank)) lines.push(` P_default["${f.default_rank} (default): claim ONLY newcomer_friendly tasks + ship/release OWN work · log cost · capture learnings · file blockers+ideas; CANNOT create/edit tasks or touch others' claims"]`);
213
+ lines.push(' end');
214
+ if (wired.has('archon')) lines.push(' r_archon -.-> P_archon');
215
+ if (wired.has('metic')) lines.push(' r_metic -.-> P_metic');
216
+ if (wired.has('thetes')) lines.push(' r_thetes -.-> P_thetes');
217
+ if (wired.has(f.default_rank)) lines.push(` r_${f.default_rank} -.-> P_default`);
218
+ return lines.join('\n') + '\n';
219
+ }
220
+
221
+ function versioningMmd(f) {
222
+ // Chronological order: by started_at (nulls last), then id.
223
+ const ord = (arr) =>
224
+ [...arr].sort((a, b) => {
225
+ const ta = a.started_at ? Date.parse(a.started_at) : Infinity;
226
+ const tb = b.started_at ? Date.parse(b.started_at) : Infinity;
227
+ return ta - tb || a.id.localeCompare(b.id);
228
+ });
229
+ const lines = [
230
+ '---',
231
+ 'title: Versioning + planning sessions (AUTO-GENERATED from live facts — do not hand-edit; see scripts/gds/gen-diagrams.js)',
232
+ '---',
233
+ 'flowchart TB',
234
+ ' PS["/planning-session → done_when_criteria + tasks (with dependencies) + rank → seed the work pool"]',
235
+ ' PS --> POOL["Version task pool (backlog/ready)"]',
236
+ ' POOL --> VERSIONS',
237
+ ' subgraph VERSIONS["Every task inherits its version; role/discipline is the work-type axis"]',
238
+ ' direction TB',
239
+ ];
240
+ const vs = ord(f.versions);
241
+ vs.forEach((v, i) => {
242
+ const id = `v_${v.id.replace(/[^A-Za-z0-9]/g, '_')}`;
243
+ lines.push(` ${id}["${v.id} — ${v.status}"]`);
244
+ if (i > 0) {
245
+ const prev = `v_${vs[i - 1].id.replace(/[^A-Za-z0-9]/g, '_')}`;
246
+ lines.push(` ${prev} --> ${id}`);
247
+ }
248
+ });
249
+ lines.push(' end');
250
+ lines.push(' VERSIONS --> CLOSE["Version close — all done_when_criteria satisfied"]');
251
+ lines.push(' CLOSE --> ARCHIVE["Archive scope to limitations/*.md; status=shipped"]');
252
+ lines.push(' ARCHIVE --> REVIEW["Guided review before next version becomes king"]');
253
+ lines.push(' REVIEW --> PS');
254
+ return lines.join('\n') + '\n';
255
+ }
256
+
257
+ // --- conceptual templates (pure functions of f.conceptual) ------------------
258
+ //
259
+ // Both port the previously hand-authored .mmd VERBATIM (same nodes, layout,
260
+ // prose) and change ONLY: the title line (now AUTO-GENERATED) and the
261
+ // LIVE/PLANNED label fragments + edge solid-vs-dotted, derived from the backing
262
+ // task statuses in f.conceptual.taskStatus. Callers MUST guard on f.conceptual
263
+ // being present (TARGETS does).
264
+
265
+ // 03-drachmae-karma. Pieces → backing task ids (live ids, verified 2026-05-30):
266
+ // D_TOKEN — no task gate (cost-plus per-session reward, ADR 0054 / task 1005;
267
+ // live in prod via migration 090). Always LIVE, like D_SHIP/D_ACH.
268
+ // This is now the PRIMARY drachmae source — round(true_cost × 1.20).
269
+ // D_SHIP — no task gate (foundational per-task credit trigger), always LIVE;
270
+ // label carries the ADR 0023 kind multiplier + idea-promotion bonus.
271
+ // D_ACH — always LIVE; N = seeded-achievement count (+ net-negative bonus).
272
+ // D_BOUNTY rate card — #284 (R65); awarding — #286 (R67, auto-confirm/award)
273
+ // + #282 (R63 vuln_reports). Awarding LIVE iff BOTH shipped.
274
+ // KARMA — K_VOTE #245 (R25), K_PROP #248 (R32), K_SURF #246 (R26); each
275
+ // LIVE iff shipped. Subgraph title flips once karma is partially live.
276
+ function drachmaeKarmaMmd(f) {
277
+ const c = f.conceptual;
278
+ const { currency } = brand();
279
+ const CUR = currency.toUpperCase();
280
+ const shipped = (id) => c.taskStatus[id] === 'shipped';
281
+ const tag = (id) => (shipped(id) ? 'LIVE' : 'PLANNED');
282
+ const edge = (id) => (shipped(id) ? '-->' : '-.PLANNED.->');
283
+
284
+ const nAch = c.achievementsSeeded;
285
+ const rateCard = shipped(284);
286
+ const awarding = shipped(286) && shipped(282);
287
+ const karmaAnyLive = shipped(245) || shipped(248) || shipped(246);
288
+ const karmaTitle = karmaAnyLive
289
+ ? 'KARMA (separate signal — partially live)'
290
+ : 'KARMA (separate signal — PLANNED, not yet built)';
291
+
292
+ const lines = [
293
+ '---',
294
+ `title: ${cap(currency)} & karma — where each comes from, where each goes (AUTO-GENERATED from live facts — do not hand-edit; see scripts/gds/gen-diagrams.js)`,
295
+ '---',
296
+ 'flowchart LR',
297
+ ` subgraph CURRENCY["${CUR} (the builder reward — equity / reputation, a stake, not a spendable currency)"]`,
298
+ ' direction TB',
299
+ ' D_TOKEN["Ship a SESSION — the main reward\\nround(true_cost_usd × 1.20) cents — cost-plus on real token spend\\n(LIVE: priced server-side from token counts; ADR 0054, idempotent per session)"]',
300
+ ' D_SHIP["Confirm a TASK\\ncredits_reward × kind multiplier (0.8–1.5×)\\n+ 25% idea-promotion bonus to the capturer\\n(LIVE: ADR 0023)"]',
301
+ ` D_ACH["Unlock an achievement\\nachievements.credit_bonus (LIVE: ${nAch} seeded)\\n+ small net-negative-ship bonus"]`,
302
+ ` D_BOUNTY["Red-team / security bounty\\n${currency} payout by severity\\n(rate card ${rateCard ? 'LIVE' : 'PLANNED'}: R65 #284 — src/bongos/security.js + shown on /builders;\\nawarding still ${awarding ? 'LIVE' : 'PLANNED'}: R67 #286 + vulnerability_reports R63 #282)"]`,
303
+ '',
304
+ ' D_BAL["builders.total_credits\\n(running balance per builder)"]',
305
+ '',
306
+ ' D_TOKEN --> D_BAL',
307
+ ' D_SHIP --> D_BAL',
308
+ ' D_ACH --> D_BAL',
309
+ ` D_BOUNTY ${awarding ? '-->' : '-.PLANNED.->'} D_BAL`,
310
+ '',
311
+ ` D_SPEND["Spent on: nothing yet.\\n${cap(currency)} are EQUITY / reputation — a stake, not a\\nspendable currency. They persist losslessly across exit (migration 025)."]`,
312
+ ' D_BAL --> D_SPEND',
313
+ ' end',
314
+ '',
315
+ ` subgraph KARMA["${karmaTitle}"]`,
316
+ ' direction TB',
317
+ ` K_VOTE["Builder-on-builder upvote / downvote\\non CONFIRMED work\\n(${tag(245)}: R25 #245, anti-self-vote)"]`,
318
+ ` K_PROP["Boost on criterion-proposal ratification\\n(${tag(248)}: R32 #248, cross-link C5→C2)"]`,
319
+ ' K_BAL["Per-builder karma score"]',
320
+ ` K_SURF["Surfaced on profile + sortable\\non leaderboard (${tag(246)}: R26 #246)"]`,
321
+ '',
322
+ ` K_VOTE ${edge(245)} K_BAL`,
323
+ ` K_PROP ${edge(248)} K_BAL`,
324
+ ` K_BAL ${edge(246)} K_SURF`,
325
+ ' end',
326
+ '',
327
+ ` note1["${cap(currency)} measure OUTPUT (work shipped) — most of it now a cost-plus reward on real token spend.\\nKarma measures PEER TRUST (how others rate your work); it does NOT gate rank promotions.\\nBoth are reputation; neither is a spendable currency today.\\nSeparately, an Archon can set a per-builder monthly budget cap to limit SPEND — but builders are uncapped by default (src/bongos/cost.js)."]`,
328
+ ' CURRENCY --- note1',
329
+ ' KARMA --- note1',
330
+ ];
331
+ return lines.join('\n') + '\n';
332
+ }
333
+
334
+ // 04-architecture. The complete picture: where a builder's work runs and how it
335
+ // reaches production, with the per-builder memory layer (ADR 0024) folded in.
336
+ // Merges the old 04-server-repo-memory (the three layers) + 06-dev-box (the box
337
+ // → prod ship flow) into one map (task 1059), collapsing the SERVER they both
338
+ // drew. Conceptual like 03: every feature-piece + flow edge is LIVE/solid iff its
339
+ // backing GDS task is 'shipped', dotted/PLANNED otherwise — so the map is an
340
+ // honest snapshot that flips itself as pieces ship (or regresses if one is
341
+ // reopened). Pieces → live task ids:
342
+ // memory layer : 273 schema · 274 sync-on-ship · 275 pull-on-start · 276 isolation
343
+ // dev box : 904 desktop app · 774 browser terminal · 897 sandbox preview · 919 box token
344
+ // box → prod : 1025 publish-via-server · 859 CI deploy · 1028 GitHub App push credential
345
+ // end-to-end : 1027 hardware-verify (no node of its own; gates the closing note)
346
+ function architectureMmd(f) {
347
+ const c = f.conceptual;
348
+ const { host } = brand();
349
+ const shipped = (id) => c.taskStatus[id] === 'shipped';
350
+ const tag = (id) => (shipped(id) ? 'LIVE' : 'PLANNED');
351
+ // Labeled flow edge: solid when its backing piece is shipped, dotted (and
352
+ // PLANNED-labelled) otherwise. e.g. `WORKER -->|"..."| API`.
353
+ const flow = (a, id, label, b) =>
354
+ ` ${a} ${shipped(id) ? '-->' : '-.->'}|"${label}"| ${b}`;
355
+
356
+ // --- MEMORY layer (ADR 0024 chain) ---
357
+ const MEM_IDS = [273, 274, 275, 276];
358
+ const memAllLive = MEM_IDS.every(shipped);
359
+ const memLead = memAllLive ? 'LIVE' : 'PARTIAL';
360
+ const refOf = { 273: 'R54', 274: 'R55', 275: 'R56', 276: 'R57' };
361
+ const liveRefs = MEM_IDS.filter(shipped).map((id) => refOf[id]);
362
+ const pendRefs = MEM_IDS.filter((id) => !shipped(id)).map((id) => refOf[id]);
363
+ const memStatus = memAllLive
364
+ ? `${MEM_IDS.map((id) => refOf[id]).join(' / ')} — all shipped`
365
+ : `${liveRefs.length ? liveRefs.join('/') + ' shipped' : 'none shipped yet'}${pendRefs.length ? '; ' + pendRefs.join('/') + ' pending' : ''}`;
366
+ const pushEdge = shipped(274)
367
+ ? 'LOCAL -->|"sync on ship (push)"| SRVMEM'
368
+ : 'LOCAL -.->|"sync on ship (push) — PLANNED"| SRVMEM';
369
+ const pullEdge = shipped(275)
370
+ ? 'SRVMEM -->|"pull on session start"| LOCAL'
371
+ : 'SRVMEM -.->|"pull on session start — PLANNED"| LOCAL';
372
+
373
+ // --- box → prod credential + closing note ---
374
+ const pushCred = shipped(1028)
375
+ ? 'GitHub App, short-lived tokens'
376
+ : 'standing push PAT (GitHub App pending — 1028)';
377
+ // The whole box→prod chain LIVE? (all the gated legs + the end-to-end verify.)
378
+ const chainLive = [919, 897, 904, 774, 1025, 859, 1028, 1027].every(shipped);
379
+ const closingNote = chainLive
380
+ ? 'The whole box → production path is LIVE and hardware-verified end-to-end (1027 · 1028).'
381
+ : `Still landing (PLANNED): hardware-verify the box → prod flow end-to-end (${tag(1027)} · 1027) and the GitHub App push credential (${tag(1028)} · 1028).`;
382
+
383
+ // Layout: ELK engine, top-down (task 1066). ELK minimizes edge crossings far
384
+ // better than the default renderer — this map is edge-dense and was a tangle
385
+ // before. Two more declutter moves: (1) the INTRA-cluster wiring (worker→its
386
+ // files, api→db/rank, db→memory-store) is dropped — co-location inside a
387
+ // labelled subgraph already says "these belong together", and drawing it added
388
+ // depth + crossings; only the CROSS-cluster flow (the numbered ship steps,
389
+ // memory sync, claim/ship, the blocked direct-push) is drawn. (2) Three
390
+ // low-signal annotation edges (box-token→bootstrap, DB-is-king, memory-
391
+ // follows-you) are folded into node labels. (3) WATERFALL ordering (task 1073,
392
+ // off Lars's "put the GitHub box last"): subgraphs are declared in flow order
393
+ // DEVICE→BOX→SERVER→GH, and the live game is pulled OUT of the SERVER cluster
394
+ // into its own terminal node at the very bottom (annotated "same droplet · same
395
+ // Node process" so it stays honest). That makes the map one monotonic top-down
396
+ // spine — device→box→server→github→live game — where the deploy is the LAST
397
+ // forward step instead of an edge looping back UP into the server. So SERVER
398
+ // tucks directly under BOX and the five BOX↔SERVER wires (re-auth, upload,
399
+ // sync, pull, claim/ship) become short hops instead of detouring the full
400
+ // height past a mid-stack GitHub. The redundant unlabelled ACTIONS→API edge is
401
+ // dropped: API and the game are the same Node process, so the single labelled
402
+ // ACTIONS→GAME deploy edge already carries it. NOTE on direction: we keep TB,
403
+ // not a repo-on-the-left LR/RL — the flow is an ~8-deep linear chain, so a
404
+ // sideways layout stretches into an unreadable ~5:1 strip; top-down keeps a
405
+ // legible aspect.
406
+ const lines = [
407
+ '---',
408
+ 'title: The complete architecture — where your work runs and how it reaches production (AUTO-GENERATED from live facts — do not hand-edit; see scripts/gds/gen-diagrams.js)',
409
+ 'config:',
410
+ ' layout: elk',
411
+ '---',
412
+ 'flowchart TB',
413
+ ' subgraph DEVICE["YOUR DEVICE — only the screen lives here"]',
414
+ ' APP["Claude desktop app or browser tab\\n(shows files · sends your messages · holds NO code)"]',
415
+ ' end',
416
+ '',
417
+ ' subgraph BOX["DEV BOX — a machine WE create on DigitalOcean (gated · revocable · audited; Metic+ may instead clone locally)"]',
418
+ ' WORKER["Claude Code WORKER\\n(opens files · runs commands · runs the /builder-* skills)"]',
419
+ ` CODE["the code — git clone + per-builder worktrees (.claude/worktrees/*)\\nfor sub-Metic builders it lives ONLY here · CLAUDE.md is DESCRIPTIVE only"]`,
420
+ ' LOCAL["local ~/.claude memory\\nMAP = MEMORY.md — a one-line index loaded EVERY session\\n(a guard + auto-tidy keep it light; ADR 0074)\\n+ drawer of full notes, loaded only on demand"]',
421
+ ' ORIGIN["credential-less git origin\\n(NO GitHub push secret on the box — by design)"]',
422
+ ` BOXTOK["box-scoped GDS token\\n(deny-by-default: bootstrap endpoints only;\\nrejected for branch upload → re-auth first — ${tag(919)})"]`,
423
+ ` PREVIEW["sandbox preview server on :3000\\n→ a per-builder sandbox URL (${tag(897)})"]`,
424
+ ` SWITCH["on / off + browser terminal\\n(desktop app ${tag(904)} · ttyd-over-tunnel ${tag(774)})"]`,
425
+ ' end',
426
+ '',
427
+ ` subgraph SERVER["THE SERVER — ${host} (the authority AND production)"]`,
428
+ ' API["/api/gds/* (same Node process as the game)"]',
429
+ ' DB["Postgres — tasks · claims · versions · builders.rank\\ncredit_log · grades · idea_inbox · builder_memory\\n(KING for work-state + permissions; CLAUDE.md only describes it)"]',
430
+ ' RANK["auth.requireRank — checked per request, NO caching\\n(ADR 0016: a demotion takes effect on the next request)"]',
431
+ ` SRVMEM["server-side builder_memory store\\n${memLead}: per-builder · isolated · Archon-audited forensic read\\nyour memory follows you across machines & worktrees\\n/recall fetches only the relevant subset (ADR 0060)\\n(${memStatus})"]`,
432
+ ` PUSHTOK["server-held push credential\\n(${pushCred} — the box never holds it)"]`,
433
+ ' end',
434
+ '',
435
+ ` subgraph GH["GITHUB — the code repository (${c.repoSlug})"]`,
436
+ ' MAIN["branch-protected main\\n(no direct push; PR + required checks only)"]',
437
+ ' ACTIONS["GitHub Actions — deploy-prod.yml"]',
438
+ ' end',
439
+ '',
440
+ ` GAME["the live game — ${host}\\n(same server · same Node process as /api/gds/*)"]`,
441
+ '',
442
+ ' APP -->|"1 · toggle box on / open terminal"| SWITCH',
443
+ ' SWITCH --> WORKER',
444
+ ' WORKER -->|"2 · edit + commit"| CODE',
445
+ ' WORKER -->|"3 · re-auth in browser"| API',
446
+ flow('WORKER', 1025, '4 · upload branch as a git bundle', 'API'),
447
+ flow('API', 1025, `5 · push + open PR + auto-merge (${tag(1025)})`, 'MAIN'),
448
+ flow('MAIN', 859, `6 · merge triggers deploy (${tag(859)})`, 'ACTIONS'),
449
+ ' ACTIONS -->|"7 · deploy (no droplet key on any box)"| GAME',
450
+ ' PUSHTOK -.-> API',
451
+ ' ORIGIN -. "direct push blocked" .-> MAIN',
452
+ ' API -. "claim / ship / cost" .-> WORKER',
453
+ ` ${pushEdge}`,
454
+ ` ${pullEdge}`,
455
+ '',
456
+ ` NEXT["${closingNote}"]`,
457
+ ' GAME --- NEXT',
458
+ ];
459
+ return lines.join('\n') + '\n';
460
+ }
461
+
462
+ // --- assertions.json (data-driven slices kept in sync) ----------------------
463
+
464
+ function rebuildAssertions(prev, f) {
465
+ const next = JSON.parse(JSON.stringify(prev));
466
+ next.rank_ladder.rank_enum = f.rank_enum;
467
+ next.rank_ladder.default_rank = f.default_rank;
468
+ next.rank_ladder.wired_ranks = f.wired_ranks;
469
+ next.task_lifecycle.task_statuses = f.task_statuses;
470
+ // Persist only the stable identity fields (drop started_at ordering helper).
471
+ next.versioning.diagram = '05-versioning';
472
+ next.versioning.versions = f.versions.map((v) => ({ id: v.id, status: v.status }));
473
+
474
+ // Conceptual slices (03 + 04) — only rebuilt when live conceptual facts are
475
+ // present. When degraded (f.conceptual == null) leave the existing slices
476
+ // untouched so a headless run can't blank them out.
477
+ if (f.conceptual) {
478
+ const c = f.conceptual;
479
+ const shipped = (id) => c.taskStatus[id] === 'shipped';
480
+ const entry = (id) => ({ id, label: c.taskLabels[id] });
481
+ const split = (ids) => ({
482
+ live_tasks: ids.filter(shipped).map(entry),
483
+ pending_tasks: ids.filter((id) => !shipped(id)).map(entry),
484
+ });
485
+
486
+ // 04-architecture — the ADR 0024 memory chain + the dev-box / box→prod ship
487
+ // flow, merged (task 1059). A piece is LIVE iff its backing task is shipped.
488
+ const arch = split([273, 274, 275, 276, 904, 774, 897, 919, 1025, 859, 1027, 1028]);
489
+ next.architecture = {
490
+ diagram: '04-architecture',
491
+ _comment:
492
+ "Pieces of 04-architecture gated on a backing GDS task. A piece is LIVE iff its task is 'shipped'; live_tasks must ALL be shipped, pending_tasks must NOT yet be. Rebuilt by scripts/gds/gen-diagrams.js in lockstep with the diagram, so this is the drift checker's backstop. The device/box/server/GitHub topology is structural (not task-gated); these are the LIVE/PLANNED markers. MEMORY layer (ADR 0024): 273 schema / 274 sync-on-ship / 275 pull-on-start / 276 isolation. DEV BOX + box→prod: 904/774 (on-off + browser terminal), 897 (sandbox preview), 919 (scoped box token), 1025 (server-mediated publish), 859 (CI deploy), 1028 (GitHub App push credential), 1027 (end-to-end hardware-verify). Supersedes the old server_repo_memory + dev_box slices.",
493
+ live_tasks: arch.live_tasks,
494
+ pending_tasks: arch.pending_tasks,
495
+ };
496
+ // Drop the two slices this diagram replaced so the file (and drift checker)
497
+ // never carry stale keys after the 04+06 consolidation.
498
+ delete next.server_repo_memory;
499
+ delete next.dev_box;
500
+
501
+ // 03-drachmae-karma — bounty + karma pieces (D_SHIP/D_ACH have no task gate).
502
+ const dk = split([284, 286, 282, 245, 248, 246]);
503
+ next.drachmae_karma = next.drachmae_karma || {
504
+ diagram: '03-drachmae-karma',
505
+ _comment:
506
+ "Pieces of 03-drachmae-karma that are gated on a backing GDS task. A piece is LIVE iff its task is 'shipped'. live_tasks must ALL be shipped live; pending_tasks must NOT yet be shipped. Rebuilt automatically by scripts/gds/gen-diagrams.js from the authenticated /tasks/:id status; the diagram is regenerated in lockstep, so this slice is a redundant backstop the drift checker verifies. D_SHIP (credit_log trigger) and D_ACH (achievement bonuses) have no task gate and are always LIVE. achievements_seeded mirrors 03's 'N seeded' label, counted from the achievements seed INSERTs in migrations/.",
507
+ };
508
+ next.drachmae_karma.live_tasks = dk.live_tasks;
509
+ next.drachmae_karma.pending_tasks = dk.pending_tasks;
510
+ next.drachmae_karma.achievements_seeded = c.achievementsSeeded;
511
+ }
512
+ return next;
513
+ }
514
+
515
+ // --- main -------------------------------------------------------------------
516
+
517
+ // The 3 mechanical diagrams always regenerate (no auth dependency). The 2
518
+ // conceptual ones are appended only when live conceptual facts are present;
519
+ // when degraded they're left untouched and a skip line is logged.
520
+ const MECHANICAL_TARGETS = [
521
+ ['01-task-lifecycle.mmd', lifecycleMmd],
522
+ ['02-rank-ladder.mmd', rankLadderMmd],
523
+ ['05-versioning.mmd', versioningMmd],
524
+ ];
525
+ const CONCEPTUAL_TARGETS = [
526
+ ['03-drachmae-karma.mmd', drachmaeKarmaMmd],
527
+ ['04-architecture.mmd', architectureMmd],
528
+ ];
529
+
530
+ (async () => {
531
+ const checkOnly = process.argv.includes('--check');
532
+ const noRender = process.argv.includes('--no-render');
533
+
534
+ const f = await facts.gatherFacts({ repo: REPO });
535
+
536
+ const TARGETS = [...MECHANICAL_TARGETS];
537
+ if (f.conceptual) {
538
+ TARGETS.push(...CONCEPTUAL_TARGETS);
539
+ } else {
540
+ console.log(
541
+ 'gen-diagrams: conceptual facts unavailable (no GDS session / API unreachable) — SKIPPING 03-drachmae-karma + 04-architecture; the 3 mechanical diagrams still regenerate.'
542
+ );
543
+ }
544
+
545
+ const changed = [];
546
+ const writes = []; // {file, content}
547
+
548
+ for (const [file, tmpl] of TARGETS) {
549
+ const full = path.join(DIR, file);
550
+ const next = tmpl(f);
551
+ const cur = fs.existsSync(full) ? fs.readFileSync(full, 'utf8') : '';
552
+ if (cur !== next) {
553
+ changed.push(file);
554
+ writes.push({ full, content: next });
555
+ }
556
+ }
557
+
558
+ // assertions.json
559
+ const prevAssert = JSON.parse(fs.readFileSync(ASSERT_PATH, 'utf8'));
560
+ const nextAssert = rebuildAssertions(prevAssert, f);
561
+ const nextAssertStr = JSON.stringify(nextAssert, null, 2) + '\n';
562
+ const curAssertStr = fs.readFileSync(ASSERT_PATH, 'utf8');
563
+ const assertChanged = curAssertStr !== nextAssertStr;
564
+
565
+ if (checkOnly) {
566
+ if (changed.length === 0 && !assertChanged) {
567
+ console.log('gen-diagrams --check: up to date.');
568
+ process.exit(0);
569
+ }
570
+ console.log(`gen-diagrams --check: would update ${[...changed, assertChanged ? 'assertions.json' : null].filter(Boolean).join(', ')}`);
571
+ process.exit(2);
572
+ }
573
+
574
+ if (changed.length === 0 && !assertChanged) {
575
+ console.log('gen-diagrams: mechanical diagrams already current — no changes.');
576
+ process.exit(0);
577
+ }
578
+
579
+ for (const w of writes) fs.writeFileSync(w.full, w.content);
580
+ if (assertChanged) fs.writeFileSync(ASSERT_PATH, nextAssertStr);
581
+ console.log(`gen-diagrams: wrote ${changed.length} .mmd${assertChanged ? ' + assertions.json' : ''}: ${changed.join(', ') || '(none)'}`);
582
+
583
+ if (changed.length && !noRender) {
584
+ const args = changed.map((f2) => path.join(DIR, f2));
585
+ const r = spawnSync('bash', [path.join(REPO, 'scripts/render-diagrams.sh'), ...args], { stdio: 'inherit' });
586
+ if (r.error) {
587
+ // The render step is a bash script (mermaid-cli). On a platform without
588
+ // bash on PATH — e.g. a Windows builder lacking Git Bash — spawnSync sets
589
+ // r.error (ENOENT) and r.status is null. The .mmd sources are already
590
+ // written above and the caller (ship.js regenerateDiagrams) will commit
591
+ // them; PNGs get re-rendered on the Linux droplet at deploy time, and the
592
+ // diagram-drift routine backstops any staleness. So skip the render
593
+ // NON-FATALLY rather than hard-failing the whole ship on a missing bash.
594
+ console.warn(
595
+ `gen-diagrams: could not run the render step (${r.error.code || r.error.message}). ` +
596
+ '.mmd written; PNG render skipped (droplet re-renders on deploy).'
597
+ );
598
+ } else if (r.status !== 0) {
599
+ // bash ran but the render genuinely failed — surface it.
600
+ console.error('gen-diagrams: render failed — .mmd written but PNG not refreshed.');
601
+ process.exit(1);
602
+ }
603
+ }
604
+ console.log('gen-diagrams: done.');
605
+ })().catch((e) => {
606
+ console.error('gen-diagrams: error:', e.message);
607
+ process.exit(1);
608
+ });