@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,782 @@
1
+ #!/usr/bin/env node
2
+ // Builder start β€” what can I claim right now?
3
+ //
4
+ // Usage:
5
+ // node scripts/gds/start.js [--version V1|PMS-V1] [--discipline engineer|artist|ideator|unclassified] [--all-disciplines] [--fit autonomous|parallel] [--limit N] [--full] [--widget] [--json]
6
+ //
7
+ // --fit narrows the claimable list to what the autonomous overnight
8
+ // session-runner (#358) may pick up:
9
+ // autonomous β€” overnight-safe + manual_degree<=2 + unblocked (canonical
10
+ // tasks_session_fit 'autonomous' mode). The runner takes
11
+ // claimable[0] as the next task by priority.
12
+ // parallel β€” autonomous AND tasks.parallel_safe = true (safe to run
13
+ // alongside other tasks). The runner fills its parallel slots
14
+ // from the top of this list.
15
+ //
16
+ // Output is a deterministic "card" (task 1273): one quiet status line, the
17
+ // builder's identity, their holdings, a clean claimable table (# / Version /
18
+ // Type / Reward / Est. / What it is), and a next-step line β€” identical every session.
19
+ // --widget : emit the card as self-contained HTML on stdout (private warnings
20
+ // to stderr) for the app's widget renderer (show_widget). This is
21
+ // the surface the /builder-start skill renders β€” BUT it honours the
22
+ // builder's per-builder "render widgets" knob (task 1279): if that
23
+ // builder has widgets off, --widget degrades to the markdown card so
24
+ // no HTML is ever emitted/relayed. Default ON. The skill detects
25
+ // which form it got (HTML starts with '<') and renders accordingly.
26
+ // (default): the markdown form of the same card β€” the fallback when the
27
+ // client can't draw widgets (raw terminal, cron, other tools).
28
+ // --full : add the detailed ambient widgets + context pack (markdown).
29
+ // --json : unchanged machine interface the autonomous runner reads.
30
+ //
31
+ // --discipline filters the claimable list by builder interest area
32
+ // (orthogonal to kind). engineer = code/infra/gameplay/bugs; artist =
33
+ // pixel art / sprites / the art pipeline; ideator = scoping/research/
34
+ // docs/narrative/lore.
35
+ //
36
+ // DISCIPLINE ROUTING (V3.R81 / #299): by default β€” when no explicit
37
+ // --discipline is passed β€” the claimable list is narrowed to the builder's
38
+ // preferred_disciplines (builders.preferred_disciplines, set via
39
+ // /me/disciplines per migrations 027 + 086). An artist shouldn't be shown
40
+ // only engineer tasks. Two escape hatches:
41
+ // --all-disciplines β€” ignore preferences, show every lane.
42
+ // --discipline X β€” explicit single-lane filter (overrides preferences).
43
+ // A builder with no stated preference (empty preferred_disciplines) sees
44
+ // everything by default β€” there is no lane to narrow to.
45
+ //
46
+ // Below the main list, a "You might enjoy" section surfaces up to 3 claimable
47
+ // tasks OUTSIDE the builder's disciplines, ranked by relevance. The ranking
48
+ // mirrors db.rankCrossDisciplineRecommendations (the canonical server-side
49
+ // home for this logic β€” kept in sync deliberately; start.js is a pure HTTP
50
+ // client and cannot import the server db module).
51
+ //
52
+ //
53
+ // Returns JSON if --json is passed (for the slash command to parse cleanly).
54
+
55
+ const { cliClient, requireSession, fmtUsd, printOnboardingNudge, printCostWarning, printNeedsNudge } = require('./cli-lib');
56
+ const { contextPack, formatContextPackCompact } = require('./context-pack');
57
+
58
+ // task 1284: the card shows only the top N claimable rows. The table is the bulk
59
+ // of the widget HTML the model relays verbatim, so fewer rows = fewer tokens +
60
+ // faster render; the true total sits in the header and a "N more β€” show all"
61
+ // affordance covers the rest. --json is unchanged (full list for the runner).
62
+ const CARD_ROWS = 5;
63
+
64
+ // ---------- header widget helpers ----------
65
+
66
+ // Compact ascii progress bar. Width 10. Filled = β–ˆ, empty = β–‘.
67
+ function progressBar(percent, width = 10) {
68
+ const p = Math.max(0, Math.min(100, Number(percent) || 0));
69
+ const filled = Math.round((p / 100) * width);
70
+ return 'β–ˆ'.repeat(filled) + 'β–‘'.repeat(width - filled);
71
+ }
72
+
73
+ function formatVersionsRow(progress) {
74
+ if (!Array.isArray(progress) || progress.length === 0) return null;
75
+ // Only show versions currently building (status==='building').
76
+ // Fall back to non-shipped if none are flagged building.
77
+ let active = progress.filter((v) => v.status === 'building');
78
+ if (active.length === 0) active = progress.filter((v) => v.status !== 'shipped');
79
+ if (active.length === 0) return null;
80
+ const parts = active.map((v) => `${v.version_id} ${progressBar(v.percent_complete)} ${v.percent_complete}%`);
81
+ return parts.join(' Β· ');
82
+ }
83
+
84
+ function formatCostRow(cost) {
85
+ if (!cost || typeof cost !== 'object') return null;
86
+ const spent = Number(cost.total_usd) || 0;
87
+ const credits = Number(cost.total_value_credits) || 0;
88
+ // No verdict. The old line computed `credits >= spent` and printed
89
+ // "value > cost βœ“" β€” comparing unitless reward drachmae against USD, so it
90
+ // was green by unit mismatch, not by economics (spike #482 audit, F2). It was
91
+ // also resting on an incomplete cost figure: cost_log captures almost no LLM
92
+ // spend (audit F1; api category was $0.60). Until spend is captured honestly
93
+ // (#483/#486) and given a real value basis, we show the two ledgers plainly
94
+ // and labelled for what they are β€” logged spend vs reward credits β€” and let
95
+ // them stand without a manufactured βœ“/βœ—.
96
+ return `${fmtUsd(spent)} logged spend Β· ${credits}c reward shipped`;
97
+ }
98
+
99
+ function formatRecentRow({ recentShipped, inboxCount, blockerCount }) {
100
+ const bits = [];
101
+ // "1 ship in last 24h" β€” recent_shipped returns tasks shipped within
102
+ // a recent window; we re-filter to strictly <24h for the header.
103
+ if (Array.isArray(recentShipped)) {
104
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
105
+ const last24 = recentShipped.filter((t) => {
106
+ const ts = t.shipped_at ? Date.parse(t.shipped_at) : 0;
107
+ return ts && ts >= cutoff;
108
+ }).length;
109
+ bits.push(`${last24} ship${last24 === 1 ? '' : 's'} in last 24h`);
110
+ } else {
111
+ bits.push('ships: N/A');
112
+ }
113
+ bits.push(inboxCount == null ? 'ideas: N/A' : `${inboxCount} idea${inboxCount === 1 ? '' : 's'} in inbox`);
114
+ bits.push(blockerCount == null ? 'blockers: N/A' : `${blockerCount} open blocker${blockerCount === 1 ? '' : 's'}`);
115
+ return bits.join(' Β· ');
116
+ }
117
+
118
+ // ---------- card helpers (task 1273) ----------
119
+ // The default /builder-start view is a single deterministic "card" rendered as
120
+ // markdown: a quiet status line, identity, holdings, a clean claimable table,
121
+ // and a next-step line. Same shape every session β€” the skill relays this stdout
122
+ // verbatim, which is what removes the per-session re-summarizing drift.
123
+
124
+ // Shared status selection β€” single source of truth for what the quiet status
125
+ // line shows, so the markdown line and the widget render the same thing.
126
+ // Surfaces the versions with real momentum: drop not-yet-started (0%) ones,
127
+ // lead with the most-progressed, so a dormant planning version doesn't crowd
128
+ // out the one actually being built.
129
+ function statusParts({ progress, recentShipped, inboxCount, blockerCount }) {
130
+ let versions = [];
131
+ if (Array.isArray(progress) && progress.length) {
132
+ let active = progress.filter((v) => v.status === 'building');
133
+ if (active.length === 0) active = progress.filter((v) => v.status !== 'shipped');
134
+ versions = active
135
+ .filter((v) => Number(v.percent_complete) > 0)
136
+ .sort((a, b) => Number(b.percent_complete) - Number(a.percent_complete))
137
+ .slice(0, 2)
138
+ .map((v) => ({ id: v.version_id, pct: Number(v.percent_complete) }));
139
+ }
140
+ let ships24 = null;
141
+ if (Array.isArray(recentShipped)) {
142
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
143
+ ships24 = recentShipped.filter((t) => t.shipped_at && Date.parse(t.shipped_at) >= cutoff).length;
144
+ }
145
+ return { versions, ships24, ideas: inboxCount, blockers: blockerCount };
146
+ }
147
+
148
+ // One muted line of ambient status (markdown). Italic so the feed renders it
149
+ // quiet. null if empty.
150
+ function quietStatusLine(header) {
151
+ const { versions, ships24, ideas, blockers } = statusParts(header);
152
+ const parts = [];
153
+ for (const v of versions) parts.push(`${v.id} ${progressBar(v.pct, 8)} ${v.pct}%`);
154
+ if (ships24 != null) parts.push(`${ships24} ship${ships24 === 1 ? '' : 's'}/24h`);
155
+ if (ideas != null) parts.push(`${ideas} idea${ideas === 1 ? '' : 's'} in inbox`);
156
+ if (blockers != null) parts.push(`${blockers} open blocker${blockers === 1 ? '' : 's'}`);
157
+ if (parts.length === 0) return null;
158
+ return `_${parts.join(' Β· ')}_`;
159
+ }
160
+
161
+ // Calibrated estimate, compact: ~8m / ~2h / ~1.5h.
162
+ function estimateShort(t) {
163
+ const m = t.est_minutes_calibrated != null ? t.est_minutes_calibrated : t.est_minutes;
164
+ if (m == null) return 'β€”';
165
+ if (m < 60) return `~${m}m`;
166
+ const h = m / 60;
167
+ return Number.isInteger(h) ? `~${h}h` : `~${h.toFixed(1)}h`;
168
+ }
169
+
170
+ function clip(s, n) {
171
+ s = String(s == null ? '' : s).replace(/\s+/g, ' ').trim();
172
+ return s.length > n ? s.slice(0, n - 1) + '…' : s;
173
+ }
174
+
175
+ // Escape pipes so a title can't break the markdown table.
176
+ function cell(s) {
177
+ return String(s == null ? '' : s).replace(/\|/g, '\\|');
178
+ }
179
+
180
+ // Per-column values, shared by the markdown table and the widget. Version
181
+ // (V2 / GDS-V4) is its own column; Type is the work lane (Engineer / Artist /
182
+ // Ideator), its own column rather than baked into the title.
183
+ function disciplineLabel(t) {
184
+ const d = t.discipline;
185
+ return d && d !== 'unclassified' ? d.charAt(0).toUpperCase() + d.slice(1) : '';
186
+ }
187
+ // Per-lane accent β€” the OTB palette (sea / terracotta / olive); mid-ramp hexes
188
+ // that read in both light and dark. Colours the Type column so the work lane
189
+ // reads at a glance (task 1273 follow-up: "spice up the view").
190
+ function disciplineColor(d) {
191
+ if (d === 'engineer') return '#1D9E75'; // sea-teal
192
+ if (d === 'artist') return '#D85A30'; // terracotta
193
+ if (d === 'ideator') return '#639922'; // olive
194
+ return '#888780'; // unclassified β€” neutral gray
195
+ }
196
+ function whatItIs(t) {
197
+ return clip(t.title, 64);
198
+ }
199
+
200
+ // The claimable table β€” # / Version / Type / Reward / Est. / What it is.
201
+ // Ids are emitted as hall links (renders as a clean #N) β€” a bare "#NNN" in a
202
+ // relayed chat message autolinks to GitHub and 404s (CLAUDE.md ref rule).
203
+ const HALL_TASK = 'https://amazonprimea.com/builders#/task/';
204
+ function claimableTable(rows) {
205
+ const out = [
206
+ '| # | Version | Type | Reward | Est. | What it is |',
207
+ '|---|---|---|---|---|---|',
208
+ ];
209
+ for (const t of rows) {
210
+ out.push(`| [#${t.id}](${HALL_TASK}${t.id}) | ${cell(t.version_id || '?')} | ${cell(disciplineLabel(t) || 'β€”')} | ${t.credits_reward ?? 0}c | ${estimateShort(t)} | ${cell(whatItIs(t))} |`);
211
+ }
212
+ return out.join('\n');
213
+ }
214
+
215
+ // ---------- widget renderer (task 1273) ----------
216
+ // `--widget` emits this self-contained HTML on stdout; the skill pipes it
217
+ // straight to the app's widget renderer (show_widget). Script-owned markup =
218
+ // the same card every time, app-native. Falls back to the markdown card when
219
+ // the client can't draw widgets. Design system: flat, 0.5px borders, CSS
220
+ // theme vars (light/dark), Tabler icons, no emoji.
221
+ const hesc = (s) => String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
222
+ const jsq = (s) => String(s == null ? '' : s).replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, ' ');
223
+
224
+ function miniBar(pct) {
225
+ // Fill tinted OTB sea-teal so the status line carries a little of the brand.
226
+ // Class-based (task 1279 efficiency pass): the .bs-* rules live in WIDGET_STYLE,
227
+ // so this markup is only meaningful inside the widget renderWidget emits.
228
+ return `<span class="bs-bar"><span class="bs-barfill" style="width:${pct}%;"></span></span>`;
229
+ }
230
+
231
+ // Run console.log-based helpers (printCostWarning/printOnboardingNudge) without
232
+ // polluting stdout (which must be pure HTML in --widget mode); return the lines.
233
+ function captureLog(fn) {
234
+ const orig = console.log;
235
+ const lines = [];
236
+ console.log = (...a) => lines.push(a.join(' '));
237
+ try { fn(); } finally { console.log = orig; }
238
+ return lines;
239
+ }
240
+
241
+ // task 1282: reinforce the relay contract IN-BAND, not just in the skill. The
242
+ // rule β€” render/print the card verbatim, then stop; don't rebuild it into prose
243
+ // + tables + a recommendation β€” used to live ONLY in SKILL.md (advisory), so a
244
+ // model in old habits (or a stale checkout's old skill) reverted to hand-built
245
+ // tables. This emits a one-line `[otb-card]` directive on STDERR (stdout stays
246
+ // pure HTML/markdown, so the show_widget pipe + the skill's first-char branch
247
+ // are untouched). The skill treats `[otb-card]` stderr lines as instructions
248
+ // for itself and never relays them to the user. Mirrors the ship card.
249
+ const CARD_DIRECTIVE = {
250
+ html: '[otb-card] stdout is the finished /builder-start card (HTML). Render it verbatim via show_widget, then stop β€” no extra tables, recommendation, nudge, or recap.',
251
+ markdown: '[otb-card] stdout is the finished /builder-start card (markdown). Output it verbatim as your reply, then stop β€” no rebuilt table, recommendation, nudge, or recap.',
252
+ };
253
+ function emitCardDirective(form) {
254
+ process.stderr.write(CARD_DIRECTIVE[form] + '\n');
255
+ }
256
+
257
+ // task 1279 efficiency pass: the /builder-start widget used to inline a full
258
+ // style="…" on every one of its ~30+ elements β€” the 7Γ—N claimable grid was the
259
+ // bulk β€” making the HTML the agent must relay verbatim ~18.7KB. Hoisting the
260
+ // repeated rules into one class block (the pattern the ship card already uses)
261
+ // cuts that markup substantially with byte-identical rendering. Classes are
262
+ // `.bs-*` (builder-start) so they can't collide with the ship card's `.cc-*`.
263
+ const WIDGET_STYLE = `<style>
264
+ .bs-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}
265
+ .bs-card{background:var(--color-background-primary);border:0.5px solid var(--color-border-tertiary);border-radius:var(--border-radius-lg);padding:1rem 1.25rem;font-family:var(--font-sans);}
266
+ .bs-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
267
+ .bs-brand{display:inline-flex;align-items:center;gap:8px;}
268
+ .bs-title{font-size:16px;font-weight:500;}
269
+ .bs-title i{font-size:16px;vertical-align:-2px;margin-right:6px;color:#D85A30;}
270
+ .bs-meta{font-size:13px;color:var(--color-text-secondary);}
271
+ .bs-status{font-size:13px;color:var(--color-text-secondary);margin-top:8px;display:flex;flex-wrap:wrap;gap:4px 12px;align-items:center;}
272
+ .bs-dot{color:var(--color-text-tertiary);}
273
+ .bs-bar{display:inline-block;width:34px;height:5px;border-radius:3px;background:var(--color-border-tertiary);overflow:hidden;vertical-align:middle;}
274
+ .bs-barfill{display:block;height:100%;background:#1D9E75;}
275
+ .bs-line{font-size:13px;color:var(--color-text-secondary);margin-top:8px;}
276
+ .bs-line i{font-size:14px;vertical-align:-2px;margin-right:4px;}
277
+ .bs-holditem{margin-top:4px;padding-left:18px;}
278
+ .bs-link{color:var(--color-text-secondary);}
279
+ .bs-menuh{font-size:13px;color:var(--color-text-primary);margin-top:14px;margin-bottom:2px;font-weight:500;}
280
+ .bs-table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:13px;margin-top:4px;}
281
+ .bs-thead{text-align:left;color:var(--color-text-tertiary);font-size:12px;}
282
+ .bs-th{padding:0 6px 4px;font-weight:400;}
283
+ .bs-tr{cursor:pointer;}
284
+ .bs-td{padding:7px 6px;border-top:0.5px solid var(--color-border-tertiary);}
285
+ .bs-id{color:var(--color-text-secondary);font-family:var(--font-mono);font-size:12px;}
286
+ .bs-nowrap{white-space:nowrap;}
287
+ .bs-ellip{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
288
+ .bs-ellip-sub{color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
289
+ .bs-sub{color:var(--color-text-secondary);}
290
+ .bs-lane{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:middle;}
291
+ .bs-foot{font-size:13px;color:var(--color-text-tertiary);margin-top:12px;}
292
+ </style>`;
293
+
294
+ function renderWidget({ builder, claims, claimable, total, streak, recommendations, header, routingByPreference, preferred, filters, readyToClose }) {
295
+ const b = builder || {};
296
+ // Streak badge β€” warm amber, the one bold pop of colour + the motivational
297
+ // stat. Shown only on an active (>0) streak; tooltip carries the record.
298
+ // (Singular element β€” left inline; the savings live in the repeated grid.)
299
+ const streakBadge = (streak && Number(streak.current) > 0)
300
+ ? `<span title="Longest streak: ${Number(streak.longest) || 0} days" style="display:inline-flex;align-items:center;gap:4px;background:var(--color-background-warning);color:var(--color-text-warning);font-size:12px;font-weight:500;padding:2px 8px;border-radius:var(--border-radius-md);"><i class="ti ti-flame" aria-hidden="true" style="font-size:13px;"></i>${Number(streak.current)}-day streak</span>`
301
+ : '';
302
+ const rank = b.rank ? b.rank[0].toUpperCase() + b.rank.slice(1) : 'Thetes';
303
+ const disc = (b.preferred_disciplines && b.preferred_disciplines.length) ? b.preferred_disciplines.join(' + ') : 'all disciplines';
304
+ const credits = Number(b.total_credits || 0).toLocaleString();
305
+ const TH = (label) => `<th class="bs-th">${label}</th>`;
306
+ const TD = (inner, cls = '') => `<td class="bs-td${cls ? ' ' + cls : ''}">${inner}</td>`;
307
+
308
+ // status line
309
+ const { versions, ships24, ideas, blockers } = statusParts(header);
310
+ const sBits = [];
311
+ for (const v of versions) sBits.push(`${hesc(v.id)} ${miniBar(v.pct)} ${v.pct}%`);
312
+ if (ships24 != null) sBits.push(`${ships24} ship${ships24 === 1 ? '' : 's'}/24h`);
313
+ if (ideas != null) sBits.push(`${ideas} idea${ideas === 1 ? '' : 's'}`);
314
+ if (blockers != null) sBits.push(`${blockers} blocker${blockers === 1 ? '' : 's'}`);
315
+ const statusRow = sBits.length
316
+ ? `<div class="bs-status">${sBits.join('<span class="bs-dot">Β·</span>')}</div>`
317
+ : '';
318
+
319
+ // holdings β€” each held task gets quick actions off it (ship / release /
320
+ // open). Parallel sessions under one builder are normal, so this informs.
321
+ const hallUrl = (id) => `https://amazonprimea.com/builders#/task/${encodeURIComponent(id)}`;
322
+ const dot = '<span class="bs-dot"> Β· </span>';
323
+ const act = (label, msg) => `<a href="#" onclick="event.preventDefault();sendPrompt('${jsq(msg)}')" class="bs-link">${label} β†—</a>`;
324
+ const actionsFor = (c) => `${act('Ship', 'Ship task ' + c.task_id)}${dot}${act('Release', 'Release task ' + c.task_id)}${dot}<a href="${hesc(hallUrl(c.task_id))}" class="bs-link">Open β†—</a>`;
325
+ let holdings = '';
326
+ if (claims.length === 1) {
327
+ const c = claims[0];
328
+ holdings = `<div class="bs-line"><i class="ti ti-bookmark" aria-hidden="true"></i>Holding #${hesc(c.task_id)} β€” ${hesc(clip(c.title, 44))}${dot}${actionsFor(c)}</div>`;
329
+ } else if (claims.length > 1) {
330
+ const items = claims.map((c) => `<div class="bs-holditem">#${hesc(c.task_id)} β€” ${hesc(clip(c.title, 38))}${dot}${actionsFor(c)}</div>`).join('');
331
+ holdings = `<div class="bs-line"><i class="ti ti-bookmark" aria-hidden="true"></i>Holding ${claims.length} claims (parallel sessions OK):${items}</div>`;
332
+ }
333
+
334
+ // version-close banner (rare, Archon action)
335
+ const closeBanner = (readyToClose || []).map((s) =>
336
+ `<div class="bs-line"><i class="ti ti-flag" aria-hidden="true"></i>${hesc(s.versionId)} looks ready to close (${s.criteriaSatisfied}/${s.criteriaTotal} criteria, ${s.percentComplete}%) β€” <a href="#" onclick="event.preventDefault();sendPrompt('${jsq('/builder-version-close ' + s.versionId)}')" class="bs-link">close it β†—</a></div>`
337
+ ).join('');
338
+
339
+ // menu header note
340
+ const matched = routingByPreference ? ` matched to ${hesc(preferred.join(' + '))}` : '';
341
+ const fBits = [
342
+ filters.version && `in ${filters.version}`,
343
+ filters.discipline && `discipline=${filters.discipline}`,
344
+ filters.fit && `fit=${filters.fit}`,
345
+ ].filter(Boolean);
346
+ const fNote = fBits.length ? ` (${hesc(fBits.join(', '))})` : '';
347
+
348
+ // rows β€” click to claim. Columns: # / Version / Type / Reward /
349
+ // Est. / What it is (the work lane is its own column, not baked into the title).
350
+ const rows = claimable.map((t) => {
351
+ const claimMsg = jsq(`Claim task ${t.id}`);
352
+ const titleAttr = hesc(`Claim #${t.id}: ${t.title || ''}`);
353
+ const d = t.discipline;
354
+ const laneDot = (d && d !== 'unclassified')
355
+ ? `<span class="bs-lane" style="background:${disciplineColor(d)};"></span>`
356
+ : '';
357
+ return `<tr class="bs-tr" role="button" tabindex="0" title="${titleAttr}" onclick="sendPrompt('${claimMsg}')" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();sendPrompt('${claimMsg}')}">`
358
+ + TD(`#${hesc(t.id)}`, 'bs-id')
359
+ + TD(hesc(t.version_id || '?'), 'bs-nowrap')
360
+ + TD(`${laneDot}${hesc(disciplineLabel(t) || 'β€”')}`, 'bs-ellip-sub')
361
+ + TD(hesc((t.credits_reward ?? 0) + 'c'))
362
+ + TD(hesc(estimateShort(t)), 'bs-sub')
363
+ + TD(hesc(t.title || ''), 'bs-ellip')
364
+ + `</tr>`;
365
+ }).join('');
366
+
367
+ const menu = claimable.length
368
+ ? `<table class="bs-table">
369
+ <colgroup><col style="width:44px;"><col style="width:52px;"><col style="width:68px;"><col style="width:48px;"><col style="width:44px;"><col></colgroup>
370
+ <thead><tr class="bs-thead">${TH('#')}${TH('Version')}${TH('Type')}${TH('Reward')}${TH('Est.')}${TH('What it is')}</tr></thead>
371
+ <tbody>${rows}</tbody>
372
+ </table>`
373
+ : `<div class="bs-line">Nothing claimable right now β€” everything is in flight, blocked, or shipped. <a href="#" onclick="event.preventDefault();sendPrompt('Run blocker-review')" class="bs-link">See what's stuck β†—</a></div>`;
374
+
375
+ // footer actions: a "more" link when the list was capped, then the
376
+ // cross-lane pointer. (The old "just exploring" link was dropped β€” not
377
+ // picking is already "not claiming"; task 1273 follow-up.)
378
+ const moreCount = Math.max(0, (total || claimable.length) - claimable.length);
379
+ const moreLink = moreCount > 0
380
+ ? ` Β· <a href="#" onclick="event.preventDefault();sendPrompt('${jsq('Show me all ' + (total || '') + ' claimable tasks, not just the top ' + claimable.length)}')" class="bs-link">${moreCount} more β€” show all β†—</a>`
381
+ : '';
382
+ let crossLane = '';
383
+ if (recommendations.length > 0) {
384
+ const ids = recommendations.map((t) => '#' + t.id).join(', ');
385
+ crossLane = ` Β· <a href="#" onclick="event.preventDefault();sendPrompt('${jsq('Show me the tasks outside my disciplines: ' + ids)}')" class="bs-link">Outside your lanes: ${hesc(ids)} β†—</a>`;
386
+ } else if (routingByPreference) {
387
+ crossLane = ` Β· <a href="#" onclick="event.preventDefault();sendPrompt('Show me every lane, not just mine')" class="bs-link">Show all lanes β†—</a>`;
388
+ }
389
+
390
+ const summary = `builder-start: ${claimable.length} task${claimable.length === 1 ? '' : 's'} you can claim now, plus your current build status. Click a task to claim it.`;
391
+ return `${WIDGET_STYLE}
392
+ <h2 class="bs-sr">${hesc(summary)}</h2>
393
+ <div class="bs-card">
394
+ <div class="bs-head">
395
+ <span class="bs-brand"><span class="bs-title"><i class="ti ti-player-play" aria-hidden="true"></i>builder-start</span>${streakBadge}</span>
396
+ <span class="bs-meta">${hesc(b.github_login)} Β· ${hesc(rank)} Β· ${hesc(credits)} credits Β· ${hesc(disc)}</span>
397
+ </div>
398
+ ${statusRow}
399
+ ${holdings}
400
+ ${closeBanner}
401
+ <div class="bs-menuh">Claim one to start β€” ${total || claimable.length} ready for you right now${matched}${fNote}</div>
402
+ ${menu}
403
+ <div class="bs-foot">Click a task to claim it${moreLink}${crossLane}</div>
404
+ </div>`;
405
+ }
406
+
407
+ // Cross-discipline recommendations β€” mirror of
408
+ // db.rankCrossDisciplineRecommendations (src/bongos/db.js). Given the full
409
+ // claimable list and the builder's preferred_disciplines, return up to `limit`
410
+ // tasks whose discipline is OUTSIDE the builder's preferences, ranked:
411
+ // priority DESC, credits/min DESC, est_minutes ASC, id ASC.
412
+ // 'unclassified' tasks are excluded (un-triaged, not a real lane). Empty
413
+ // preferences β†’ [] (everything is already in the main list; nothing outside).
414
+ function rankCrossDisciplineRecommendations(claimable, preferredDisciplines, limit = 3) {
415
+ const rows = Array.isArray(claimable) ? claimable : [];
416
+ const prefs = Array.isArray(preferredDisciplines) ? preferredDisciplines : [];
417
+ if (prefs.length === 0) return [];
418
+ const prefSet = new Set(prefs);
419
+ const cpm = (t) => {
420
+ const credits = Number(t.credits_reward) || 0;
421
+ const mins = Number(t.est_minutes_calibrated ?? t.est_minutes) || 0;
422
+ return mins > 0 ? credits / mins : 0;
423
+ };
424
+ const outside = rows.filter(
425
+ (t) => t.discipline && t.discipline !== 'unclassified' && !prefSet.has(t.discipline)
426
+ );
427
+ outside.sort((a, b) => {
428
+ const pa = Number(a.priority) || 0;
429
+ const pb = Number(b.priority) || 0;
430
+ if (pb !== pa) return pb - pa;
431
+ const ca = cpm(a);
432
+ const cb = cpm(b);
433
+ if (cb !== ca) return cb - ca;
434
+ const ma = Number(a.est_minutes_calibrated ?? a.est_minutes) || Infinity;
435
+ const mb = Number(b.est_minutes_calibrated ?? b.est_minutes) || Infinity;
436
+ if (ma !== mb) return ma - mb;
437
+ return (Number(a.id) || 0) - (Number(b.id) || 0);
438
+ });
439
+ return outside.slice(0, Math.max(0, limit));
440
+ }
441
+
442
+ (async () => {
443
+ await requireSession();
444
+ const args = process.argv.slice(2);
445
+ const json = args.includes('--json');
446
+ const versionIdx = args.indexOf('--version');
447
+ const version = versionIdx >= 0 ? args[versionIdx + 1] : null;
448
+ const disciplineIdx = args.indexOf('--discipline');
449
+ const discipline = disciplineIdx >= 0 ? args[disciplineIdx + 1] : null;
450
+ const allDisciplines = args.includes('--all-disciplines');
451
+ const fitIdx = args.indexOf('--fit');
452
+ const fit = fitIdx >= 0 ? args[fitIdx + 1] : null;
453
+ const limitIdx = args.indexOf('--limit');
454
+ const limit = limitIdx >= 0 ? Number(args[limitIdx + 1]) : 10;
455
+ // --full restores the detailed ambient widgets + context pack that the lean
456
+ // card omits (task 1273). Default is the lean card.
457
+ const full = args.includes('--full');
458
+ // --widget emits the card as self-contained HTML on stdout for the app's
459
+ // widget renderer (task 1273). Private warnings go to stderr so stdout stays
460
+ // pure HTML the skill can pipe verbatim.
461
+ const widget = args.includes('--widget');
462
+ // --hook (task 1288): machine envelope for the builder-start-card hook β€” both
463
+ // card forms (HTML + markdown) + the private warnings from a single fetch, so
464
+ // the hook can hand the model a finished card it only has to render. Not a
465
+ // user surface; stdout is the JSON envelope only.
466
+ const hookMode = args.includes('--hook');
467
+
468
+ // Server-side filtering: only push an explicit --discipline (single-lane
469
+ // override). Preference-based routing is done client-side below, because
470
+ // (a) a builder can prefer BOTH disciplines and the server filter takes a
471
+ // single value, and (b) the "You might enjoy" section needs the full
472
+ // claimable set (across all disciplines) to compute recommendations from.
473
+ const claimableQuery = {};
474
+ if (version) claimableQuery.version = version;
475
+ if (discipline) claimableQuery.discipline = discipline;
476
+ if (fit) claimableQuery.fit = fit;
477
+
478
+ // Fire everything in parallel. Header widgets are non-critical β€” if any
479
+ // endpoint fails, that widget degrades to "N/A" rather than killing
480
+ // /builder-start.
481
+ const api = await cliClient();
482
+ const [me, r, closeRes, progressRes, costRes, recentRes, inboxRes, blockersRes] = await Promise.all([
483
+ api.me.getMe(),
484
+ api.tasks.getTasksClaimable({ query: claimableQuery }),
485
+ api.versions.getVersionsCloseSuggestions(),
486
+ api.public.getPublicProgress(),
487
+ api.public.getPublicCostSummary(),
488
+ api.public.getPublicRecentShipped(),
489
+ api.inbox.getInbox({ query: { status: 'open' } }),
490
+ api.blockers.getBlockers(),
491
+ ]);
492
+ // #766: the primer-read gate on the claimable endpoint was removed, so a
493
+ // newcomer no longer gets a 403 stage_required here. A generic stage_required
494
+ // (any future onboarding gate) still renders cleanly rather than crashing.
495
+ if (r.status === 403 && r.data && r.data.error === 'stage_required') {
496
+ console.log('');
497
+ console.log(r.data.what_to_do || `Clear "${r.data.required_stage_label || r.data.required_stage}" before the work queue opens.`);
498
+ console.log('');
499
+ process.exit(0);
500
+ }
501
+ if (!r.ok) {
502
+ console.error(`failed (${r.status}):`, r.data);
503
+ process.exit(1);
504
+ }
505
+
506
+ // Full claimable set as returned by the server (already filtered for
507
+ // touches[] safety, version/fit, and any explicit --discipline).
508
+ const rawClaimable = r.data.claimable || [];
509
+
510
+ // Discipline routing (V3.R81 / #299). preferred_disciplines lives on the
511
+ // builder row (migration 027), surfaced via /api/gds/me.
512
+ const preferred = (me.ok && Array.isArray(me.data?.builder?.preferred_disciplines))
513
+ ? me.data.builder.preferred_disciplines
514
+ : [];
515
+ // Apply preference narrowing unless the builder explicitly opted out
516
+ // (--all-disciplines), explicitly chose a single lane (--discipline X,
517
+ // already applied server-side), or stated no preference.
518
+ const routingByPreference = !allDisciplines && !discipline && preferred.length > 0;
519
+ const filtered = routingByPreference
520
+ ? rawClaimable.filter((t) => preferred.includes(t.discipline))
521
+ : rawClaimable;
522
+ const claimable = filtered.slice(0, limit);
523
+
524
+ // "You might enjoy" β€” up to 3 claimable tasks outside the builder's lanes.
525
+ // Computed from the FULL set so it can reach across disciplines. Suppressed
526
+ // when an explicit single-lane --discipline filter is in play (the builder
527
+ // asked to see exactly one lane) β€” but shown for --all-disciplines and the
528
+ // default preference-routed view.
529
+ const recommendations = discipline
530
+ ? []
531
+ : rankCrossDisciplineRecommendations(rawClaimable, preferred, 3);
532
+
533
+ // Close-suggestions endpoint is non-critical; if it fails (e.g. older
534
+ // server without the route), surface no banner rather than blowing up.
535
+ const closeSuggestions = closeRes.ok && Array.isArray(closeRes.data?.suggestions)
536
+ ? closeRes.data.suggestions
537
+ : [];
538
+ const readyToClose = closeSuggestions.filter((s) => s.ready);
539
+
540
+ // Header widget data (each independently optional).
541
+ const progress = progressRes.ok && Array.isArray(progressRes.data?.progress) ? progressRes.data.progress : null;
542
+ const cost = costRes.ok ? costRes.data : null;
543
+ const recentShipped = recentRes.ok && Array.isArray(recentRes.data?.tasks) ? recentRes.data.tasks : null;
544
+ const inboxCount = inboxRes.ok && Array.isArray(inboxRes.data?.ideas)
545
+ ? inboxRes.data.ideas.length
546
+ : (inboxRes.ok && typeof inboxRes.data?.count === 'number' ? inboxRes.data.count : null);
547
+ const blockerCount = blockersRes.ok && Array.isArray(blockersRes.data?.blockers)
548
+ ? blockersRes.data.blockers.filter((b) => b.status === 'open' || !b.status).length
549
+ : null;
550
+
551
+ if (json) {
552
+ console.log(JSON.stringify(
553
+ {
554
+ me: me.data,
555
+ claimable,
556
+ recommendations,
557
+ discipline_routing: {
558
+ preferred_disciplines: preferred,
559
+ applied: routingByPreference,
560
+ all_disciplines: allDisciplines,
561
+ explicit_discipline: discipline || null,
562
+ },
563
+ close_suggestions: closeSuggestions,
564
+ header: {
565
+ progress,
566
+ cost,
567
+ recent_shipped: recentShipped,
568
+ inbox_count: inboxCount,
569
+ blocker_count: blockerCount,
570
+ },
571
+ },
572
+ null, 2
573
+ ));
574
+ return;
575
+ }
576
+
577
+ // ---------- widget (HTML for the app renderer) ----------
578
+ // task 1279: the per-builder "render widgets" knob. When a builder turns
579
+ // widgets off, even an explicit --widget request degrades to the markdown card
580
+ // below β€” so no HTML is emitted, read, or re-relayed (a real token saving, not
581
+ // just a visual change). Default ON; /me carries the resolved boolean. Headless
582
+ // /cron callers don't pass --widget at all (no renderer), so they're unaffected.
583
+ const widgetsPref = me.ok ? (me.data?.render?.widgets_enabled !== false) : true;
584
+ if (widget && widgetsPref) {
585
+ const myClaims = me.ok ? (me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : [])) : [];
586
+ // Private warnings (budget / onboarding next-stage) β†’ stderr, so stdout
587
+ // stays pure HTML the skill can pipe straight into show_widget.
588
+ if (me.ok) {
589
+ const warnings = captureLog(() => { printOnboardingNudge(me.data); printCostWarning(me.data); printNeedsNudge(me.data); });
590
+ for (const w of warnings) process.stderr.write(w + '\n');
591
+ }
592
+ emitCardDirective('html');
593
+ process.stdout.write(renderWidget({
594
+ builder: me.ok ? me.data.builder : {},
595
+ claims: myClaims,
596
+ claimable: claimable.slice(0, CARD_ROWS),
597
+ total: filtered.length,
598
+ streak: me.ok ? me.data.streak : null,
599
+ recommendations,
600
+ header: { progress, recentShipped, inboxCount, blockerCount },
601
+ routingByPreference,
602
+ preferred,
603
+ filters: { version, discipline, fit },
604
+ readyToClose,
605
+ }) + '\n');
606
+ return;
607
+ }
608
+
609
+ // ---------- the card (default) ----------
610
+ // task 1288: the markdown card body, lifted into a closure so the --hook
611
+ // envelope can capture it (via captureLog) next to the widget HTML from the
612
+ // single fetch above; the normal markdown path just calls it below. The body
613
+ // is kept VERBATIM (same indentation) so this stays a pure wrap+call with zero
614
+ // change to the shipped card. Closes over the locals computed above. (task
615
+ // 1273: relaying this verbatim is what keeps the card identical every session;
616
+ // `--full` adds the ambient widgets + context pack.)
617
+ const emitMarkdownCard = () => {
618
+ // V3.R13 (#237): one-line "next stage" nudge for newcomers. Silent for
619
+ // graduated builders and anyone past first_ship.
620
+ if (me.ok) printOnboardingNudge(me.data);
621
+ // task 1013 / ADR 0073: flag any input the system needs from the builder
622
+ // (e.g. their own image-generation key once free coverage ends). Silent unless
623
+ // something is in the action_needed state.
624
+ if (me.ok) printNeedsNudge(me.data);
625
+
626
+ // identity line
627
+ if (me.ok) {
628
+ const b = me.data.builder;
629
+ const rankLabel = b.rank ? b.rank.charAt(0).toUpperCase() + b.rank.slice(1) : 'Thetes';
630
+ const discLabel = Array.isArray(b.preferred_disciplines) && b.preferred_disciplines.length
631
+ ? b.preferred_disciplines.join(' + ')
632
+ : 'all disciplines';
633
+ const credits = Number(b.total_credits || 0).toLocaleString();
634
+ console.log(`**builder-start** Β· ${b.github_login} (${rankLabel}) Β· ${credits} credits Β· ${discLabel}`);
635
+ const sk = me.data.streak;
636
+ if (sk && Number(sk.current) > 0) {
637
+ console.log(`πŸ”₯ ${sk.current}-day streak${Number(sk.longest) > Number(sk.current) ? ` Β· longest ${sk.longest}` : ''}`);
638
+ }
639
+ }
640
+
641
+ // ambient status: one quiet line by default; the full widgets + context pack
642
+ // under --full.
643
+ if (full) {
644
+ const rows = [
645
+ formatVersionsRow(progress),
646
+ formatCostRow(cost),
647
+ formatRecentRow({ recentShipped, inboxCount, blockerCount }),
648
+ ].filter(Boolean);
649
+ if (rows.length) console.log(rows.join('\n'));
650
+ // Worktree root (the #1 wrong-path footgun) + API prefix/enums. Also printed
651
+ // at /builder-claim, where it matters most; here it's --full-only detail.
652
+ try {
653
+ console.log('');
654
+ console.log(formatContextPackCompact(contextPack()));
655
+ } catch (_) { /* fail-open */ }
656
+ } else {
657
+ const status = quietStatusLine({ progress, recentShipped, inboxCount, blockerCount });
658
+ if (status) console.log(status);
659
+ }
660
+ console.log('');
661
+
662
+ // V3.R84 (#302), criterion C3: private session-start budget ping. The CLI is
663
+ // the builder's private channel, so the soft-cap (80%) warning / hard-cap
664
+ // (100%) refusal surface here rather than via Discord (a shared mirror).
665
+ if (me.ok) printCostWarning(me.data);
666
+
667
+ // your holdings β€” calm + factual, with quick actions off each held task.
668
+ // Parallel sessions under one builder are normal, so this informs (it does
669
+ // not block β€” feedback_parallel_sessions). Ids are hall links (ref rule).
670
+ if (me.ok) {
671
+ const myClaims = me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : []);
672
+ const heldActions = (id) => ` β†’ ship: \`/builder-ship ${id}\` Β· release: \`/builder-release ${id}\` Β· open: [#${id}](${HALL_TASK}${id})`;
673
+ if (myClaims.length === 1) {
674
+ const c = myClaims[0];
675
+ console.log(`You're holding [#${c.task_id}](${HALL_TASK}${c.task_id}) β€” ${clip(c.title, 56)}`);
676
+ console.log(heldActions(c.task_id));
677
+ console.log('');
678
+ } else if (myClaims.length > 1) {
679
+ console.log(`You're holding ${myClaims.length} claims (parallel sessions OK):`);
680
+ for (const c of myClaims) {
681
+ console.log(` [#${c.task_id}](${HALL_TASK}${c.task_id}) β€” ${clip(c.title, 50)}`);
682
+ console.log(heldActions(c.task_id));
683
+ }
684
+ console.log('');
685
+ }
686
+ }
687
+
688
+ // Version-close gate banner β€” informational; fires rarely (an Archon action)
689
+ // when a building version is >= 80% weighted AND every criterion is satisfied.
690
+ for (const s of readyToClose) {
691
+ console.log(
692
+ `🚦 ${s.versionId} looks ready to close ` +
693
+ `(${s.criteriaSatisfied}/${s.criteriaTotal} criteria, ${s.percentComplete}% weighted; ` +
694
+ `${s.tasksShipped} shipped, ${s.tasksCarryOver} carry-over). Run /builder-version-close ${s.versionId}.`
695
+ );
696
+ console.log('');
697
+ }
698
+
699
+ // ---------- the menu ----------
700
+ const matched = routingByPreference ? ` matched to ${preferred.join(' + ')}` : '';
701
+ const filterBits = [
702
+ version && `in ${version}`,
703
+ discipline && `discipline=${discipline}`,
704
+ fit && `fit=${fit}`,
705
+ ].filter(Boolean);
706
+ const filterNote = filterBits.length ? ` (${filterBits.join(', ')})` : '';
707
+ console.log(`**Claim one to start** β€” ${filtered.length} ready for you right now${matched}${filterNote}:`);
708
+ console.log('');
709
+ if (claimable.length) {
710
+ const cardRows = claimable.slice(0, CARD_ROWS);
711
+ console.log(claimableTable(cardRows));
712
+ const moreN = filtered.length - cardRows.length;
713
+ if (moreN > 0) {
714
+ console.log('');
715
+ console.log(`_…and ${moreN} more β€” say "show all", or run with --limit 30._`);
716
+ }
717
+ } else {
718
+ console.log("_Nothing claimable right now β€” everything is in flight, blocked, or shipped. Run /blocker-review to see what's stuck._");
719
+ }
720
+
721
+ // Cross-discipline pointer (one line) β€” only when preference-routed.
722
+ if (recommendations.length > 0) {
723
+ const ids = recommendations.map((t) => `#${t.id}`).join(', ');
724
+ console.log('');
725
+ console.log(`Outside your lanes: ${ids} β€” say the word to see them, or run with \`--all-disciplines\`.`);
726
+ } else if (routingByPreference) {
727
+ console.log('');
728
+ console.log('_Showing your lanes β€” run with `--all-disciplines` to see every lane._');
729
+ }
730
+
731
+ // ---------- next ----------
732
+ console.log('');
733
+ console.log('β†’ **Tell me a number** to claim it.');
734
+ if (full) {
735
+ console.log('');
736
+ console.log('Commands:');
737
+ console.log(' claim: node scripts/gds/claim.js <task-id> [--worktree NAME]');
738
+ console.log(' ship: node scripts/gds/ship.js <task-id> --notes "..." --summary "..."');
739
+ console.log(' release: node scripts/gds/release.js <task-id>');
740
+ }
741
+ };
742
+
743
+ // --hook (task 1288): a UserPromptSubmit hook can neither render UI, call
744
+ // show_widget, nor detect whether that tool exists β€” only the model can. So
745
+ // the hook runs THIS script and injects the finished card + a one-step
746
+ // directive; the model's only remaining job is to emit it. Emit BOTH forms
747
+ // (+ the private budget/onboarding warnings) from the single fetch above as a
748
+ // machine envelope; stdout carries nothing else.
749
+ if (hookMode) {
750
+ const myClaims = me.ok ? (me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : [])) : [];
751
+ const html = widgetsPref
752
+ ? renderWidget({
753
+ builder: me.ok ? me.data.builder : {},
754
+ claims: myClaims,
755
+ claimable: claimable.slice(0, CARD_ROWS),
756
+ total: filtered.length,
757
+ streak: me.ok ? me.data.streak : null,
758
+ recommendations,
759
+ header: { progress, recentShipped, inboxCount, blockerCount },
760
+ routingByPreference,
761
+ preferred,
762
+ filters: { version, discipline, fit },
763
+ readyToClose,
764
+ })
765
+ : null;
766
+ const markdown = captureLog(emitMarkdownCard).join('\n');
767
+ const warnings = me.ok
768
+ ? captureLog(() => { printOnboardingNudge(me.data); printCostWarning(me.data); printNeedsNudge(me.data); })
769
+ : [];
770
+ process.stdout.write(JSON.stringify({ widgets_enabled: widgetsPref, html, markdown, warnings }) + '\n');
771
+ return;
772
+ }
773
+
774
+ // Markdown card path β€” default invocation, `--full`, or `--widget` with the
775
+ // widgets knob off. The relay directive goes to stderr (task 1282); the card
776
+ // body to stdout.
777
+ emitCardDirective('markdown');
778
+ emitMarkdownCard();
779
+ })().catch((err) => {
780
+ console.error('fatal:', err);
781
+ process.exit(1);
782
+ });