@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,224 @@
1
+ -- 021_v3_renumber_and_deps.sql
2
+ -- GDS-V3 / task 309 / V3.R01b — Renumber the V3.R## prefix on every non-shipped
3
+ -- task to match topological dependency order, and write the dependency edges
4
+ -- into task_dependencies.
5
+ --
6
+ -- Idempotent: title rename is guarded by checking against the new prefix;
7
+ -- dep inserts use ON CONFLICT DO NOTHING.
8
+ --
9
+ -- After this migration applies, the auto-promotion trigger created in 020
10
+ -- is fully wired — when a task ships, its non-spike dependents auto-promote.
11
+ BEGIN;
12
+
13
+ -- ============================================================================
14
+ -- 1. Renumber V3.R## title prefix (topologically sorted)
15
+ -- Pattern: 'V3.R<old> — <rest>' becomes 'V3.R<new> — <rest>'
16
+ -- Idempotent: only updates if the prefix doesn't already match the new value.
17
+ -- ============================================================================
18
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R01b ', 'V3.R02 ') WHERE id = 309 AND title LIKE 'V3.R01b %';
19
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R02 ', 'V3.R03 ') WHERE id = 229 AND title LIKE 'V3.R02 %';
20
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R03 ', 'V3.R04 ') WHERE id = 230 AND title LIKE 'V3.R03 %';
21
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R04 ', 'V3.R05 ') WHERE id = 106 AND title LIKE 'V3.R04 %';
22
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R05 ', 'V3.R06 ') WHERE id = 231 AND title LIKE 'V3.R05 %';
23
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R06 ', 'V3.R07 ') WHERE id = 232 AND title LIKE 'V3.R06 %';
24
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R07 ', 'V3.R08 ') WHERE id = 233 AND title LIKE 'V3.R07 %';
25
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R08 ', 'V3.R09 ') WHERE id = 234 AND title LIKE 'V3.R08 %';
26
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R09 ', 'V3.R10 ') WHERE id = 235 AND title LIKE 'V3.R09 %';
27
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R10 ', 'V3.R11 ') WHERE id = 91 AND title LIKE 'V3.R10 %';
28
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R11 ', 'V3.R12 ') WHERE id = 236 AND title LIKE 'V3.R11 %';
29
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R12 ', 'V3.R13 ') WHERE id = 237 AND title LIKE 'V3.R12 %';
30
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R13 ', 'V3.R14 ') WHERE id = 238 AND title LIKE 'V3.R13 %';
31
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R14 ', 'V3.R15 ') WHERE id = 239 AND title LIKE 'V3.R14 %';
32
+ -- R16 → R16: no change (task id=240)
33
+ -- R17 → R17: no change (task id=241)
34
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R15 ', 'V3.R18 ') WHERE id = 222 AND title LIKE 'V3.R15 %';
35
+ -- R19 → R19: no change (task id=201)
36
+ -- R20 → R20: no change (task id=202)
37
+ -- R21 → R21: no change (task id=98)
38
+ -- R22 → R22: no change (task id=242)
39
+ -- R23 → R23: no change (task id=243)
40
+ -- R24 → R24: no change (task id=244)
41
+ -- R25 → R25: no change (task id=245)
42
+ -- R26 → R26: no change (task id=246)
43
+ -- R27 → R27: no change (task id=247)
44
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R29 ', 'V3.R28 ') WHERE id = 249 AND title LIKE 'V3.R29 %';
45
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R30 ', 'V3.R29 ') WHERE id = 250 AND title LIKE 'V3.R30 %';
46
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R31 ', 'V3.R30 ') WHERE id = 251 AND title LIKE 'V3.R31 %';
47
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R32 ', 'V3.R31 ') WHERE id = 252 AND title LIKE 'V3.R32 %';
48
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R28 ', 'V3.R32 ') WHERE id = 248 AND title LIKE 'V3.R28 %';
49
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R34 ', 'V3.R33 ') WHERE id = 254 AND title LIKE 'V3.R34 %';
50
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R35 ', 'V3.R34 ') WHERE id = 255 AND title LIKE 'V3.R35 %';
51
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R36 ', 'V3.R35 ') WHERE id = 256 AND title LIKE 'V3.R36 %';
52
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R37 ', 'V3.R36 ') WHERE id = 257 AND title LIKE 'V3.R37 %';
53
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R38 ', 'V3.R37 ') WHERE id = 258 AND title LIKE 'V3.R38 %';
54
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R39 ', 'V3.R38 ') WHERE id = 259 AND title LIKE 'V3.R39 %';
55
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R40 ', 'V3.R39 ') WHERE id = 260 AND title LIKE 'V3.R40 %';
56
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R41 ', 'V3.R40 ') WHERE id = 261 AND title LIKE 'V3.R41 %';
57
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R42 ', 'V3.R41 ') WHERE id = 262 AND title LIKE 'V3.R42 %';
58
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R43 ', 'V3.R42 ') WHERE id = 263 AND title LIKE 'V3.R43 %';
59
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R44 ', 'V3.R43 ') WHERE id = 264 AND title LIKE 'V3.R44 %';
60
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R33 ', 'V3.R44 ') WHERE id = 253 AND title LIKE 'V3.R33 %';
61
+ -- R45 → R45: no change (task id=265)
62
+ -- R46 → R46: no change (task id=224)
63
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R48 ', 'V3.R47 ') WHERE id = 266 AND title LIKE 'V3.R48 %';
64
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R49 ', 'V3.R48 ') WHERE id = 267 AND title LIKE 'V3.R49 %';
65
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R50 ', 'V3.R49 ') WHERE id = 268 AND title LIKE 'V3.R50 %';
66
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R51 ', 'V3.R50 ') WHERE id = 269 AND title LIKE 'V3.R51 %';
67
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R52 ', 'V3.R51 ') WHERE id = 270 AND title LIKE 'V3.R52 %';
68
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R53 ', 'V3.R52 ') WHERE id = 271 AND title LIKE 'V3.R53 %';
69
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R54 ', 'V3.R53 ') WHERE id = 272 AND title LIKE 'V3.R54 %';
70
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R55 ', 'V3.R54 ') WHERE id = 273 AND title LIKE 'V3.R55 %';
71
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R56 ', 'V3.R55 ') WHERE id = 274 AND title LIKE 'V3.R56 %';
72
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R57 ', 'V3.R56 ') WHERE id = 275 AND title LIKE 'V3.R57 %';
73
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R58 ', 'V3.R57 ') WHERE id = 276 AND title LIKE 'V3.R58 %';
74
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R59 ', 'V3.R58 ') WHERE id = 277 AND title LIKE 'V3.R59 %';
75
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R60 ', 'V3.R59 ') WHERE id = 278 AND title LIKE 'V3.R60 %';
76
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R61 ', 'V3.R60 ') WHERE id = 279 AND title LIKE 'V3.R61 %';
77
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R62 ', 'V3.R61 ') WHERE id = 280 AND title LIKE 'V3.R62 %';
78
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R63 ', 'V3.R62 ') WHERE id = 281 AND title LIKE 'V3.R63 %';
79
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R64 ', 'V3.R63 ') WHERE id = 282 AND title LIKE 'V3.R64 %';
80
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R65 ', 'V3.R64 ') WHERE id = 283 AND title LIKE 'V3.R65 %';
81
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R66 ', 'V3.R65 ') WHERE id = 284 AND title LIKE 'V3.R66 %';
82
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R67 ', 'V3.R66 ') WHERE id = 285 AND title LIKE 'V3.R67 %';
83
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R68 ', 'V3.R67 ') WHERE id = 286 AND title LIKE 'V3.R68 %';
84
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R69 ', 'V3.R68 ') WHERE id = 287 AND title LIKE 'V3.R69 %';
85
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R70 ', 'V3.R69 ') WHERE id = 288 AND title LIKE 'V3.R70 %';
86
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R71 ', 'V3.R70 ') WHERE id = 289 AND title LIKE 'V3.R71 %';
87
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R72 ', 'V3.R71 ') WHERE id = 290 AND title LIKE 'V3.R72 %';
88
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R73 ', 'V3.R72 ') WHERE id = 291 AND title LIKE 'V3.R73 %';
89
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R74 ', 'V3.R73 ') WHERE id = 292 AND title LIKE 'V3.R74 %';
90
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R75 ', 'V3.R74 ') WHERE id = 293 AND title LIKE 'V3.R75 %';
91
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R76 ', 'V3.R75 ') WHERE id = 294 AND title LIKE 'V3.R76 %';
92
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R77 ', 'V3.R76 ') WHERE id = 295 AND title LIKE 'V3.R77 %';
93
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R78 ', 'V3.R77 ') WHERE id = 296 AND title LIKE 'V3.R78 %';
94
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R79 ', 'V3.R78 ') WHERE id = 297 AND title LIKE 'V3.R79 %';
95
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R80 ', 'V3.R79 ') WHERE id = 298 AND title LIKE 'V3.R80 %';
96
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R82 ', 'V3.R80 ') WHERE id = 300 AND title LIKE 'V3.R82 %';
97
+ -- R81 → R81: no change (task id=299)
98
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R83 ', 'V3.R82 ') WHERE id = 301 AND title LIKE 'V3.R83 %';
99
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R85 ', 'V3.R83 ') WHERE id = 303 AND title LIKE 'V3.R85 %';
100
+ -- R84 → R84: no change (task id=302)
101
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R86 ', 'V3.R85 ') WHERE id = 304 AND title LIKE 'V3.R86 %';
102
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R87 ', 'V3.R86 ') WHERE id = 305 AND title LIKE 'V3.R87 %';
103
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R88 ', 'V3.R87 ') WHERE id = 306 AND title LIKE 'V3.R88 %';
104
+ UPDATE tasks SET title = regexp_replace(title, '^V3\.R89 ', 'V3.R88 ') WHERE id = 307 AND title LIKE 'V3.R89 %';
105
+
106
+ -- ============================================================================
107
+ -- 2. Insert task_dependencies rows
108
+ -- Each task gets one INSERT per dep edge. ON CONFLICT DO NOTHING makes the
109
+ -- migration safe to re-run.
110
+ --
111
+ -- FRESH-DB GUARD (task 1238 / ADR 0062 §5 + §8): the 86 edges below reference
112
+ -- THIS instance's V3 task rows, which are seeded by scripts/pms/seed-v3-tasks.js
113
+ -- (a JS seed run on prod AFTER migration 018) — NOT by any SQL migration. On a
114
+ -- fresh / empty instance DB those task rows don't exist, so the INSERTs would
115
+ -- violate task_dependencies' FK to tasks(id) — and ON CONFLICT does NOT suppress
116
+ -- an FK violation. This block is OTB-instance prod data, so skip it wholesale when
117
+ -- `tasks` is empty; the core migration history then replays cleanly on an empty DB
118
+ -- (the C8 customer-0 bringup). On prod the rows exist AND this migration is already
119
+ -- recorded in schema_migrations, so it never re-runs there regardless.
120
+ -- ============================================================================
121
+ DO $$
122
+ BEGIN
123
+ IF NOT EXISTS (SELECT 1 FROM tasks) THEN
124
+ RAISE NOTICE 'task 1238: tasks table empty — skipping the V3 dependency seed (fresh-DB replay)';
125
+ RETURN;
126
+ END IF;
127
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (106, 229) ON CONFLICT DO NOTHING; -- R04->R02
128
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (231, 229) ON CONFLICT DO NOTHING; -- R05->R02
129
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (231, 106) ON CONFLICT DO NOTHING; -- R05->R04
130
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (232, 106) ON CONFLICT DO NOTHING; -- R06->R04
131
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (232, 231) ON CONFLICT DO NOTHING; -- R06->R05
132
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (234, 233) ON CONFLICT DO NOTHING; -- R08->R07
133
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (235, 234) ON CONFLICT DO NOTHING; -- R09->R08
134
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (91, 234) ON CONFLICT DO NOTHING; -- R10->R08
135
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (238, 231) ON CONFLICT DO NOTHING; -- R13->R05
136
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (238, 232) ON CONFLICT DO NOTHING; -- R13->R06
137
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (239, 106) ON CONFLICT DO NOTHING; -- R14->R04
138
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (240, 106) ON CONFLICT DO NOTHING; -- R16->R04
139
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (241, 233) ON CONFLICT DO NOTHING; -- R17->R07
140
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (241, 234) ON CONFLICT DO NOTHING; -- R17->R08
141
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (241, 237) ON CONFLICT DO NOTHING; -- R17->R12
142
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (241, 238) ON CONFLICT DO NOTHING; -- R17->R13
143
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (241, 239) ON CONFLICT DO NOTHING; -- R17->R14
144
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (241, 240) ON CONFLICT DO NOTHING; -- R17->R16
145
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (222, 241) ON CONFLICT DO NOTHING; -- R15->R17
146
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (202, 201) ON CONFLICT DO NOTHING; -- R20->R19
147
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (98, 201) ON CONFLICT DO NOTHING; -- R21->R19
148
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (98, 202) ON CONFLICT DO NOTHING; -- R21->R20
149
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (242, 201) ON CONFLICT DO NOTHING; -- R22->R19
150
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (242, 202) ON CONFLICT DO NOTHING; -- R22->R20
151
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (245, 244) ON CONFLICT DO NOTHING; -- R25->R24
152
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (246, 244) ON CONFLICT DO NOTHING; -- R26->R24
153
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (249, 232) ON CONFLICT DO NOTHING; -- R29->R06
154
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (250, 231) ON CONFLICT DO NOTHING; -- R30->R05
155
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (251, 231) ON CONFLICT DO NOTHING; -- R31->R05
156
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (252, 229) ON CONFLICT DO NOTHING; -- R32->R02
157
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (248, 244) ON CONFLICT DO NOTHING; -- R28->R24
158
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (248, 252) ON CONFLICT DO NOTHING; -- R28->R32
159
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (255, 254) ON CONFLICT DO NOTHING; -- R35->R34
160
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (261, 260) ON CONFLICT DO NOTHING; -- R41->R40
161
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (262, 260) ON CONFLICT DO NOTHING; -- R42->R40
162
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (262, 261) ON CONFLICT DO NOTHING; -- R42->R41
163
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (263, 256) ON CONFLICT DO NOTHING; -- R43->R36
164
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (264, 229) ON CONFLICT DO NOTHING; -- R44->R02
165
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (264, 231) ON CONFLICT DO NOTHING; -- R44->R05
166
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (253, 254) ON CONFLICT DO NOTHING; -- R33->R34
167
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (253, 264) ON CONFLICT DO NOTHING; -- R33->R44
168
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (265, 264) ON CONFLICT DO NOTHING; -- R45->R44
169
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (271, 256) ON CONFLICT DO NOTHING; -- R53->R36
170
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (272, 260) ON CONFLICT DO NOTHING; -- R54->R40
171
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (272, 262) ON CONFLICT DO NOTHING; -- R54->R42
172
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (273, 230) ON CONFLICT DO NOTHING; -- R55->R03
173
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (274, 273) ON CONFLICT DO NOTHING; -- R56->R55
174
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (275, 273) ON CONFLICT DO NOTHING; -- R57->R55
175
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (275, 274) ON CONFLICT DO NOTHING; -- R57->R56
176
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (276, 273) ON CONFLICT DO NOTHING; -- R58->R55
177
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (277, 230) ON CONFLICT DO NOTHING; -- R59->R03
178
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (279, 257) ON CONFLICT DO NOTHING; -- R61->R37
179
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (280, 273) ON CONFLICT DO NOTHING; -- R62->R55
180
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (280, 275) ON CONFLICT DO NOTHING; -- R62->R57
181
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (281, 273) ON CONFLICT DO NOTHING; -- R63->R55
182
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (283, 254) ON CONFLICT DO NOTHING; -- R65->R34
183
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (283, 282) ON CONFLICT DO NOTHING; -- R65->R64
184
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (285, 256) ON CONFLICT DO NOTHING; -- R67->R36
185
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (285, 258) ON CONFLICT DO NOTHING; -- R67->R38
186
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (285, 282) ON CONFLICT DO NOTHING; -- R67->R64
187
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (286, 260) ON CONFLICT DO NOTHING; -- R68->R40
188
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (286, 262) ON CONFLICT DO NOTHING; -- R68->R42
189
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (286, 282) ON CONFLICT DO NOTHING; -- R68->R64
190
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (286, 284) ON CONFLICT DO NOTHING; -- R68->R66
191
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (286, 285) ON CONFLICT DO NOTHING; -- R68->R67
192
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (288, 282) ON CONFLICT DO NOTHING; -- R70->R64
193
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (288, 285) ON CONFLICT DO NOTHING; -- R70->R67
194
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (291, 202) ON CONFLICT DO NOTHING; -- R73->R20
195
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (292, 202) ON CONFLICT DO NOTHING; -- R74->R20
196
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (292, 242) ON CONFLICT DO NOTHING; -- R74->R22
197
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (292, 263) ON CONFLICT DO NOTHING; -- R74->R43
198
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (293, 285) ON CONFLICT DO NOTHING; -- R75->R67
199
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (294, 106) ON CONFLICT DO NOTHING; -- R76->R04
200
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (294, 238) ON CONFLICT DO NOTHING; -- R76->R13
201
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (296, 238) ON CONFLICT DO NOTHING; -- R78->R13
202
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (296, 294) ON CONFLICT DO NOTHING; -- R78->R76
203
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (297, 239) ON CONFLICT DO NOTHING; -- R79->R14
204
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (299, 300) ON CONFLICT DO NOTHING; -- R81->R82
205
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (301, 106) ON CONFLICT DO NOTHING; -- R83->R04
206
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (301, 239) ON CONFLICT DO NOTHING; -- R83->R14
207
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (303, 236) ON CONFLICT DO NOTHING; -- R85->R11
208
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (302, 303) ON CONFLICT DO NOTHING; -- R84->R85
209
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (305, 229) ON CONFLICT DO NOTHING; -- R87->R02
210
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (306, 231) ON CONFLICT DO NOTHING; -- R88->R05
211
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (306, 250) ON CONFLICT DO NOTHING; -- R88->R30
212
+ INSERT INTO task_dependencies (task_id, depends_on_task_id) VALUES (306, 251) ON CONFLICT DO NOTHING; -- R88->R31
213
+ END $$;
214
+
215
+ -- Total dependency edges inserted: 86
216
+
217
+ -- ============================================================================
218
+ -- 3. Bump migration counter + register migration
219
+ -- ============================================================================
220
+ UPDATE migration_counter SET next_number = GREATEST(next_number, 22) WHERE id = 1;
221
+ INSERT INTO schema_migrations (version) VALUES ('021_v3_renumber_and_deps')
222
+ ON CONFLICT (version) DO NOTHING;
223
+
224
+ COMMIT;
@@ -0,0 +1,41 @@
1
+ -- 022_v3_reconcile_dep_gated_status.sql
2
+ -- GDS-V3 / task 347 / V3.R02-followup — Reconcile dep-gated task status.
3
+ --
4
+ -- Migration 021 wired dependency edges onto existing GDS-V3 tasks
5
+ -- retroactively, but did not demote tasks that were ALREADY 'ready' and now
6
+ -- carry an unshipped dependency. Result: ~51 tasks displayed as 'ready' in
7
+ -- /builder-start yet returned 409 DEPS_NOT_SHIPPED on claim (the claim-time
8
+ -- guard in src/bongos/db.js caught them). The queue lied about what was
9
+ -- actually claimable.
10
+ --
11
+ -- Fix: demote every 'ready' task that has at least one unshipped dependency
12
+ -- back to 'backlog'. The auto-promotion trigger from migration 020 then
13
+ -- re-promotes each one to 'ready' the moment its last dependency ships.
14
+ --
15
+ -- Invariant restored: a task is 'ready' only if all of its dependencies are
16
+ -- 'shipped'. Spikes are unaffected (they already live in backlog by policy).
17
+ --
18
+ -- Idempotent: the demotion is conditioned on the presence of an unshipped
19
+ -- dependency, so re-running after deps ship is a no-op. Tasks already in
20
+ -- backlog are not in scope (WHERE status = 'ready').
21
+ BEGIN;
22
+
23
+ UPDATE tasks t
24
+ SET status = 'backlog',
25
+ updated_at = now()
26
+ WHERE t.version_id = 'GDS-V3'
27
+ AND t.status = 'ready'
28
+ AND EXISTS (
29
+ SELECT 1
30
+ FROM task_dependencies d
31
+ JOIN tasks dep ON dep.id = d.depends_on_task_id
32
+ WHERE d.task_id = t.id
33
+ AND dep.status <> 'shipped'
34
+ );
35
+
36
+ -- Bump migration counter (021 left it at 22, which this file consumes) + register.
37
+ UPDATE migration_counter SET next_number = GREATEST(next_number, 23) WHERE id = 1;
38
+ INSERT INTO schema_migrations (version) VALUES ('022_v3_reconcile_dep_gated_status')
39
+ ON CONFLICT (version) DO NOTHING;
40
+
41
+ COMMIT;
@@ -0,0 +1,30 @@
1
+ -- V3.R05 (#106): Builder rank system — ancient-Greek hierarchy.
2
+ --
3
+ -- Authority lives in ONE place: builders.rank, on the production DB, checked
4
+ -- server-side per request with no caching (see ADR 0016). This migration adds
5
+ -- the rank column; the FOUNDING admin is no longer hard-coded here. It is seated
6
+ -- at first enrollment from instance config (the configured firstAdmin), idempotent
7
+ -- and only while no Archon exists yet — see src/bongos/auth.js maybeSeatFirstAdmin
8
+ -- (ADR 0062 R62 / task 1201). This keeps the build-system core free of any one
9
+ -- instance's owner identity; the live instance was already seated by the original
10
+ -- form of this migration, so prod is unaffected.
11
+ --
12
+ -- Live ranks for V3: Archon + Thetes. The full enum is reserved up front so
13
+ -- future ranks (the reserved ladder in task #106) don't need a schema change —
14
+ -- adding a rank to the live set later is a code-only change (route grants),
15
+ -- never a migration.
16
+
17
+ ALTER TABLE builders
18
+ ADD COLUMN IF NOT EXISTS rank text NOT NULL DEFAULT 'thetes'
19
+ CHECK (rank IN (
20
+ -- Divine — above-the-system
21
+ 'olympian', 'hermes', 'oracle', 'demigod',
22
+ -- Citizen — the working ladder (archon + thetes LIVE in V3)
23
+ 'archon', 'strategos', 'boule', 'aristoi', 'hippeis', 'zeugitai', 'thetes',
24
+ -- Outsider / sub-citizen — sandboxed
25
+ 'metic', 'xenos', 'periokoi', 'doulos', 'helot'
26
+ ));
27
+
28
+ -- No founding-admin literal here (R62 / task 1201): a fresh install seats its
29
+ -- configured firstAdmin in code, at that account's first enrollment, only while
30
+ -- no Archon exists. Every builder defaults to 'thetes' via the column default.
@@ -0,0 +1,15 @@
1
+ -- V3.R88 (#307): Graceful builder exit.
2
+ --
3
+ -- A builder can be deactivated (they quit / are offboarded) without losing any
4
+ -- history. status gates whether they can claim new work; their drachmae
5
+ -- (credits) and credit_log stay untouched (preserved indefinitely), their
6
+ -- shipped tasks and session_logs stay attributed to them, and an Archon can
7
+ -- reactivate them later. On exit their rank drops to the sandboxed 'xenos'
8
+ -- tier and their active claims are released cleanly (handled in app code).
9
+
10
+ ALTER TABLE builders
11
+ ADD COLUMN IF NOT EXISTS status text NOT NULL DEFAULT 'active'
12
+ CHECK (status IN ('active', 'inactive')),
13
+ ADD COLUMN IF NOT EXISTS deactivated_at timestamptz,
14
+ ADD COLUMN IF NOT EXISTS reactivated_at timestamptz,
15
+ ADD COLUMN IF NOT EXISTS deactivated_reason text;
@@ -0,0 +1,46 @@
1
+ -- 027_builders_preferred_disciplines.sql — adds builders.preferred_disciplines.
2
+ --
3
+ -- A builder's preferred_disciplines is the set of interest areas they want
4
+ -- the work queue tilted toward — the builder-side mirror of tasks.discipline
5
+ -- (migration 014). Valid elements are the *real* interest areas only:
6
+ --
7
+ -- creative — map/world, quests, narrative, visual art, pixel pipeline
8
+ -- engineering — gameplay mechanics, infra, the GDS itself, perf, bugs
9
+ --
10
+ -- Encoding:
11
+ -- {} — no preference stated (default)
12
+ -- {creative} — creative only
13
+ -- {engineering} — engineering only
14
+ -- {creative,engineering} — "both"
15
+ --
16
+ -- Note the enum here is intentionally narrower than tasks.discipline, which
17
+ -- also carries 'unclassified' for un-triaged work. A builder never *prefers*
18
+ -- unclassified — that's a state of a task, not an interest area — so it is
19
+ -- excluded from the CHECK. Empty array is the builder equivalent of "no
20
+ -- preference yet".
21
+ --
22
+ -- Pairs with V3.R81 (#299), which consumes this column to gate the queue and
23
+ -- surface cross-discipline recommendations.
24
+ --
25
+ -- Idempotent: safe to re-run.
26
+
27
+ ALTER TABLE builders
28
+ ADD COLUMN IF NOT EXISTS preferred_disciplines text[] NOT NULL DEFAULT '{}';
29
+
30
+ -- Validate every element against the discipline enum (creative|engineering).
31
+ -- Postgres forbids subqueries in CHECK constraints, so we use the array
32
+ -- containment operator `<@` ("is contained by"): the constraint holds iff
33
+ -- every element of preferred_disciplines is in the allowed set. The empty
34
+ -- array `<@` anything is true, so the default {} passes.
35
+ DO $$
36
+ BEGIN
37
+ IF NOT EXISTS (
38
+ SELECT 1 FROM pg_constraint WHERE conname = 'builders_preferred_disciplines_check'
39
+ ) THEN
40
+ ALTER TABLE builders ADD CONSTRAINT builders_preferred_disciplines_check
41
+ CHECK (preferred_disciplines <@ ARRAY['creative', 'engineering']::text[]);
42
+ END IF;
43
+ END$$;
44
+
45
+ INSERT INTO schema_migrations (version) VALUES ('027_builders_preferred_disciplines')
46
+ ON CONFLICT (version) DO NOTHING;
@@ -0,0 +1,71 @@
1
+ -- 028_tasks_parallel_safe.sql — adds tasks.parallel_safe.
2
+ --
3
+ -- The autonomous overnight session-runner (task #358) can run several tasks at
4
+ -- once in separate sub-agents when the operator opts into parallel mode
5
+ -- (--parallel N). `touches[]` disjointness already prevents *file* collisions
6
+ -- mechanically (claimable_tasks + the unique active-claim index), but some
7
+ -- tasks are unsafe to run concurrently for non-file reasons: they restart the
8
+ -- server, mutate shared infra/DB, or run long deploys. parallel_safe is the
9
+ -- human/planning judgment layered on top of the mechanical touches check.
10
+ --
11
+ -- Encoding (deliberately conservative — unset means "do NOT fan out"):
12
+ -- NULL — not yet judged (default). Treated as serial-only by the runner.
13
+ -- false — explicitly unsafe to run alongside other tasks.
14
+ -- true — safe to run concurrently (subject to touches[] disjointness too).
15
+ --
16
+ -- A task is eligible for a parallel slot iff it is autonomous-fit
17
+ -- (tasks_session_fit → 'autonomous' ∈ fits_session_modes, i.e.
18
+ -- automation_tag='overnight-safe' AND manual_degree<=2 AND no blocker) AND
19
+ -- parallel_safe = true. See src/bongos/db.js listClaimableTasks({ fit: 'parallel' }).
20
+ --
21
+ -- Idempotent: safe to re-run.
22
+
23
+ ALTER TABLE tasks
24
+ ADD COLUMN IF NOT EXISTS parallel_safe boolean;
25
+
26
+ -- Rebuild the two SELECT t.* views so the new column flows through. Same
27
+ -- bodies as migration 015 — only the implicit t.* column list changes (it now
28
+ -- includes parallel_safe). DROP+CREATE rather than OR REPLACE because the
29
+ -- column-list changes; mirrors how migration 014 added `discipline`. Neither
30
+ -- view has dependents (verified against pg_depend at migration-write time).
31
+
32
+ DROP VIEW IF EXISTS claimable_tasks;
33
+ CREATE VIEW claimable_tasks AS
34
+ SELECT t.*,
35
+ pms_calibrated_minutes(t.est_minutes, t.kind) AS est_minutes_calibrated
36
+ FROM tasks t
37
+ WHERE t.status = 'ready'
38
+ AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
39
+ AND NOT EXISTS (
40
+ SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id
41
+ )
42
+ AND NOT EXISTS (
43
+ SELECT 1 FROM claims c
44
+ JOIN tasks t2 ON t2.id = c.task_id
45
+ WHERE c.released_at IS NULL
46
+ AND t2.touches && t.touches
47
+ );
48
+
49
+ DROP VIEW IF EXISTS tasks_session_fit;
50
+ CREATE VIEW tasks_session_fit AS
51
+ SELECT t.*,
52
+ CASE
53
+ WHEN t.automation_tag = 'overnight-safe' AND COALESCE(t.manual_degree, 5) <= 2
54
+ AND NOT EXISTS (SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id)
55
+ THEN ARRAY['autonomous','check-in','active']
56
+ WHEN t.automation_tag = 'live-only' OR COALESCE(t.manual_degree, 5) >= 4
57
+ THEN ARRAY['active']
58
+ ELSE ARRAY['check-in','active']
59
+ END AS fits_session_modes,
60
+ pms_calibrated_minutes(t.est_minutes, t.kind) AS est_minutes_calibrated,
61
+ CASE
62
+ WHEN t.credits_reward > 0
63
+ AND pms_calibrated_minutes(t.est_minutes, t.kind) IS NOT NULL
64
+ AND pms_calibrated_minutes(t.est_minutes, t.kind) > 0
65
+ THEN ROUND(t.credits_reward::numeric / pms_calibrated_minutes(t.est_minutes, t.kind), 3)
66
+ ELSE NULL
67
+ END AS credits_per_minute
68
+ FROM tasks t;
69
+
70
+ INSERT INTO schema_migrations (version) VALUES ('028_tasks_parallel_safe')
71
+ ON CONFLICT (version) DO NOTHING;
@@ -0,0 +1,32 @@
1
+ -- 029_rank_three_live.sql — the three-rank model goes live (Xenos / Metic / Archon).
2
+ --
3
+ -- Context: task #360, follow-up to the V3.R86 (#305) CLAUDE.md audit, which
4
+ -- surfaced that the ENFORCED model (archon + thetes default, xenos = exit tier)
5
+ -- conflicted with the PLANNED model in V3 criterion C2 + the skills (xenos
6
+ -- default sandbox -> metic working rank -> archon). Lars chose to wire the
7
+ -- three-rank model for real. See ADR 0018.
8
+ --
9
+ -- This migration does the two SCHEMA pieces; the route-grant + claim-gate
10
+ -- pieces are code (src/bongos/*), not schema. Adding 'metic' to the live set is a
11
+ -- code change (it was already a reserved value in the migration 023 CHECK enum)
12
+ -- — no enum change is needed here.
13
+ --
14
+ -- Blast radius is zero: at the time this ran only the founding Archon existed. No thetes/metic/xenos
15
+ -- builders are live, so flipping the default affects only builders created from
16
+ -- now on. Existing rows are untouched (ALTER ... SET DEFAULT is not retroactive).
17
+ --
18
+ -- Idempotent: safe to re-run.
19
+
20
+ -- 1. New GitHub-authed builders now default to the sandboxed entry rank.
21
+ -- (Was 'thetes' in migration 023.) Metic is the Archon-approved working rank
22
+ -- a builder is deliberately promoted to; thetes joins the reserved ladder.
23
+ ALTER TABLE builders ALTER COLUMN rank SET DEFAULT 'xenos';
24
+
25
+ -- 2. The "explicitly-tagged-open" mechanism for the Xenos sandbox. A Xenos can
26
+ -- only claim tasks flagged open to them; everything else needs Metic+.
27
+ -- Default false = closed; an Archon opens a task by setting it true via
28
+ -- PATCH /api/gds/tasks/:id.
29
+ ALTER TABLE tasks ADD COLUMN IF NOT EXISTS xenos_claimable boolean NOT NULL DEFAULT false;
30
+
31
+ INSERT INTO schema_migrations (version) VALUES ('029_rank_three_live')
32
+ ON CONFLICT (version) DO NOTHING;
@@ -0,0 +1,61 @@
1
+ -- 030_vulnerability_reports.sql — the red-team bounty intake table (V3.R63 / #282).
2
+ --
3
+ -- A builder who finds a security flaw files a vulnerability_report here. This is
4
+ -- the durable record of what was found, by whom, against what target, and how
5
+ -- the report was adjudicated (open → repro_attempted → confirmed/disputed →
6
+ -- fixed/wontfix). It is the foundation for:
7
+ -- R65 (#284, shipped) — the bounty payout table in src/bongos/security.js. The
8
+ -- `severity` CHECK below uses the SAME four tiers the bounty table keys
9
+ -- on (low/medium/high/critical) so a confirmed report maps cleanly to a
10
+ -- drachmae amount.
11
+ -- R67 — the Archon adjudication path (read ALL reports, change status).
12
+ -- R68 — auto-confirmation awards `drachmae_awarded` from the bounty table and
13
+ -- links a `fix_task_id` once the fix ships.
14
+ --
15
+ -- Unit convention: drachmae_awarded is the in-world currency (see credit_log in
16
+ -- 003_pms.sql) — a plain numeric count of drachmae, NULL until a report is
17
+ -- confirmed and paid out by R68. Stored numeric (not integer) to match the
18
+ -- task spec; the bounty defaults themselves are integers.
19
+ --
20
+ -- Idempotent: safe to re-run.
21
+
22
+ CREATE TABLE IF NOT EXISTS vulnerability_reports (
23
+ id bigserial PRIMARY KEY,
24
+ -- Who filed it. FK to builders, like every other ownership column in the GDS.
25
+ reporter_builder_id bigint NOT NULL REFERENCES builders(id),
26
+ -- What it's against (a component / route / surface). Free text, not an enum:
27
+ -- the attack surface isn't a closed set.
28
+ target text NOT NULL,
29
+ -- Severity tiers MUST match the bounty table keys in src/bongos/security.js
30
+ -- (SEVERITIES = ['low','medium','high','critical']). Keep these in sync — a
31
+ -- new tier is a coordinated change to both this CHECK and that module.
32
+ severity text NOT NULL CHECK (severity IN ('low', 'medium', 'high', 'critical')),
33
+ title text NOT NULL,
34
+ description text,
35
+ -- Reproduction steps as markdown (the report's evidence).
36
+ repro_steps_md text,
37
+ -- Adjudication lifecycle. open is the filing default; an Archon (R67) drives
38
+ -- it forward. confirmed/fixed are the payout-eligible terminal-ish states.
39
+ status text NOT NULL DEFAULT 'open'
40
+ CHECK (status IN ('open', 'repro_attempted', 'confirmed', 'disputed', 'fixed', 'wontfix')),
41
+ -- Adjudication timestamps — NULL until the corresponding transition happens.
42
+ confirmed_at timestamptz,
43
+ fixed_at timestamptz,
44
+ -- The task that fixes this vuln, once one exists (R68 links it).
45
+ fix_task_id bigint REFERENCES tasks(id),
46
+ -- Drachmae paid out on confirmation (R68 fills this from the bounty table).
47
+ -- NULL = not yet paid. numeric per the task spec.
48
+ drachmae_awarded numeric,
49
+ reported_at timestamptz NOT NULL DEFAULT now()
50
+ );
51
+
52
+ CREATE INDEX IF NOT EXISTS idx_vuln_reports_reporter ON vulnerability_reports (reporter_builder_id, reported_at DESC);
53
+ CREATE INDEX IF NOT EXISTS idx_vuln_reports_status ON vulnerability_reports (status, reported_at DESC);
54
+ CREATE INDEX IF NOT EXISTS idx_vuln_reports_severity ON vulnerability_reports (severity);
55
+
56
+ -- Bump the migration counter past 030 so the next claim that includes
57
+ -- 'migrations/' allocates 031.
58
+ UPDATE migration_counter SET next_number = GREATEST(next_number, 31) WHERE id = 1;
59
+
60
+ INSERT INTO schema_migrations (version) VALUES ('030_vulnerability_reports')
61
+ ON CONFLICT (version) DO NOTHING;
@@ -0,0 +1,57 @@
1
+ -- 031_reward_simplification.sql — flip the simplification incentive (V3.R93 / #354).
2
+ --
3
+ -- Layer 2 (REWARD) of the code-simplification plan. Three coordinated changes,
4
+ -- all schema/seed (the streak un-exclusion + the net-negative credit path are
5
+ -- code changes in src/bongos/streak.js + src/bongos/db.js, not SQL):
6
+ --
7
+ -- 1. credit_log gains a nullable `description` column so the net-negative
8
+ -- ship bonus (db.js awardNetNegativeBonus) can record the raw
9
+ -- removed/added line counts and the reason inline, instead of cramming
10
+ -- everything into the short `reason` enum-ish string. Existing inserts use
11
+ -- explicit column lists and never touch `description`, so this is additive
12
+ -- and safe; old rows read back NULL.
13
+ --
14
+ -- 2. A new "Subtractor" achievement is seeded into the fixed catalog. It is
15
+ -- awarded via the EXISTING builder_achievements mechanism (see
16
+ -- src/bongos/achievements.js evaluateAfterShip) when a builder has earned the
17
+ -- net-negative ship bonus on >= 3 ships — i.e. they have, across multiple
18
+ -- ships, deleted more than they added. icon 🪓, credit_bonus 2 (same tier
19
+ -- as the other "ship a class of work" achievements).
20
+ --
21
+ -- 3. The streak-3 / streak-7 achievement descriptions are corrected: they
22
+ -- previously read "(>=15min, kind != cleanup)", but as of this task
23
+ -- cleanup/refactor ships DO count toward streaks (streak.js exclusion
24
+ -- removed). Keep the catalog text honest.
25
+ --
26
+ -- Idempotent: ADD COLUMN IF NOT EXISTS; achievement seed is upsert-on-id.
27
+
28
+ -- 1. credit_log.description ------------------------------------------------
29
+ ALTER TABLE credit_log ADD COLUMN IF NOT EXISTS description text;
30
+
31
+ -- 2. + 3. Achievement catalog ----------------------------------------------
32
+ -- New "Subtractor"; corrected streak descriptions. Upsert so re-running this
33
+ -- migration (or a later catalog edit) converges. credit_bonus / sort_order on
34
+ -- Subtractor mirror the other touches[]-class achievements (art/gds shippers).
35
+ INSERT INTO achievements (id, name, description, icon, credit_bonus, sort_order) VALUES
36
+ ('subtractor', 'Subtractor',
37
+ 'Earn the net-negative ship bonus on 3 ships — across your work you have deleted more than you have added.',
38
+ '🪓', 2, 65),
39
+ ('streak-3', 'Streak: 3 Nights',
40
+ 'Ship a task in 3 consecutive local-time nights (>=15min; cleanup/refactor now counts).',
41
+ '🔥', 2, 40),
42
+ ('streak-7', 'Streak: 7 Nights',
43
+ 'Ship a task in 7 consecutive local-time nights (>=15min; cleanup/refactor now counts).',
44
+ '🌋', 5, 50)
45
+ ON CONFLICT (id) DO UPDATE
46
+ SET name = EXCLUDED.name,
47
+ description = EXCLUDED.description,
48
+ icon = EXCLUDED.icon,
49
+ credit_bonus = EXCLUDED.credit_bonus,
50
+ sort_order = EXCLUDED.sort_order;
51
+
52
+ -- Bump the migration counter past 031 so the next claim that includes
53
+ -- 'migrations/' allocates 032.
54
+ UPDATE migration_counter SET next_number = GREATEST(next_number, 32) WHERE id = 1;
55
+
56
+ INSERT INTO schema_migrations (version) VALUES ('031_reward_simplification')
57
+ ON CONFLICT (version) DO NOTHING;