@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,86 @@
1
+ # 0008 — Family-based tile generation with deterministic-first review
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-05-09
5
+ - **Deciders:** Lars
6
+ - **Supersedes (in part):** the per-tile generation flow described in the Phase-1 pixel-art pipeline (see [docs/recipes/pixel-art-pipeline.md](../recipes/pixel-art-pipeline.md)), which remains in service for atomic tiles that have not yet been migrated.
7
+
8
+ ## Context
9
+
10
+ The first pixel-art pipeline ([§7 of CLAUDE.md](../../CLAUDE.md), the original `art/pipeline/orchestrator.py`) generates one tile per call. Each call to the image API has no memory of any other call. This worked acceptably for unrelated atomic tiles (a rock, a single olive tree) but failed structurally for any tile-set whose members must visually cohere:
11
+
12
+ - The 4-direction player sprite produced **four different-looking characters** — different body sizes, different clothing colors, different hair. Worst-case pairwise palette overlap was 0.29; worst-case dominant-color overlap was 0.00; silhouette pixel counts ranged from 177 to 900 across the four directions.
13
+ - The vendor was likewise produced as an unconnected one-off.
14
+ - Transition tiles (grass-to-sand edges) and any future autotile path / road / border family would have failed the same way: tiles that *must* line up at seams cannot be generated independently and expected to fit.
15
+
16
+ The review system was scoring tiles in isolation against a 9-criterion rubric. None of the criteria measured cross-tile coherence. A tile could earn 9.5/10 individually while being entirely incompatible with its declared neighbors.
17
+
18
+ We needed an architecture that:
19
+
20
+ 1. Forces sibling tiles to be drawn together so they share a single style anchor.
21
+ 2. Mechanically validates that adjacent tiles match at their edges (and that character frames depict the same individual).
22
+ 3. Reduces — not increases — total cost per produced tile.
23
+ 4. Lets Lars approve atomic-swap publish before any tile lands in `art/generated/tiles/`.
24
+ 5. Stays inside the per-project $80 cap ($79.96 remaining at the time of this ADR).
25
+
26
+ ## Decision
27
+
28
+ Make the **family** — not the tile — the unit of generation.
29
+
30
+ A *family* is a coordinated set of members produced as a single image-gen call against a layout grid. Members are sliced out of the returned sheet and post-processed individually.
31
+
32
+ Concretely:
33
+
34
+ - New schema: `art/template/families.json`. Each family declares `kind`, `layout`, `members[]`, `shared_style`, and optional per-family threshold overrides. Defaults inherit from a top-level `defaults` block.
35
+ - New pipeline modules under `art/pipeline/`:
36
+ - `family_loader.py` — schema loading with defaults inheritance.
37
+ - `family_generator.py` — sheet prompt builder, single-call generation, slicer + post-process.
38
+ - `family_checks.py` — deterministic family-level coherence checks (silhouette area / height CV, palette Jaccard, dominant-color overlap, luminance EMD, self-seam, edge contracts).
39
+ - `family_review.py` — Gemini family-coherence review, scored on family-level criteria (`family_consistency`, `character_identity`, `grid_alignment`, `firered_match`, `mythic_greek`).
40
+ - `family_orchestrator.py` — full retry loop with anchor-refinement on failure.
41
+ - Review ordering: **deterministic checks run first. The Gemini review only runs if they pass.** Failures produce numeric fix-hints fed back into the next prompt.
42
+ - Publishing is gated behind an explicit `--publish` flag — never automatic. Atomic-swap into `art/generated/tiles/` only happens when Lars approves.
43
+ - The old per-tile pipeline is left in service for the 22 atomic tiles that have not yet been migrated. Migration happens family by family as we rebuild the affected zones.
44
+
45
+ The first family migrated was `player_character` (4-direction sprite, 2×2 layout, 7.0/5.0 thresholds). Result: **passed in one attempt**, Gemini review 8.6→9.0/10, deterministic gate 5/5, total cost $0.078 across two runs (initial + publish run). All five coherence metrics improved by an order of magnitude versus the per-tile output.
46
+
47
+ ## Alternatives considered
48
+
49
+ - **Keep per-tile generation, add a cross-tile coherence rubric criterion.** Rejected — no Gemini review can fix what's broken at generation time. The model has no way to draw "the same character" twice when called twice with no shared memory.
50
+ - **Generate one canonical front-facing sprite, derive the other facings via prompt engineering.** Rejected — fragile, model-dependent, and can't generalize to non-character families like paths.
51
+ - **Generate the whole tile-set in one giant sheet (all 23 tiles).** Rejected — the model cannot maintain coherence at that scale, and a single failure would invalidate every tile. Family granularity is the natural unit: small enough to coordinate, large enough to enforce sibling identity.
52
+ - **Keep doing per-tile and live with the inconsistency.** Rejected on Lars's first feedback. The "four different characters" failure was visible in-game.
53
+ - **Defer the architecture work and ship V1 with placeholder art.** Rejected — V1's brand promise depends on the world feeling crafted. Inconsistent characters undermine that on the first frame the visitor sees.
54
+
55
+ ## Consequences
56
+
57
+ ### Positive
58
+
59
+ - **Sibling coherence is now generation-time, not review-time.** The model is forced to draw identity-consistent siblings; verification is bookkeeping.
60
+ - **Cost per produced tile dropped.** One sheet call (~$0.04) replaces N independent calls (~$0.04 each) plus N independent Gemini reviews. Empirical: the player_character set produced for $0.04 instead of ~$0.16.
61
+ - **Failure feedback is numeric and specific.** "Silhouette area CV 0.67 > 0.35, make the character the same size in every cell" is something the next prompt can act on. "Make the characters look more like the same person" was not.
62
+ - **Per-family policy** lets us tune thresholds per family kind without code changes.
63
+ - **Atomic-swap publishing** prevents half-migrated states. Old tiles stay live until the new family fully passes.
64
+
65
+ ### Negative / costs
66
+
67
+ - **Higher prompt complexity.** Sheet prompts are longer and more constrained; small errors in the layout description waste an attempt.
68
+ - **Sheet aspect ratio constrained by API wrappers.** Nano Banana's wrapper does not currently expose aspect-ratio control, so 1×N layouts are riskier than 2×2 / square layouts. We default to 2×2 for 4-member families until this is resolved.
69
+ - **Schema migration must continue.** The 22 non-character tiles still live in the old `vocabulary.json` shape. Migration is incremental, not all-at-once. We carry both shapes during the transition.
70
+ - **Threshold tuning is now its own ongoing task.** Per-family overrides need calibration data from real runs across kinds before defaults are trustworthy.
71
+
72
+ ### Operational rules adopted with this decision
73
+
74
+ 1. **The family is the unit of regeneration.** When a member of a family looks wrong, regenerate the whole family — never one cell — to preserve sibling coherence.
75
+ 2. **Deterministic checks run before Gemini.** No Gemini family-review call fires on a family that fails the deterministic gate.
76
+ 3. **Publish requires explicit human approval.** No `--publish` flag → no atomic swap into `art/generated/tiles/`.
77
+ 4. **Per-family threshold overrides live in `families.json`.** Code reads them; no ad-hoc threshold edits in pipeline modules.
78
+ 5. **Lowered thresholds during phase-1 are temporary.** The `_threshold_note` field on a family records the reason and the ramp condition. Ramp back to defaults after enough family runs to know the real ceiling.
79
+
80
+ ## What this does not change
81
+
82
+ - The locked 64-color palette (see Phase-0 pipeline notes) remains authoritative. Palette-quantize still runs on every output cell.
83
+ - The reference cluster overview (`art/template/cluster_overview.png`) remains the "what FireRed looks like" image passed to the reviewer.
84
+ - The cost ledger (`cost_ledger.py`, $80 hard stop) remains the financial gate.
85
+ - The style guide (`art/template/style_guide.md`) remains the durable accumulator of Lars's directional feedback. Sheet prompts continue to consume it.
86
+ - The procedural fallback (`procedural_fallback.py`) remains available for ground-tile families. Character families have no procedural fallback; the recovery path is anchor-refinement instead.
@@ -0,0 +1,37 @@
1
+ # 0008 — Google Chat integration auth model: OAuth as the operator user
2
+
3
+ - **Status:** Superseded by [ADR 0032](0032-discord-mirror-of-gds.md) (outbound) and [ADR 0033](<redacted>.md) (bot/inbound) — Google Chat fully retired 2026-06-05, replaced by Discord
4
+ - **Date:** 2026-05-09
5
+ - **Deciders:** Lars
6
+
7
+ ## Context
8
+
9
+ The Google Chat broadcast integration needs to (a) post milestone updates to the Example team space and (b) read replies/reactions to surface them as feature requests. Google offers two distinct auth paths for the Chat API:
10
+
11
+ 1. **Service account / Chat App identity** — the integration speaks as a registered "bot" persona that's added to the space.
12
+ 2. **User OAuth** — the integration speaks as a real user (in our case `lars@example.com`).
13
+
14
+ Both can read and post; the difference is whose name appears next to messages and reactions, and what setup is required.
15
+
16
+ ## Decision
17
+
18
+ We will use **User OAuth (as `lars@example.com`)**.
19
+
20
+ - OAuth client is a **Desktop application** type, registered under a Google Cloud project (`off-the-boats`) owned by `lars@example.com`.
21
+ - The OAuth consent screen is configured as **Internal** (only `example.com` Workspace users can authorize), which skips Google's app-verification process.
22
+ - A long-lived **refresh token** lives at `~/.config/otb/google-chat-token.json` on the operator's Mac (mode 600). The refresh token is exchanged for short-lived access tokens at runtime.
23
+ - Posts and reactions appear under **Lars Kristensen** in the team chat. The team experience is "Lars is sharing build updates," not "a bot is talking."
24
+
25
+ ## Alternatives considered
26
+
27
+ - **Service account with Chat App identity.** Cleanest separation (the bot is its own persona, posts under "Off the Boats Build Bot"). Requires registering the Chat App via Google Cloud's Chat API Configuration page, a "deployment ID," and Workspace admin permission to allow the service account into the space. More setup steps; the bot identity feels less personal for a small team chat where everyone knows Lars.
28
+ - **Incoming webhook only (outbound, no auth dance).** Dramatically simpler — paste a URL, POST to it, message appears. Good enough for outbound milestone posts but **cannot read messages, threads, or reactions**. Rejected because the inbound feedback loop is half the value.
29
+
30
+ ## Consequences
31
+
32
+ - **The team sees Lars as the source of every milestone post.** Friendly for a small team but means we should never post anything Lars wouldn't want under his own name. The posting rules in [`docs/google-chat-broadcast.md`](../google-chat-broadcast.md) explicitly limit content to player-visible outcomes in plain language.
33
+ - **Reactions show as Lars's reactions.** When the integration acks a request with ✅, the team sees Lars reacting. Aligns with the "Lars relays team feedback to the build" mental model.
34
+ - **Refresh token is a high-value secret.** Anyone with this file can post to the team chat as Lars and read everything Lars has access to in Google Chat. Lives at `~/.config/otb/google-chat-token.json` mode 600, never committed (`.gitignore` enforces). If ever leaked, revoke from [myaccount.google.com/permissions](https://myaccount.google.com/permissions) and re-run `scripts/chat/auth-once.js`.
35
+ - **Refresh token does not expire** for Internal Workspace OAuth apps unless explicitly revoked. No periodic re-auth needed.
36
+ - **Tied to one operator.** If Lars leaves the project (or example.com), the integration breaks. Acceptable for V1 — Lars is a single point of failure on much more than this. If/when the team grows, we can graduate to a service account, write ADR 0009 documenting the migration, and re-issue the integration as a bot identity.
37
+ - **No Workspace admin involvement required.** Internal OAuth consent + Desktop OAuth client are both self-serve at the user level.
@@ -0,0 +1,181 @@
1
+ # 0009 — Autotile architecture: AI primitives + procedural compositor
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-05-09
5
+ - **Deciders:** Lars
6
+
7
+ ## Context
8
+
9
+ V1 needs to render coherent terrain boundaries: grass islands within sand, sand
10
+ beaches against shallow sea, marble flagstone paths through grass, cliffs.
11
+ Earlier work in [ADR 0008](./<redacted>.md) established
12
+ the family pipeline and produced beautiful single illustrations for continuous
13
+ objects (containers, houses), but that pipeline could not produce a true
14
+ autotile family — a set of tiles where every cell is a different topology
15
+ (corner, edge, T-junction, etc.) that must connect cleanly with its neighbors
16
+ in any combination.
17
+
18
+ The stress test confirmed this: under continuous_illustration the 9-tile path
19
+ autotile produced a "border tile set" (a square frame of flagstones) but lost
20
+ the four-way cross and the topology variants a real autotile needs. The model
21
+ is good at drawing single illustrations; it is not good at producing all
22
+ distinct topology variants of a tile set as one image.
23
+
24
+ We needed an architecture that:
25
+
26
+ 1. Produces all 47 (region) or 16 (path) topology variants for an autotile.
27
+ 2. Guarantees that adjacent tiles connect at their shared seams.
28
+ 3. Lets the model do what it is good at (texture appearance) without asking
29
+ it to do what it is bad at (tile-set topology).
30
+ 4. Stays cheap (the project budget is $80, currently ~$2.50 spent).
31
+ 5. Produces output that integrates with the runtime tile picker in Phaser.
32
+
33
+ ## Decision
34
+
35
+ We will use **AI-generated primitives + procedural composition** for autotile
36
+ families.
37
+
38
+ For each autotile family, the AI generates 3–5 small primitive textures:
39
+
40
+ - For region families (47-blob): an interior texture, an exterior texture,
41
+ and three boundary patches (horizontal-edge, concave-corner, convex-corner)
42
+ in their NW orientation.
43
+ - For path families (16-path): a surrounding-terrain texture, a path node,
44
+ and a path arm.
45
+
46
+ A pure-Python compositor (`art/pipeline/autotile_compositor.py`) then composes
47
+ all 47 (or 16) tiles by deterministic per-quadrant masking. Each 32×32 tile is
48
+ divided into 4 quadrants of 16×16; each quadrant's content is determined by
49
+ 3 input bits (one edge each side, plus the corner) which select among 5 patch
50
+ types (interior, concave, horizontal edge, vertical edge, convex). Patches
51
+ are flipped or rotated for non-NW quadrants.
52
+
53
+ **Edges match by construction.** Every tile that has the same edge configuration
54
+ samples its boundary pixels from the same primitive at the same logical
55
+ position. So when two such tiles sit next to each other in the world, the
56
+ seam pixels are guaranteed identical to within bounded jitter.
57
+
58
+ Two standard autotile schemes are implemented:
59
+
60
+ - **47-blob** (RPG Maker A2 / Cr31 / Tiled "terrain" mode standard) for
61
+ region terrain. 8-neighbor with corner-mask reduction. The corner-mask
62
+ rule: a corner-neighbor bit is meaningful only if both adjacent edges
63
+ are also same-terrain (otherwise the boundary along the edge occludes
64
+ the corner). This collapses 256 raw neighbor configurations to 47
65
+ distinct tiles.
66
+
67
+ - **16-path** for line/path terrain. 4-cardinal-only. Each path tile is
68
+ identified by which of the 4 cardinal neighbors are also part of the
69
+ same line (path/road/wall/fence). Direct identity: tile_idx == bitmask.
70
+
71
+ A new family kind in `families.json` (`autotile_blob_47` / `autotile_path_16`)
72
+ declares the family's primitives. A new orchestrator
73
+ (`art/pipeline/autotile_orchestrator.py`) generates the primitives via the
74
+ existing AI pipeline and calls the compositor.
75
+
76
+ Texture-style primitives (interior/exterior/terrain) get an additional
77
+ seamless-enforcement post-step: the leftmost and rightmost columns of pixels
78
+ are averaged to a single column applied to both, and the topmost and
79
+ bottommost rows likewise. After re-quantizing to the locked palette, the
80
+ texture tiles seamlessly with itself — proven by the validation harness
81
+ (100% edge-match on all-interior compositions).
82
+
83
+ The runtime tile picker is split-implementation:
84
+ - `art/pipeline/autotile_mapping.py` (Python) — used by the compositor
85
+ - `public/game/world/autotile.js` (JavaScript) — used by the in-game renderer
86
+ - Cross-verified at build time: both produce identical tile indices for all
87
+ 256 neighbor configurations.
88
+
89
+ ## Alternatives considered
90
+
91
+ - **AI generates the whole tile set in one image (continuous_illustration
92
+ scaled up).** Rejected on stress-test evidence — the model produces a
93
+ coherent illustration but not the topology variants a real autotile needs.
94
+ - **Cell-by-cell with image-conditioning anchors** ("Strategy A" in the
95
+ Pattern-C plan: generate tile 1, generate tile 2 with tile 1's matching
96
+ edge as a reference image, etc.). Rejected for V1 on cost (47 sequential
97
+ generations per family) and reliability (model interpretation of edge
98
+ references is fragile). Kept as a fallback if the primitives approach
99
+ fails for a specific family.
100
+ - **Hand-paint each of the 47 tiles.** Rejected — V1 has no artist budget;
101
+ the bootstrapping spirit of the project demands a self-driving pipeline.
102
+ - **Hand-paint a 5×3 RPG-Maker template (15 quadrants) and derive the 47
103
+ tiles by composition.** Equivalent quality but more manual and less
104
+ flexible than primitives + compositor. Skipped.
105
+ - **Wang tiles (corner-coded) instead of blob47.** Equivalent expressive
106
+ power; 16 corner-coded tiles vs 47 blob tiles. Rejected because the
107
+ corner-coded approach forces every boundary to bend at the corner
108
+ (no smooth straights), which doesn't match the FireRed visual aesthetic.
109
+ - **Skip cliffs.** Considered. Tried anyway as an experiment. Result: the
110
+ 47-blob produces topologically correct cliff regions but stylistically
111
+ weak — real cliffs need direction-specific tiles (south face very
112
+ different from north). Documented as a Phase-D limitation; if V1 ships
113
+ cliffs, they need a follow-up direction-aware scheme.
114
+
115
+ ## Consequences
116
+
117
+ ### Positive
118
+
119
+ - **All 47 (or 16) tiles produced from 3–5 primitive generations.** Cost per
120
+ autotile family is ~$0.25–0.45 vs ~$1.88 if we hand-generated each tile.
121
+ - **Edges match by construction.** No retry loop needed for seam alignment.
122
+ The 100% edge-match score on all-interior compositions proves it.
123
+ - **Standards-compliant.** Anyone familiar with RPG Maker A2, Tiled
124
+ "terrain" mode, or Cr31's blob convention can read the bitmask code
125
+ without learning a custom scheme.
126
+ - **Renderer is data-driven.** World map stores terrain ids; runtime picks
127
+ tile indices via lookup. Shape change (region → autotile) is a swap of
128
+ the picker function.
129
+ - **Single source of truth** for the lookup table. Python and JS
130
+ cross-verified at build time.
131
+
132
+ ### Negative / costs
133
+
134
+ - **Direction-asymmetric terrain** (cliffs, where the south face looks
135
+ different from the north) is poorly served by 47-blob. Documented
136
+ limitation — cliffs ship as best-effort with stylized "shelf" look or
137
+ defer to V2 with a direction-aware scheme.
138
+ - **Boundary tiles are stylistically coherent but not pixel-perfect at
139
+ every seam.** The corner and edge primitives are independently generated
140
+ and don't perfectly match each other at every transition. Acceptable for
141
+ V1; producing pixel-perfect transitions would require generating boundary
142
+ primitives in pairs with image conditioning. Defer to V2.
143
+ - **Multiple autotile families against the same neighbor terrain** require
144
+ per-family primitives. We can't share an "edge between grass and sand"
145
+ primitive between grass_on_sand and sand_on_grass. Acceptable — terrain
146
+ pairs are a finite, small set in V1.
147
+ - **Triple-junctions** (where 3 terrains meet at one tile) are not
148
+ representable. Standard autotile schemes punt on this; we forbid triple
149
+ junctions in level design. V1 world is small enough this isn't binding.
150
+ - **Runtime data-model refactor required.** `src/world/map.js` and
151
+ `public/game/world/map.js` currently store tile ids. They need to store
152
+ terrain ids and let the runtime call the autotile picker. This refactor
153
+ is in V1 scope but is risky enough that it ships in a separate PR after
154
+ this ADR (kept as a pending Phase D in the rollout).
155
+
156
+ ### Operational rules adopted with this decision
157
+
158
+ 1. **Texture-role primitives** (interior, exterior, terrain) get the
159
+ seamless-enforcement post-step automatically. No exceptions.
160
+ 2. **Boundary primitives** (concave/convex/horiz patches) are generated
161
+ in their NW orientation only. The compositor flips/rotates them.
162
+ Don't generate per-orientation copies.
163
+ 3. **Per-tile sample variation** (jitter into the interior primitive based
164
+ on tile coordinates) is a Phase-V2 nice-to-have. Phase B–D ships without
165
+ it; expect visible repetition in large interior fields.
166
+ 4. **Atomic-swap rule still applies.** Autotile output sits in
167
+ `art/iterations/_autotile/<family>/` until Lars reviews and approves
168
+ atomic-swap into `art/generated/tiles/`.
169
+ 5. **Cross-verification of Python/JS tables** is a smoke-test gate. If the
170
+ tables disagree, the build fails. Single source of truth is the rule
171
+ in autotile_mapping.py; autotile.js is generated to match.
172
+
173
+ ## What this does not change
174
+
175
+ - The locked 64-color palette is still authoritative.
176
+ - The cost ledger ($80 hard stop) still gates all generation.
177
+ - The per-tile pipeline still serves the 22 atomic non-autotile tiles
178
+ (grass_base, sand_base, container_door, etc.) until/unless those are
179
+ also migrated to autotiles.
180
+ - The family pipeline (ADR 0008) still serves character families and
181
+ multi-tile object families. Autotiles are an addition, not a replacement.
@@ -0,0 +1,70 @@
1
+ # 0010 — Project management system: schema-first, same-process, GitHub-auth, two surfaces
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-05-09
5
+ - **Deciders:** Lars
6
+ - **Addendum (V3.R01, 2026-05-13):** "PMS" was renamed to "GDS" (Game Development System) when V3 opened the system to multiple builders. Folder/route/env-var renames: `src/pms/` → `src/bongos/`, `scripts/pms/` → `scripts/gds/`, `/api/pms/*` → `/api/gds/*`, `PMS_GITHUB_*` → `GDS_GITHUB_*`, `PMS_API_BASE` → `GDS_API_BASE`, `pms_session` cookie → `gds_session`, `~/.config/otb/pms-session.json` → `~/.config/otb/gds-session.json`. The version ID `PMS-V3` was also renamed to `GDS-V3` (migration `<redacted>.sql` rewrites `versions`, `tasks`, `done_when_criteria`, `idea_inbox`, plus the `pms-shipper` achievement → `gds-shipper`). Future internal-track versions ship as `GDS-V4`, `GDS-V5`, etc. The version IDs `PMS-V1` and `PMS-V2` are NOT renamed — those versions shipped under those names and their archives in `limitations/pms-v*-shipped.md` are immutable historical records.
7
+
8
+ V3.R01 also introduced a transitional `/api/pms/* → /api/gds/*` redirect surface (301 for GET/HEAD, 308 for POST/PATCH/DELETE) so old skill files and cached browser clients would keep working through the rollout. **V3.R01-followup ([#308](https://example.com/builders#/task/308), 2026-05-13) removed that redirect surface** after a repo audit confirmed no caller still hits the legacy path; `/api/pms/*` is now a 404. The read-side back-compat for the `pms_session` cookie, `PMS_GITHUB_*` env vars, and the `~/.config/otb/pms-session.json` file path **continues** (in `src/bongos/auth.js` and `scripts/gds/cli-lib.js`) — those are independent of the URL surface and protect existing local sessions.
9
+
10
+ The body of this ADR is preserved unchanged as the original 2026-05-09 decision record.
11
+
12
+ ## Context
13
+
14
+ The project is structured to be built across many parallel Claude Code sessions, sometimes overnight, sometimes by future human collaborators. To make that work without git merge conflicts and without re-deriving "what's left" every session, we need a real project management system — not a markdown work-board.
15
+
16
+ Lars wants two surfaces:
17
+
18
+ 1. **`/builders`** — private, gamified workspace for prompt engineers. Lists claimable tasks with explicit parallel-safety, awards in-game credits (1 USD = 1 credit, cash-equivalent), shows leaderboard.
19
+ 2. **`status.example.com`** — public dashboard for team, investors, and customers. Cost-vs-value charts, version progress, completed-work feed.
20
+
21
+ Both surfaces share one task/cost/credit ledger.
22
+
23
+ The system also needs to run inside Claude Code itself — slash commands so a session can claim, ship, and release tasks without leaving the terminal.
24
+
25
+ ## Decision
26
+
27
+ Build the GDS as a parallel internal track ("PMS-V1") on top of the existing single-droplet stack, with a Postgres-first schema, same-process API and web UI, GitHub OAuth for builder identity, and atomic claim safety enforced at the database layer.
28
+
29
+ **Key choices:**
30
+
31
+ 1. **Database in existing Postgres 16, new migration `003_pms.sql`.** No new database server. New tables (`builders`, `versions`, `tasks`, `claims`, `cost_log`, `credit_log`, `builder_sessions`, `session_logs`) live alongside `world_events` / `players` in the `example` DB. Same backup story (when backups land), same auth (peer Unix socket).
32
+
33
+ 2. **API in the existing Node/Express process.** New module tree under `src/pms/` mounted at `/api/pms/*`. No new deploy unit, no new systemd service, no new port. Restart cost: same ~2 seconds as a game-server change.
34
+
35
+ 3. **GitHub OAuth for builder identity, two flows:**
36
+ - **CLI** (Claude Code slash commands): GitHub **Device Flow**. No callback URL, no local HTTP server, friendly in a terminal. The CLI gets a verification code, the user pastes it into github.com/login/device, the CLI polls until approved, receives a GitHub access token, and exchanges it with our API for a long-lived session token stored at `~/.config/otb/pms-session.json`.
37
+ - **Web** (`/builders`): standard GitHub OAuth Authorization Code flow with callback to `https://example.com/builders/auth/github/callback`. Sets a session cookie scoped to `/builders`.
38
+ - Both flows produce the same `builder_sessions` row keyed by GitHub user ID. A builder using both surfaces is one builder.
39
+
40
+ 4. **Atomic claim safety at the DB layer.** A partial unique index on `claims (task_id) WHERE released_at IS NULL` makes it physically impossible for two sessions to hold an active claim on the same task. The race goes to whichever transaction commits first; the loser gets a clean constraint violation and picks another task. No application-layer locking, no Redis.
41
+
42
+ 5. **Parallel-safety via `tasks.touches[]` (text array of file/folder paths).** The `claimable_tasks_for_builder()` function returns only tasks whose `touches` array does not overlap with any currently-active claim's task. The builder never has to compute this themselves — the API tells them what is safe to claim *right now*.
43
+
44
+ 6. **Two web surfaces, one process.** `/builders` lives on `example.com`. `status.example.com` is a new Caddy site block on the same droplet, same Node process. Cloudflare DNS gets a new `status` record. The status site is server-rendered HTML + Chart.js, public, no auth, edge-cached.
45
+
46
+ 7. **Server-rendered HTML + small JS for live polling.** Both surfaces. No SPA framework. Polling interval 5 seconds for active claims; status site polls only on user action. This matches the project's existing static-page style and keeps the asset bundle tiny.
47
+
48
+ 8. **Cash-equivalent credits, but redemption is gated.** Phase 1 ships the credit ledger and leaderboard only. No "redeem" button, no transfer mechanism, no payout flow. Before any redemption ships (anywhere from Phase 3 onward), Lars consults a CPA on tax handling and a lawyer on securities/AML posture. The DB is designed to support either path (transfer-only-into-game-currency or cash-equivalent) — the legal posture decides which gets wired up.
49
+
50
+ 9. **Strategic markdown stays.** `current-version.md`, ADRs, learnings, and blockers remain markdown — they are documents, not work units. **Backlog/work tracking moves into the DB.** `limitations/backlog.md` becomes a frozen snapshot for archival once the import script runs; future backlog edits happen via API. `generative-ideas.md` stays as the no-shape capture inbox.
51
+
52
+ ## Alternatives considered
53
+
54
+ - **Linear or GitHub Issues for internal tracking + a custom public status page.** Cheaper to operate (no schema to maintain). Rejected because the gamification (credits, leaderboard, themed builder profile) and the CLI integration (claim from inside Claude Code) are core to Lars's vision and would be awkward bolted onto Linear's webhooks.
55
+ - **Separate microservice for the GDS.** Cleaner boundary, but adds deploy complexity, doubles the systemd unit count, and adds latency between the game server and the GDS API. Rejected — the V1 budget posture says "one process until we have to split."
56
+ - **Application-level locking for claims (Redis or in-process).** Works, but adds a coordination layer that the existing single-Node-process architecture doesn't need. Rejected in favor of Postgres unique-constraint enforcement.
57
+ - **JWT session tokens.** Slightly more "stateless" than DB-stored tokens, but adds a crypto dependency, key-rotation problem, and doesn't enable revocation. Rejected — random tokens in `builder_sessions` are simpler and revocable.
58
+ - **No public status site at all (gamified internal only).** Rejected — Lars wants progress shareable with the team chat, supporters, and eventually players. The cost of `status.example.com` is one more Caddy site block + a few public-read endpoints.
59
+ - **Defer cash-equivalent semantics until later.** Considered making Phase 1 store credits as opaque "points" with the cash equivalence decided later. Rejected — the schema cost is identical and "we'll decide later" tends to never decide. The decision is *cash-equivalent stored, redemption legally gated*.
60
+
61
+ ## Consequences
62
+
63
+ - **Sessions can run in parallel safely.** Two sessions in two worktrees, each holding a claim with disjoint `touches[]`, will not stomp each other. The DB enforces it.
64
+ - **One Lars-task to unblock Phase 2 web UI:** register the GitHub OAuth App and hand over Client ID + Secret. Tracked as a blocker.
65
+ - **The system can self-bootstrap.** Once Phase 1 ships, all further GDS work is itself tracked in the GDS. The PMS-V1 track lives in `versions` as an entry alongside the game V1 track — internal track and product track run as siblings, sharing the same builder credit pool.
66
+ - **Cost-vs-value charts depend on disciplined cost logging.** The `cost_log` table accepts entries from any source — the `art/iterations/cost_ledger.jsonl` import is one source; Anthropic API spend is another (manual until we have a real billing pipeline); droplet/Cloudflare/domain spend is a third. Phase 5 backfills.
67
+ - **Legal/tax exposure exists the moment a non-Lars builder earns credits.** Mitigated by gating redemption — credits exist in the DB but cannot be exchanged for anything until the gate is cleared. Until that gate clears, credits are functionally a leaderboard score.
68
+ - **Trademark posture extends into the GDS.** "Example" appears in URLs (`status.example.com`, `/builders`) and in builder profiles. Same operating rule as [ADR 0004](0004-example-name-and-trademark-acceptance.md): the civilization name is one config string. URLs are a separate decision; if the name has to change, the subdomain DNS record gets repointed and any in-DB strings that reference the name get re-templated.
69
+ - **The methodology gets simpler from a session's perspective.** Today: read CLAUDE.md, read backlog, read blockers, cross-reference current-version, decide what to do. After Phase 1: `/builder-start` returns the answer.
70
+ - **Session logs split.** Today the session log lives as prose in CLAUDE.md §13. Going forward, structured per-task session entries land in `session_logs` (queryable, charts-friendly), and CLAUDE.md §13 becomes a generated tail of the most recent few. Older prose continues to compress into `docs/session-log-archive.md`.
@@ -0,0 +1,174 @@
1
+ # 0011 — Terrain-id world map + dispatched render strategies (Phase D)
2
+
3
+ - **Status:** Accepted; cell data model extended by [ADR 0012](./<redacted>.md)
4
+ - **Date:** 2026-05-09
5
+ - **Deciders:** Lars
6
+
7
+ > **Update (same day):** [ADR 0012](./<redacted>.md)
8
+ > splits the cell from one terrain id into two layers — ground (always
9
+ > defined) + object (optional overlay). The dispatched render
10
+ > strategies (`single` / `blob47` / `path16`) and the autotile cross-
11
+ > verify gate from this ADR are unchanged; only the cell data model is
12
+ > extended. Read 0012 for the current architecture.
13
+
14
+ ## Context
15
+
16
+ [ADR 0008](./<redacted>.md) and
17
+ [ADR 0009](./0009-autotile-architecture.md) established two new asset
18
+ pipelines (family + autotile) but stopped at the asset boundary. The
19
+ runtime renderer still treated the world as a flat 2D grid of tile-id
20
+ strings: each cell stored a key like `'grass'` or `'container_door'`,
21
+ `tilePalette.js` painted a single PNG per cell, and the door tile was
22
+ literally one cell wide. Multi-tile objects had to be hand-laid in the
23
+ map by repeating the same id, and autotile families had no way to
24
+ contribute tiles at all — `selectBlob47` / `selectPath16` from
25
+ [`autotile.js`](../../public/game/world/autotile.js) existed but nothing
26
+ called them.
27
+
28
+ ADR 0009 explicitly flagged this gap as **Phase D**, deferring the
29
+ runtime data-model refactor to a separate change because it touches
30
+ both the server's movement-validation map and the client's renderer.
31
+
32
+ We needed:
33
+
34
+ 1. A world data model that can represent both autotile-driven terrains
35
+ (cells whose final tile depends on neighbors) and plain singletons
36
+ (vendor sprites, container panels) without the renderer having to
37
+ special-case each one.
38
+ 2. A way to ship the refactor before all autotile families are
39
+ generated, so the world keeps rendering when assets are missing.
40
+ 3. A single source of truth for "is this cell walkable?" that the
41
+ server uses for movement validation and the client honors for
42
+ prediction.
43
+ 4. Cross-verification that the JS runtime picker and the Python
44
+ compositor agree on tile selection — drift here means the renderer
45
+ would pick a different tile than the compositor produced and edge
46
+ matching breaks.
47
+
48
+ ## Decision
49
+
50
+ Cells store a **terrain id**. The renderer dispatches per terrain to a
51
+ **render strategy** declared in a single registry. Three strategies:
52
+
53
+ - `single` — paint the texture registered as `tex_<game_key>`. Legacy
54
+ path; covers terrains we have not migrated to autotiles (sea, rock,
55
+ the 8 container panels).
56
+ - `blob47` — query 8 neighbors, call `selectBlob47(myTerrain, neighbors)`,
57
+ paint `tex_at_<family>_<idx>` (PNG at
58
+ `/assets/tiles/autotile/<family>/<NN>.png`). Falls back to a declared
59
+ `fallbackTile` if the autotile family hasn't been generated yet.
60
+ - `path16` — same shape but 4-cardinal-only and 16 tiles.
61
+
62
+ The terrain enum, the render registry, and the walkability set live in
63
+ two mirrored files:
64
+
65
+ - [`public/game/world/terrain.js`](../../public/game/world/terrain.js)
66
+ (ESM, full version with autotile-picker helpers)
67
+ - [`src/world/terrain.js`](../../src/world/terrain.js)
68
+ (CJS, narrow — only the enum and walkability set; the server doesn't
69
+ draw)
70
+
71
+ Until the world becomes data-driven, these two MUST stay in sync. Same
72
+ constraint and rationale as the existing two-copy `map.js`.
73
+
74
+ The renderer's per-cell dispatch lives in
75
+ [`tilePalette.js`](../../public/game/world/tilePalette.js) as
76
+ `pickTextureKeyForCell(scene, grid, x, y)`, called from
77
+ `WorldScene.drawMap()`. The 8-neighbor lookup uses `neighborsAt(grid, x, y)`
78
+ from `terrain.js`. Off-grid neighbors resolve to `null`, which the
79
+ "same as my terrain?" check naturally treats as exterior.
80
+
81
+ The container is treated as a multi-tile placed object: each of its
82
+ 8 cells is a distinct terrain id (`CONTAINER_PANEL_TL` through
83
+ `CONTAINER_PANEL_BR`). The map places them in row-major order at the
84
+ container's anchor cell. All 8 are in `BLOCKING_TERRAINS`. The
85
+ container family in [`families.json`](../../art/template/families.json)
86
+ was respecced from 2×2 to 2×4 (door at bottom-left) so the family-
87
+ pipeline output matches the in-game placement footprint without
88
+ shrinking the building or moving the vendor.
89
+
90
+ `wet_sand` was dropped from the data model. The tide-line foam now
91
+ emerges from the `sand_on_sea` autotile boundary tiles — terrain is
92
+ just `SAND` right up to where it meets `SEA`, and the autotile picker
93
+ chooses the foam variant at the boundary. One less hand-tuned terrain
94
+ in the map.
95
+
96
+ A Python↔JS cross-verification smoke test
97
+ ([`tests/autotile_xverify.mjs`](../../tests/autotile_xverify.mjs) plus
98
+ its emitter [`art/pipeline/autotile_xverify.py`](../../art/pipeline/autotile_xverify.py))
99
+ asserts that all 256 blob47 inputs and all 16 path16 inputs map to the
100
+ same tile index in both implementations. Wired into
101
+ [`art/pipeline/smoke_test.sh`](../../art/pipeline/smoke_test.sh) so any
102
+ drift fails the build.
103
+
104
+ ## Consequences
105
+
106
+ ### Positive
107
+
108
+ - **One renderer for all terrain types.** Adding a new autotile family
109
+ is a families.json entry + a TERRAIN_RENDER row + a generation run.
110
+ No new render code per terrain.
111
+ - **Phase D ships before the assets do.** Every autotile-strategy
112
+ terrain declares a `fallbackTile`. With zero autotile families
113
+ generated, the renderer falls back to the legacy single-tile PNGs and
114
+ the world looks identical to pre-Phase-D. Adding a family is a
115
+ visual-only change, not a code change.
116
+ - **Walkability is a property of the terrain, not the tile artwork.**
117
+ The autotile picker can produce a foam-edge tile or a corner tile or
118
+ a fully-interior tile for the same `SAND` terrain, and movement
119
+ validation always says "sand is walkable." This decouples appearance
120
+ from gameplay rules.
121
+ - **Cross-verify catches algorithm drift.** Any change to either
122
+ `autotile_mapping.py` or `autotile.js` that breaks parity fails the
123
+ smoke test. We can edit either side with confidence the other won't
124
+ silently disagree.
125
+ - **Server-side terrain.js is narrow.** The CJS twin only carries the
126
+ enum and walkability — no rendering knowledge. Less surface to keep
127
+ in sync, less chance of accidental drift between server and client.
128
+
129
+ ### Negative / costs
130
+
131
+ - **Terrain-id mirroring tax.** Two files (`src/world/terrain.js` and
132
+ `public/game/world/terrain.js`) must stay in sync. Same problem as
133
+ the existing two-copy map.js. Fix is the same: consolidate when the
134
+ map becomes data-driven from Postgres.
135
+ - **Container placement is bound to the family layout.** Moving the
136
+ container to a different size (3-wide, 5-wide, etc.) means
137
+ re-speccing the family AND regenerating its art. We accepted this in
138
+ exchange for the family pipeline producing coherent multi-panel art.
139
+ - **Per-cell autotile lookup at draw time.** `drawMap()` runs once per
140
+ scene init, not per frame, so the cost is trivial in V1. If the
141
+ world becomes large or partially streamed in the future, pre-baking
142
+ the lookups into a tile-index grid is a clean optimization.
143
+ - **`fallbackTile` is a deliberate visual fib.** Until a family
144
+ generates, the renderer paints the same single PNG at every cell of
145
+ that terrain — no autotile boundaries appear. This is correct
146
+ behavior (Phase D ships before assets), but it means a partial
147
+ autotile rollout looks half-finished. Acceptable.
148
+
149
+ ### What this does not change
150
+
151
+ - The server's movement validation in `WorldRoom.js` already calls
152
+ `isBlocked()` from `src/world/map.js`; that function now reads
153
+ `BLOCKING_TERRAINS` instead of `BLOCKING_TILES`. Same shape,
154
+ different source.
155
+ - Vendor placement, dialog, and interact semantics are unchanged. The
156
+ vendor stands at (13, 9) — same cell as before, now typed as
157
+ `CONTAINER_PANEL_DOOR` instead of the old `container_door` tile id.
158
+ - The cost ledger ($80 hard stop) and the rest of the art-pipeline
159
+ rules from ADR 0008 + 0009 are unchanged.
160
+ - Per-tile families and autotile families coexist with legacy per-tile
161
+ vocabulary in `art/template/vocabulary.json` — `build_tilesheet.py`
162
+ emits one unified manifest that covers all three.
163
+
164
+ ## What this does not commit to
165
+
166
+ - **No procedural-fallback shrinkage.** The procedural fallbacks in
167
+ `tilePalette.js` are the safety net when neither the family nor the
168
+ legacy PNG loaded. We could ship without them once the families and
169
+ the fallbacks are stable, but for V1 they cost nothing and make the
170
+ world resilient.
171
+ - **No `wet_sand` regret.** If the `sand_on_sea` boundary tiles end up
172
+ too uniform (every tide cell looking identical), we can re-introduce
173
+ wet_sand as a dedicated terrain — it's a one-line addition to the
174
+ enum. Not blocking V1.