@bongos/core 1.21.175 → 1.21.177

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 (1719) hide show
  1. package/.bongos-core.json +3371 -1636
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +15 -15
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/config/scheduled-routines.json +3 -8
  58. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  59. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +1 -1
  60. package/docs/adr/0093-tranche-2-core-carve-sequence.md +1 -1
  61. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  62. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  63. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  64. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  65. package/docs/adr/README.md +2 -0
  66. package/docs/api/openapi.json +606 -44
  67. package/docs/api-reference.md +25 -12
  68. package/docs/architecture.md +8 -7
  69. package/docs/canonical-permissions.md +4 -4
  70. package/docs/copy-inventory.md +1370 -1411
  71. package/docs/copy-registry.json +2136 -2536
  72. package/docs/design/demonolith-plan.md +6 -6
  73. package/docs/design/modular-architecture/00-research-report.md +1 -1
  74. package/docs/design/project-startup-direction.md +2 -2
  75. package/docs/design/projects-hub-direction-v2.md +1 -1
  76. package/docs/design/reviews/hall-v2/README.md +2 -2
  77. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  78. package/docs/file-map.md +92 -96
  79. package/docs/handoff-template.md +5 -5
  80. package/docs/module-api-changelog.md +7 -3
  81. package/docs/modules-contract.md +8 -7
  82. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  83. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  84. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  85. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  86. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  87. package/docs/onboarding/diagrams/README.md +5 -9
  88. package/docs/onboarding/diagrams/assertions.json +3 -3
  89. package/docs/onboarding/slash-commands.md +2 -2
  90. package/docs/packs/artist.md +4 -4
  91. package/docs/packs/engineer.md +11 -10
  92. package/docs/packs/ideator.md +7 -7
  93. package/docs/page-inventory.json +20 -1
  94. package/docs/page-readings.json +4387 -4603
  95. package/docs/recipes/README.md +1 -1
  96. package/docs/recipes/audit-replay.md +4 -4
  97. package/docs/recipes/autobongos-windows-host.md +6 -6
  98. package/docs/recipes/bongos-cli-release.md +2 -2
  99. package/docs/recipes/claude-design-loop.md +7 -7
  100. package/docs/recipes/core-release-pipeline.md +19 -19
  101. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  102. package/docs/recipes/figma-design-loop.md +6 -6
  103. package/docs/recipes/gds-db-backup.md +9 -9
  104. package/docs/recipes/instance-deploy.md +3 -3
  105. package/docs/recipes/instance-first-run.md +1 -1
  106. package/docs/recipes/multi-builder-merge.md +2 -2
  107. package/docs/recipes/ops-gotchas.md +13 -10
  108. package/docs/recipes/packaging-the-core.md +6 -6
  109. package/docs/recipes/parallel-goal-waves.md +4 -4
  110. package/docs/recipes/private-npm-distribution.md +9 -9
  111. package/docs/recipes/redteam-patrol.md +5 -5
  112. package/docs/recipes/render-pilot.md +2 -2
  113. package/docs/recipes/reranking-a-goals-board.md +2 -2
  114. package/docs/recipes/search-index-ingestion.md +5 -5
  115. package/docs/recipes/self-host.md +1 -1
  116. package/docs/recipes/ship-and-regrade.md +4 -4
  117. package/docs/recipes/staging-environment.md +1 -1
  118. package/docs/recipes/standalone-live-docs.md +1 -1
  119. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  120. package/docs/recipes/upgrading-the-core.md +11 -11
  121. package/docs/recipes/windows-builders.md +18 -18
  122. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  123. package/docs/research/task-network-map-readability.md +3 -3
  124. package/migrations/core_278_builder_tester_tag.sql +18 -0
  125. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  126. package/modules/agents/lib/answer-hold.js +1 -1
  127. package/modules/agents/lib/gate.js +1 -1
  128. package/modules/agents/lib/validate.js +1 -1
  129. package/modules/autonomy/db.js +9 -0
  130. package/modules/autonomy/gauge.js +1 -1
  131. package/modules/autonomy/governor-docket.js +2 -2
  132. package/modules/autonomy/module.json +2 -2
  133. package/modules/autonomy/pollers/daily-checks.js +262 -0
  134. package/modules/autonomy/pollers/routine-timers.js +9 -7
  135. package/modules/autonomy/rank-roles.js +64 -0
  136. package/modules/autonomy/routes/autonomy.js +3 -3
  137. package/modules/autonomy/server-schedule.js +37 -0
  138. package/modules/builder-settings/interaction-prefs.js +1 -1
  139. package/modules/builder-settings/render-prefs.js +1 -1
  140. package/modules/builder-settings/routes/settings.js +1 -1
  141. package/modules/builder-settings/skill-prefs.js +2 -2
  142. package/modules/builder-settings/wandering-prefs.js +2 -2
  143. package/modules/copy-desk/module.json +2 -2
  144. package/modules/copy-desk/page-data.js +5 -5
  145. package/modules/copy-desk/page-decisions.js +13 -1
  146. package/modules/copy-desk/proposals.js +4 -4
  147. package/modules/copy-desk/registry.js +2 -2
  148. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  149. package/modules/copy-desk/routes/copy-desk.js +3 -12
  150. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  151. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  152. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  153. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  154. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  155. package/modules/design-styles/skills/README.md +4 -4
  156. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  157. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  158. package/modules/discord/bug-attachments.js +1 -1
  159. package/modules/discord/ship-broadcast.js +1 -1
  160. package/modules/economy/achievements.js +49 -7
  161. package/modules/economy/cost-classify.js +6 -6
  162. package/modules/economy/cost-report.js +1 -1
  163. package/modules/economy/cost.js +1 -1
  164. package/modules/economy/credits.js +2 -1
  165. package/modules/economy/idea-size.js +2 -2
  166. package/modules/economy/reward.js +2 -0
  167. package/modules/economy/routes/cost.js +1 -1
  168. package/modules/economy/streak.js +43 -4
  169. package/modules/government/asks.js +1 -1
  170. package/modules/government/board.js +19 -2
  171. package/modules/government/catalog.js +3 -0
  172. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  173. package/modules/government/protected-surfaces.json +48 -47
  174. package/modules/government/recommendations.js +6 -2
  175. package/modules/government/routes/government.js +1 -1
  176. package/modules/grading/generated-provenance.js +13 -5
  177. package/modules/grading/grade-engine.js +1 -1
  178. package/modules/grading/grader-rubric.json +1 -1
  179. package/modules/grading/grader-score.js +1 -1
  180. package/modules/grading/grader-workers/index.js +1 -1
  181. package/modules/grading/grader.js +1 -1
  182. package/modules/grading/routes/grade.js +1 -1
  183. package/modules/hall-ui/public/atlas.html +5 -7
  184. package/modules/hall-ui/public/atlas.js +1 -1
  185. package/modules/hall-ui/public/atlas.states.json +1 -1
  186. package/modules/hall-ui/public/blockers.css +9 -0
  187. package/modules/hall-ui/public/blockers.html +4 -4
  188. package/modules/hall-ui/public/blockers.js +29 -30
  189. package/modules/hall-ui/public/board-room.css +5 -17
  190. package/modules/hall-ui/public/board-room.html +5 -6
  191. package/modules/hall-ui/public/board-room.js +41 -23
  192. package/modules/hall-ui/public/board-room.states.json +1 -1
  193. package/modules/hall-ui/public/brand-apply.js +1 -1
  194. package/modules/hall-ui/public/brand-holes.js +1 -1
  195. package/modules/hall-ui/public/builders.js +40 -86
  196. package/modules/hall-ui/public/city-decide.js +18 -4
  197. package/modules/hall-ui/public/city.html +1 -1
  198. package/modules/hall-ui/public/collab.html +1 -1
  199. package/modules/hall-ui/public/commands.html +6 -9
  200. package/modules/hall-ui/public/copy-desk.html +1 -1
  201. package/modules/hall-ui/public/copy-desk.js +2 -2
  202. package/modules/hall-ui/public/craft-mode.js +4 -0
  203. package/modules/hall-ui/public/deploy.html +6 -2
  204. package/modules/hall-ui/public/deploy.js +21 -13
  205. package/modules/hall-ui/public/diagrams.css +1 -1
  206. package/modules/hall-ui/public/diagrams.html +5 -8
  207. package/modules/hall-ui/public/diagrams.states.json +1 -1
  208. package/modules/hall-ui/public/drachmae.html +3 -7
  209. package/modules/hall-ui/public/fleet.html +3 -2
  210. package/modules/hall-ui/public/fleet.js +0 -4
  211. package/modules/hall-ui/public/gate.html +7 -7
  212. package/modules/hall-ui/public/gate.js +58 -77
  213. package/modules/hall-ui/public/goal-map.html +1 -1
  214. package/modules/hall-ui/public/goals-page.js +5 -5
  215. package/modules/hall-ui/public/goals-render.js +10 -11
  216. package/modules/hall-ui/public/goals.css +10 -0
  217. package/modules/hall-ui/public/goals.html +14 -7
  218. package/modules/hall-ui/public/government.html +3 -5
  219. package/modules/hall-ui/public/government.js +1 -5
  220. package/modules/hall-ui/public/hall-render.js +117 -57
  221. package/modules/hall-ui/public/hall-widgets.js +11 -11
  222. package/modules/hall-ui/public/idea.html +1 -1
  223. package/modules/hall-ui/public/ideas.html +3 -1
  224. package/modules/hall-ui/public/ideas.js +1 -0
  225. package/modules/hall-ui/public/index.html +12 -6
  226. package/modules/hall-ui/public/index.states.json +1 -1
  227. package/modules/hall-ui/public/mine-lens.js +1 -1
  228. package/modules/hall-ui/public/modules.html +7 -10
  229. package/modules/hall-ui/public/modules.js +0 -2
  230. package/modules/hall-ui/public/my-agents.html +1 -1
  231. package/modules/hall-ui/public/palette.js +5 -5
  232. package/modules/hall-ui/public/primer.html +4 -9
  233. package/modules/hall-ui/public/profile-connections.js +10 -2
  234. package/modules/hall-ui/public/profile-roles.js +3 -10
  235. package/modules/hall-ui/public/profile.html +12 -10
  236. package/modules/hall-ui/public/profile.js +13 -17
  237. package/modules/hall-ui/public/project-settings.html +3 -4
  238. package/modules/hall-ui/public/project-settings.js +0 -3
  239. package/modules/hall-ui/public/ranks.html +5 -11
  240. package/modules/hall-ui/public/ranks.js +6 -8
  241. package/modules/hall-ui/public/roadmap.css +0 -2
  242. package/modules/hall-ui/public/roadmap.html +1 -1
  243. package/modules/hall-ui/public/roadmap.js +16 -51
  244. package/modules/hall-ui/public/roster.html +1 -1
  245. package/modules/hall-ui/public/sessions.html +6 -8
  246. package/modules/hall-ui/public/sessions.js +7 -7
  247. package/modules/hall-ui/public/settings.html +1 -1
  248. package/modules/hall-ui/public/shell-trail.js +1 -1
  249. package/modules/hall-ui/public/shell.js +17 -17
  250. package/modules/hall-ui/public/street-deck.css +2 -1
  251. package/modules/hall-ui/public/street-deck.js +10 -2
  252. package/modules/hall-ui/public/street-desk.js +16 -5
  253. package/modules/hall-ui/public/street.html +1 -1
  254. package/modules/hall-ui/public/studio-lib.js +4 -0
  255. package/modules/hall-ui/public/studio.css +2 -0
  256. package/modules/hall-ui/public/studio.html +1 -1
  257. package/modules/hall-ui/public/studio.js +27 -1
  258. package/modules/hall-ui/public/style.css +43 -26
  259. package/modules/hall-ui/public/task-detail.js +10 -7
  260. package/modules/hall-ui/public/task.css +2 -0
  261. package/modules/hall-ui/public/task.html +3 -1
  262. package/modules/hall-ui/public/task.js +23 -7
  263. package/modules/hall-ui/public/thinking.html +1 -1
  264. package/modules/hall-ui/public/tweak-editor.html +1 -1
  265. package/modules/hall-ui/public/vote-control.js +208 -0
  266. package/modules/hall-ui/public/watch.html +3 -5
  267. package/modules/hall-ui/public/watch.js +5 -4
  268. package/modules/hall-ui/public/welcome-boot.css +130 -0
  269. package/modules/hall-ui/public/welcome-boot.js +334 -0
  270. package/modules/hall-ui/public/welcome-day.webp +0 -0
  271. package/modules/hall-ui/public/welcome-night.webp +0 -0
  272. package/modules/hall-ui/public/work-summary.js +1 -1
  273. package/modules/hall-ui/public/work.css +1 -0
  274. package/modules/hall-ui/public/work.html +3 -1
  275. package/modules/hall-ui/public/work.js +2 -1
  276. package/modules/hall-ui/records/accomplishments.md +16 -0
  277. package/modules/hall-ui/records/hall-ask-card.md +9 -0
  278. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  279. package/modules/hall-ui/records/oversight-family.md +1 -1
  280. package/modules/hall-ui/records/profile-connections.md +2 -0
  281. package/modules/hall-ui/records/profile-roles.md +1 -1
  282. package/modules/hall-ui/records/reading-rooms.md +1 -1
  283. package/modules/hall-ui/records/welcome-tower.md +50 -0
  284. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  285. package/modules/ideas/projection.js +1 -1
  286. package/modules/ideas/routes/blockers.js +3 -3
  287. package/modules/ideas/routes/inbox.js +29 -1
  288. package/modules/ideas/routes/ratify-goal.js +1 -1
  289. package/modules/ideas/routing.js +1 -1
  290. package/modules/ideas/templates.js +1 -1
  291. package/modules/ideas/trail-descent.js +1 -1
  292. package/modules/ideas/trail-size.js +1 -1
  293. package/modules/ideas/votes.js +93 -0
  294. package/modules/lifecycle/abandon-leftovers.js +1 -1
  295. package/modules/lifecycle/cascade.js +1 -1
  296. package/modules/lifecycle/conflict-resolve.js +13 -21
  297. package/modules/lifecycle/criterion-ref.js +1 -1
  298. package/modules/lifecycle/db-analytics.js +57 -4
  299. package/modules/lifecycle/db-deps-criteria.js +1 -1
  300. package/modules/lifecycle/db-ship.js +2 -2
  301. package/modules/lifecycle/db-tasks.js +2 -2
  302. package/modules/lifecycle/db-versions.js +1 -1
  303. package/modules/lifecycle/db.js +2 -0
  304. package/modules/lifecycle/dead-deps.js +3 -3
  305. package/modules/lifecycle/dependency-advisory.js +3 -3
  306. package/modules/lifecycle/goal-category.js +1 -1
  307. package/modules/lifecycle/goal-forest.js +1 -1
  308. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  309. package/modules/lifecycle/kickoff-checklist.js +1 -1
  310. package/modules/lifecycle/kickoff-seed.js +1 -1
  311. package/modules/lifecycle/lifecycle.js +2 -0
  312. package/modules/lifecycle/merge-reach.js +29 -15
  313. package/modules/lifecycle/missing-dep-classify.js +3 -3
  314. package/modules/lifecycle/module.json +2 -1
  315. package/modules/lifecycle/page-tweak-approve.js +85 -1
  316. package/modules/lifecycle/page-tweak-hold.js +1 -1
  317. package/modules/lifecycle/publish-reconciler.js +1 -2
  318. package/modules/lifecycle/rot.js +1 -1
  319. package/modules/lifecycle/routes/artist-gate.js +1 -1
  320. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  321. package/modules/lifecycle/routes/goals.js +1 -1
  322. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  323. package/modules/lifecycle/routes/task-votes.js +54 -0
  324. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  325. package/modules/lifecycle/routes/tasks.js +2 -2
  326. package/modules/lifecycle/routes/versions.js +2 -2
  327. package/modules/lifecycle/ship-card.js +4 -4
  328. package/modules/lifecycle/ship-preflight.js +1 -1
  329. package/modules/lifecycle/task-classifier.js +1 -1
  330. package/modules/lifecycle/task-status.js +1 -1
  331. package/modules/lifecycle/task-visual-db.js +1 -1
  332. package/modules/memory/learnings.js +1 -1
  333. package/modules/memory/pollers/search-index.js +2 -2
  334. package/modules/memory/routes/learnings.js +1 -1
  335. package/modules/memory/routes/memory.js +1 -1
  336. package/modules/memory/search.js +2 -2
  337. package/modules/npm-release/release.js +1 -1
  338. package/modules/onboarding/howto-moments.js +1 -1
  339. package/modules/onboarding/newcomer-restock.js +3 -3
  340. package/modules/onboarding/onboarding.js +1 -1
  341. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  342. package/modules/platform-identity/origin-containment.js +1 -1
  343. package/modules/platform-identity/publish-gate.js +1 -1
  344. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  345. package/modules/provisioning/capacity.js +1 -1
  346. package/modules/provisioning/core-upgrade.js +15 -9
  347. package/modules/provisioning/credential-preflight.js +3 -3
  348. package/modules/provisioning/disconnect.js +1 -1
  349. package/modules/provisioning/dns-resolves.js +1 -1
  350. package/modules/provisioning/module.json +1 -1
  351. package/modules/provisioning/onboard-plan.js +1 -1
  352. package/modules/provisioning/paid-shape-gate.js +2 -2
  353. package/modules/provisioning/planet-physics.js +11 -2
  354. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  355. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  356. package/modules/provisioning/provisioning.js +2 -2
  357. package/modules/provisioning/render-lookup.js +1 -1
  358. package/modules/provisioning/render-standup.js +3 -3
  359. package/modules/provisioning/repo-private.js +1 -1
  360. package/modules/provisioning/routes/callback-page.js +1 -1
  361. package/modules/provisioning/routes/core-upgrade.js +23 -3
  362. package/modules/provisioning/routes/provisioning.js +2 -2
  363. package/modules/provisioning/routes/render-standup.js +1 -1
  364. package/modules/provisioning/routes/repo-private.js +1 -1
  365. package/modules/provisioning/soft-limits.js +1 -1
  366. package/modules/provisioning/starter-bundles.js +4 -2
  367. package/modules/provisioning/tests/provisioning.mjs +1 -1
  368. package/modules/public-landing/public/account.html +4 -6
  369. package/modules/public-landing/public/assets/cosmos.css +13 -6
  370. package/modules/public-landing/public/connections.html +4 -6
  371. package/modules/public-landing/public/contact.html +4 -6
  372. package/modules/public-landing/public/guild.html +4 -6
  373. package/modules/public-landing/public/index.html +11 -9
  374. package/modules/public-landing/public/invitations.html +4 -6
  375. package/modules/public-landing/public/privacy.html +4 -6
  376. package/modules/public-landing/public/projects.html +168 -46
  377. package/modules/public-landing/public/terms.html +4 -6
  378. package/modules/raise/content/copy.json +40 -0
  379. package/modules/raise/content/nda.html +39 -0
  380. package/modules/raise/content/settings.json +49 -0
  381. package/modules/raise/db.js +95 -0
  382. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  383. package/modules/raise/module.json +28 -0
  384. package/modules/raise/page.js +194 -0
  385. package/modules/raise/public/edit.js +152 -0
  386. package/modules/raise/public/favicon.svg +1 -0
  387. package/modules/raise/public/logo-ink.svg +1 -0
  388. package/modules/raise/public/logo-night.svg +1 -0
  389. package/modules/raise/public/mode.js +8 -0
  390. package/modules/raise/public/raise.css +234 -0
  391. package/modules/raise/public/raise.js +91 -0
  392. package/modules/raise/raise.js +174 -0
  393. package/modules/raise/routes/raise.js +152 -0
  394. package/modules/raise/views/gate.html +39 -0
  395. package/modules/raise/views/nda.html +21 -0
  396. package/modules/raise/views/page.html +133 -0
  397. package/modules/raise/web.js +72 -0
  398. package/modules/render-deploy/deploys.js +1 -1
  399. package/modules/render-deploy/render.js +2 -2
  400. package/modules/security/secret-scrub.js +3 -3
  401. package/modules/security/security.js +1 -1
  402. package/modules/security/tests/artifact_scan.mjs +1 -1
  403. package/modules/security/tests/mirror.mjs +1 -1
  404. package/modules/security/tests/scan_store.mjs +1 -1
  405. package/modules/sessions/db.js +2 -2
  406. package/modules/sessions/pulse.js +2 -2
  407. package/modules/sessions/routes/sessions.js +1 -1
  408. package/modules/specialities/specialities.js +1 -1
  409. package/modules/status-ui/public/README.md +3 -4
  410. package/modules/status-ui/public/index.html +5 -31
  411. package/modules/status-ui/public/status.js +6 -174
  412. package/modules/status-ui/public/style.css +4 -133
  413. package/modules/ui-design/docs/design-contract.md +3 -3
  414. package/modules/ui-design/kit/README.md +1 -1
  415. package/modules/ui-design/kit/serve.js +13 -4
  416. package/modules/ui-design/scripts/design-sync.js +1 -1
  417. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  418. package/modules/ui-design/scripts/validate-design.js +1 -1
  419. package/package-lock.json +27 -11
  420. package/package.json +2 -3
  421. package/release-notes.json +186 -0
  422. package/scripts/bongos/CLAUDE.md +15 -0
  423. package/scripts/bongos/abandon.js +137 -0
  424. package/scripts/bongos/accessibility-replay.js +195 -0
  425. package/scripts/bongos/address-park-sweep.sh +91 -0
  426. package/scripts/bongos/adopt-detect.js +123 -0
  427. package/scripts/bongos/adopt-import.js +111 -0
  428. package/scripts/bongos/adopt-preflight.js +187 -0
  429. package/scripts/bongos/adr-namespace.js +273 -0
  430. package/scripts/bongos/agent-invoke.js +689 -0
  431. package/scripts/bongos/agents-sync.js +502 -0
  432. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  433. package/scripts/bongos/api-artifacts.js +91 -0
  434. package/scripts/bongos/api.js +86 -0
  435. package/scripts/bongos/api.ps1 +26 -0
  436. package/scripts/bongos/architect-audit.js +294 -0
  437. package/scripts/bongos/artifact-audit.js +326 -0
  438. package/scripts/bongos/artifact-format.js +203 -0
  439. package/scripts/bongos/ask.js +231 -0
  440. package/scripts/bongos/audit-authorship.sh +324 -0
  441. package/scripts/bongos/audit-deps.js +189 -0
  442. package/scripts/bongos/audit-gate.js +121 -0
  443. package/scripts/bongos/audit-rank-roles.js +131 -0
  444. package/scripts/bongos/audit-replay.sh +205 -0
  445. package/scripts/bongos/autobongos-digest.js +123 -0
  446. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  447. package/scripts/bongos/autobongos-loop.js +210 -0
  448. package/scripts/bongos/autobongos-run.js +1361 -0
  449. package/scripts/bongos/autobongos-service.cmd +50 -0
  450. package/scripts/bongos/autobongos-service.ps1 +270 -0
  451. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  452. package/scripts/bongos/autobongos-verify.js +618 -0
  453. package/scripts/bongos/autonomy-gate.js +135 -0
  454. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  455. package/scripts/bongos/autonomy-gauge.js +84 -0
  456. package/scripts/bongos/backfill-cost.js +176 -0
  457. package/scripts/bongos/backfill-disciplines.js +144 -0
  458. package/scripts/bongos/backfill-session-earnings.js +123 -0
  459. package/scripts/bongos/backfill-session-types.js +87 -0
  460. package/scripts/bongos/backfill-sessions.js +411 -0
  461. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  462. package/scripts/bongos/backfill-task-rewards.js +413 -0
  463. package/scripts/bongos/backlog-review.js +399 -0
  464. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  465. package/scripts/bongos/backup.js +116 -0
  466. package/scripts/bongos/baseline-staleness.js +217 -0
  467. package/scripts/bongos/bfg-principal-token.js +65 -0
  468. package/scripts/bongos/bug-attachment-audit.js +149 -0
  469. package/scripts/bongos/bug-attachment-recover.js +198 -0
  470. package/scripts/bongos/bug-triage.js +292 -0
  471. package/scripts/bongos/build-bongos.js +94 -0
  472. package/scripts/bongos/bump-version.js +221 -0
  473. package/scripts/bongos/capture.js +481 -0
  474. package/scripts/bongos/category-advisory-guard.js +206 -0
  475. package/scripts/bongos/ci-grade.js +82 -0
  476. package/scripts/bongos/claim-recall.js +112 -0
  477. package/scripts/bongos/claim.js +789 -0
  478. package/scripts/bongos/claude-materialize.js +1200 -0
  479. package/scripts/bongos/claude-md-template.js +142 -0
  480. package/scripts/bongos/cleanup-orphans.js +74 -0
  481. package/scripts/bongos/cli-lib.js +1226 -0
  482. package/scripts/bongos/client-baseurl-guard.js +116 -0
  483. package/scripts/bongos/codemod-rename-scripts-gds.js +380 -0
  484. package/scripts/bongos/conductor-dispatch.js +535 -0
  485. package/scripts/bongos/context-pack.js +326 -0
  486. package/scripts/bongos/control-manifest.js +199 -0
  487. package/scripts/bongos/copy-apply.js +758 -0
  488. package/scripts/bongos/copy-inventory.js +571 -0
  489. package/scripts/bongos/core-origin-follow.js +185 -0
  490. package/scripts/bongos/core-pin-sync.js +260 -0
  491. package/scripts/bongos/cost-report.js +63 -0
  492. package/scripts/bongos/cost.js +47 -0
  493. package/scripts/bongos/credential-presence.js +296 -0
  494. package/scripts/bongos/cutover-codemod.js +240 -0
  495. package/scripts/bongos/db-backup-nightly.sh +232 -0
  496. package/scripts/bongos/db-backup-offsite.sh +267 -0
  497. package/scripts/bongos/demote.js +45 -0
  498. package/scripts/bongos/deploy-divergence.js +454 -0
  499. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  500. package/scripts/bongos/design-sync.js +12 -0
  501. package/scripts/bongos/dev-box-guard.js +166 -0
  502. package/scripts/bongos/dev-lib.js +722 -0
  503. package/scripts/bongos/dev.js +645 -0
  504. package/scripts/bongos/device-flow-help.js +72 -0
  505. package/scripts/bongos/diagnose-achievements.js +118 -0
  506. package/scripts/bongos/diagram-facts.js +355 -0
  507. package/scripts/bongos/discord-channels.js +77 -0
  508. package/scripts/bongos/do-api.js +109 -0
  509. package/scripts/bongos/doc-cli-guard.js +274 -0
  510. package/scripts/bongos/doc-comment-coverage.js +139 -0
  511. package/scripts/bongos/doc-control-claims.js +170 -0
  512. package/scripts/bongos/docs-entropy.js +453 -0
  513. package/scripts/bongos/doctor.js +493 -0
  514. package/scripts/bongos/enroll-control-plane.js +101 -0
  515. package/scripts/bongos/exec-path-guard.js +564 -0
  516. package/scripts/bongos/feedback-send.js +249 -0
  517. package/scripts/bongos/fetch-art-key.js +106 -0
  518. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  519. package/scripts/bongos/figma-design-sync.js +11 -0
  520. package/scripts/bongos/find-untested.js +371 -0
  521. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  522. package/scripts/bongos/fitness-checks-identity.js +332 -0
  523. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  524. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  525. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  526. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  527. package/scripts/bongos/fitness-lib.js +127 -0
  528. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  529. package/scripts/bongos/fitness-ratchets.js +594 -0
  530. package/scripts/bongos/fitness.js +1498 -0
  531. package/scripts/bongos/forwarder.js +80 -0
  532. package/scripts/bongos/gate-review.js +330 -0
  533. package/scripts/bongos/gating.js +348 -0
  534. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  535. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  537. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  538. package/scripts/bongos/gds-literal-scan.js +196 -0
  539. package/scripts/bongos/gen-api-client.js +576 -0
  540. package/scripts/bongos/gen-api-docs.js +1111 -0
  541. package/scripts/bongos/gen-atlas.js +366 -0
  542. package/scripts/bongos/gen-diagrams.js +608 -0
  543. package/scripts/bongos/gen-file-map.js +337 -0
  544. package/scripts/bongos/gen-freshness.js +32 -0
  545. package/scripts/bongos/gen-interaction-posture.js +122 -0
  546. package/scripts/bongos/gen-repo-map.js +540 -0
  547. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  548. package/scripts/bongos/gen-session-index.js +243 -0
  549. package/scripts/bongos/gen-sounds.js +176 -0
  550. package/scripts/bongos/git-merge-regen.js +254 -0
  551. package/scripts/bongos/go-live.js +1071 -0
  552. package/scripts/bongos/goal.js +272 -0
  553. package/scripts/bongos/government-walk.js +1477 -0
  554. package/scripts/bongos/grade-correlation-audit.js +310 -0
  555. package/scripts/bongos/grade-replay.js +237 -0
  556. package/scripts/bongos/grade-smoke.js +205 -0
  557. package/scripts/bongos/home-isolation-guard.js +126 -0
  558. package/scripts/bongos/hooks/pre-push.js +211 -0
  559. package/scripts/bongos/howto.js +145 -0
  560. package/scripts/bongos/http-api-client.js +81 -0
  561. package/scripts/bongos/identity-strip.js +75 -0
  562. package/scripts/bongos/init.js +1159 -0
  563. package/scripts/bongos/install-git-hooks.js +200 -0
  564. package/scripts/bongos/instance-apex.js +38 -0
  565. package/scripts/bongos/intent-retry.js +52 -0
  566. package/scripts/bongos/key-card.js +222 -0
  567. package/scripts/bongos/key-status.js +126 -0
  568. package/scripts/bongos/land-watch.js +201 -0
  569. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  570. package/scripts/bongos/learning-capture.js +145 -0
  571. package/scripts/bongos/lib.sh +74 -0
  572. package/scripts/bongos/linkify-refs.js +655 -0
  573. package/scripts/bongos/lint-infra-exec.js +70 -0
  574. package/scripts/bongos/lint-migrations.js +102 -0
  575. package/scripts/bongos/lint-workflow-exec.js +63 -0
  576. package/scripts/bongos/local-preview-lib.js +128 -0
  577. package/scripts/bongos/local-preview.js +82 -0
  578. package/scripts/bongos/login.js +360 -0
  579. package/scripts/bongos/main-audit.js +625 -0
  580. package/scripts/bongos/me.js +97 -0
  581. package/scripts/bongos/memory-map.js +176 -0
  582. package/scripts/bongos/merge-lock.js +71 -0
  583. package/scripts/bongos/migration-namespace.js +313 -0
  584. package/scripts/bongos/mirror-lineage-check.js +343 -0
  585. package/scripts/bongos/mirror-redact.js +350 -0
  586. package/scripts/bongos/module-artifact.js +289 -0
  587. package/scripts/bongos/module-assess-docs.js +238 -0
  588. package/scripts/bongos/module-assess-installs.js +228 -0
  589. package/scripts/bongos/module-assess-score.js +111 -0
  590. package/scripts/bongos/module-assess-security.js +252 -0
  591. package/scripts/bongos/module-assess-tests.js +278 -0
  592. package/scripts/bongos/module-assess-version.js +92 -0
  593. package/scripts/bongos/module-error-report.js +148 -0
  594. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  595. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  596. package/scripts/bongos/module-test-runner.js +414 -0
  597. package/scripts/bongos/module.js +1376 -0
  598. package/scripts/bongos/move-escalation.js +141 -0
  599. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  600. package/scripts/bongos/newcomer-floor.js +421 -0
  601. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  602. package/scripts/bongos/newcomer-floor.test.js +235 -0
  603. package/scripts/bongos/next-number.js +163 -0
  604. package/scripts/bongos/oauth-secret.js +202 -0
  605. package/scripts/bongos/onboard.js +267 -0
  606. package/scripts/bongos/onboarding-analyze.js +226 -0
  607. package/scripts/bongos/onboarding-config.js +179 -0
  608. package/scripts/bongos/onboarding-ship.js +92 -0
  609. package/scripts/bongos/pack-env-prefix.js +73 -0
  610. package/scripts/bongos/package-core.js +1200 -0
  611. package/scripts/bongos/page-inventory.js +348 -0
  612. package/scripts/bongos/page-reader.js +722 -0
  613. package/scripts/bongos/paste-token.js +212 -0
  614. package/scripts/bongos/plain-cards.js +351 -0
  615. package/scripts/bongos/portability-smoke-art.sh +85 -0
  616. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  617. package/scripts/bongos/preflight.js +214 -0
  618. package/scripts/bongos/probe-cache.js +246 -0
  619. package/scripts/bongos/prove-strict-versioning.js +284 -0
  620. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  621. package/scripts/bongos/provision-byo-host.js +68 -0
  622. package/scripts/bongos/provision-capacity.js +79 -0
  623. package/scripts/bongos/provision-caps.js +63 -0
  624. package/scripts/bongos/provision-config.js +233 -0
  625. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  626. package/scripts/bongos/provision-disconnect.js +88 -0
  627. package/scripts/bongos/provision-github-setup.js +168 -0
  628. package/scripts/bongos/provision-net.js +357 -0
  629. package/scripts/bongos/provision-pin-key.js +176 -0
  630. package/scripts/bongos/provision-pin-replay.js +126 -0
  631. package/scripts/bongos/provision-process.js +170 -0
  632. package/scripts/bongos/provision-render.js +201 -0
  633. package/scripts/bongos/provision-repo-auth.js +164 -0
  634. package/scripts/bongos/provision-repo-private.js +98 -0
  635. package/scripts/bongos/provision-repo.js +1337 -0
  636. package/scripts/bongos/provision-teardown.js +106 -0
  637. package/scripts/bongos/provision-units.js +469 -0
  638. package/scripts/bongos/provision.js +1479 -0
  639. package/scripts/bongos/publish-credential-check.js +66 -0
  640. package/scripts/bongos/publish-integration-gate.js +142 -0
  641. package/scripts/bongos/publish-manifest.js +440 -0
  642. package/scripts/bongos/publish-watch.js +268 -0
  643. package/scripts/bongos/pulse.js +338 -0
  644. package/scripts/bongos/push-main.js +56 -0
  645. package/scripts/bongos/push-path-brief.js +100 -0
  646. package/scripts/bongos/read-session-export.js +359 -0
  647. package/scripts/bongos/reauth.js +155 -0
  648. package/scripts/bongos/recall.js +183 -0
  649. package/scripts/bongos/redteam-patrol.js +437 -0
  650. package/scripts/bongos/regen-instance-docs.js +47 -0
  651. package/scripts/bongos/release-core.js +80 -0
  652. package/scripts/bongos/release-notes.js +271 -0
  653. package/scripts/bongos/release.js +139 -0
  654. package/scripts/bongos/rename-history-check.js +369 -0
  655. package/scripts/bongos/rename-ledger-prose.js +482 -0
  656. package/scripts/bongos/render-api.js +197 -0
  657. package/scripts/bongos/render-check.js +206 -0
  658. package/scripts/bongos/render-ideas.js +226 -0
  659. package/scripts/bongos/render-payload.js +85 -0
  660. package/scripts/bongos/repo-metrics.js +363 -0
  661. package/scripts/bongos/review-sheet.js +108 -0
  662. package/scripts/bongos/role-pack-guard.js +142 -0
  663. package/scripts/bongos/route-shadow-guard.js +175 -0
  664. package/scripts/bongos/routine-schedule.js +318 -0
  665. package/scripts/bongos/run-routine.js +257 -0
  666. package/scripts/bongos/run-unit-tests.js +654 -0
  667. package/scripts/bongos/runner-drift.js +151 -0
  668. package/scripts/bongos/sandbox-stage.js +459 -0
  669. package/scripts/bongos/scope-map-guard.js +300 -0
  670. package/scripts/bongos/scope-roster-guard.js +118 -0
  671. package/scripts/bongos/seam-wiring-guard.js +275 -0
  672. package/scripts/bongos/search-ingest-db.js +288 -0
  673. package/scripts/bongos/search-ingest-md.js +269 -0
  674. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  675. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  676. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  677. package/scripts/bongos/seed-staging.sh +117 -0
  678. package/scripts/bongos/seed-verify-criteria.js +124 -0
  679. package/scripts/bongos/sequence.js +597 -0
  680. package/scripts/bongos/session-cost.js +430 -0
  681. package/scripts/bongos/session-digest-build.js +293 -0
  682. package/scripts/bongos/session-digest.js +200 -0
  683. package/scripts/bongos/session-eval.js +631 -0
  684. package/scripts/bongos/session-transcript-build.js +155 -0
  685. package/scripts/bongos/session-transcript-upload.js +29 -0
  686. package/scripts/bongos/session.js +404 -0
  687. package/scripts/bongos/setup.js +646 -0
  688. package/scripts/bongos/ship-check.js +89 -0
  689. package/scripts/bongos/ship-deploy-target.js +393 -0
  690. package/scripts/bongos/ship-escalation.js +167 -0
  691. package/scripts/bongos/ship-finish.js +420 -0
  692. package/scripts/bongos/ship-flow.js +1217 -0
  693. package/scripts/bongos/ship-git.js +100 -0
  694. package/scripts/bongos/ship-grade-steps.js +547 -0
  695. package/scripts/bongos/ship-grade.js +426 -0
  696. package/scripts/bongos/ship-honesty.js +314 -0
  697. package/scripts/bongos/ship-io.js +139 -0
  698. package/scripts/bongos/ship-land.js +1130 -0
  699. package/scripts/bongos/ship-memory-sync.js +249 -0
  700. package/scripts/bongos/ship-merge-gate.js +225 -0
  701. package/scripts/bongos/ship-merge.js +466 -0
  702. package/scripts/bongos/ship-mode-ask.js +138 -0
  703. package/scripts/bongos/ship-mode-manual.js +54 -0
  704. package/scripts/bongos/ship-preflight-steps.js +399 -0
  705. package/scripts/bongos/ship-regen.js +291 -0
  706. package/scripts/bongos/ship-resume.js +201 -0
  707. package/scripts/bongos/ship-session-upload.js +313 -0
  708. package/scripts/bongos/ship-state.js +110 -0
  709. package/scripts/bongos/ship-surprise.js +84 -0
  710. package/scripts/bongos/ship-visual.js +75 -0
  711. package/scripts/bongos/ship.js +382 -0
  712. package/scripts/bongos/shipping-mode.js +71 -0
  713. package/scripts/bongos/skill-lint.js +250 -0
  714. package/scripts/bongos/skill-preflight.js +361 -0
  715. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  716. package/scripts/bongos/smoke-batch-release.sh +316 -0
  717. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  718. package/scripts/bongos/smoke-dependencies.sh +143 -0
  719. package/scripts/bongos/smoke-gds.js +256 -0
  720. package/scripts/bongos/smoke-write.sh +275 -0
  721. package/scripts/bongos/source-text-test-scan.js +106 -0
  722. package/scripts/bongos/spark.js +294 -0
  723. package/scripts/bongos/stale-worktrees.js +212 -0
  724. package/scripts/bongos/start-goals.js +102 -0
  725. package/scripts/bongos/start.js +1090 -0
  726. package/scripts/bongos/status.js +545 -0
  727. package/scripts/bongos/strand-watch.js +315 -0
  728. package/scripts/bongos/stranded-rows.js +200 -0
  729. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  730. package/scripts/bongos/surface.js +101 -0
  731. package/scripts/bongos/task.js +273 -0
  732. package/scripts/bongos/test-path-guard.js +99 -0
  733. package/scripts/bongos/triage.js +742 -0
  734. package/scripts/bongos/turn-end-sound.js +74 -0
  735. package/scripts/bongos/tweak-halt.js +70 -0
  736. package/scripts/bongos/tweak-renders.js +200 -0
  737. package/scripts/bongos/uat.js +120 -0
  738. package/scripts/bongos/ui-kit-transform.js +43 -0
  739. package/scripts/bongos/update-channel.js +512 -0
  740. package/scripts/bongos/update-sweep.js +829 -0
  741. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  742. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  743. package/scripts/bongos/upgrade-migrate.js +224 -0
  744. package/scripts/bongos/upgrade-operator.js +73 -0
  745. package/scripts/bongos/upgrade-outcome.js +174 -0
  746. package/scripts/bongos/upgrade.js +1499 -0
  747. package/scripts/bongos/validate-design.js +12 -0
  748. package/scripts/bongos/version-close.js +621 -0
  749. package/scripts/bongos/version-literal-guard.js +140 -0
  750. package/scripts/bongos/version-select.js +79 -0
  751. package/scripts/bongos/visual-review-nudge.js +39 -0
  752. package/scripts/bongos/wedge-remedy.js +174 -0
  753. package/scripts/bongos/worktree-claim-guard.js +130 -0
  754. package/scripts/bongos/worktree.js +449 -0
  755. package/scripts/discord/post.js +1 -1
  756. package/scripts/gds/README.md +9 -0
  757. package/scripts/gds/abandon.js +6 -136
  758. package/scripts/gds/accessibility-replay.js +5 -194
  759. package/scripts/gds/address-park-sweep.sh +7 -90
  760. package/scripts/gds/adopt-detect.js +5 -121
  761. package/scripts/gds/adopt-import.js +5 -109
  762. package/scripts/gds/adopt-preflight.js +5 -185
  763. package/scripts/gds/adr-namespace.js +5 -271
  764. package/scripts/gds/agent-invoke.js +5 -687
  765. package/scripts/gds/agents-sync.js +5 -500
  766. package/scripts/gds/api-alias-caller-scan.js +5 -255
  767. package/scripts/gds/api-artifacts.js +6 -0
  768. package/scripts/gds/api.js +6 -85
  769. package/scripts/gds/api.ps1 +8 -26
  770. package/scripts/gds/architect-audit.js +6 -293
  771. package/scripts/gds/artifact-audit.js +5 -324
  772. package/scripts/gds/artifact-format.js +6 -203
  773. package/scripts/gds/ask.js +5 -229
  774. package/scripts/gds/audit-authorship.sh +7 -328
  775. package/scripts/gds/audit-deps.js +6 -188
  776. package/scripts/gds/audit-gate.js +5 -119
  777. package/scripts/gds/audit-rank-roles.js +6 -171
  778. package/scripts/gds/audit-replay.sh +7 -204
  779. package/scripts/gds/autobongos-digest.js +5 -121
  780. package/scripts/gds/autobongos-grade-cap.js +5 -186
  781. package/scripts/gds/autobongos-loop.js +5 -208
  782. package/scripts/gds/autobongos-run.js +5 -1359
  783. package/scripts/gds/autobongos-service.cmd +8 -49
  784. package/scripts/gds/autobongos-service.ps1 +8 -270
  785. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  786. package/scripts/gds/autobongos-verify.js +5 -616
  787. package/scripts/gds/autonomy-gate.js +5 -133
  788. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  789. package/scripts/gds/autonomy-gauge.js +5 -82
  790. package/scripts/gds/backfill-cost.js +6 -175
  791. package/scripts/gds/backfill-disciplines.js +5 -142
  792. package/scripts/gds/backfill-session-earnings.js +5 -121
  793. package/scripts/gds/backfill-session-types.js +5 -85
  794. package/scripts/gds/backfill-sessions.js +5 -409
  795. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  796. package/scripts/gds/backfill-task-rewards.js +5 -411
  797. package/scripts/gds/backlog-review.js +6 -398
  798. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  799. package/scripts/gds/backup.js +6 -115
  800. package/scripts/gds/baseline-staleness.js +5 -215
  801. package/scripts/gds/bfg-principal-token.js +6 -64
  802. package/scripts/gds/bug-attachment-audit.js +5 -147
  803. package/scripts/gds/bug-attachment-recover.js +5 -196
  804. package/scripts/gds/bug-triage.js +6 -291
  805. package/scripts/gds/build-bongos.js +5 -92
  806. package/scripts/gds/bump-version.js +5 -219
  807. package/scripts/gds/capture.js +6 -480
  808. package/scripts/gds/category-advisory-guard.js +5 -205
  809. package/scripts/gds/ci-grade.js +6 -81
  810. package/scripts/gds/claim-recall.js +6 -111
  811. package/scripts/gds/claim.js +6 -788
  812. package/scripts/gds/claude-materialize.js +5 -1198
  813. package/scripts/gds/claude-md-template.js +5 -140
  814. package/scripts/gds/cleanup-orphans.js +6 -73
  815. package/scripts/gds/cli-lib.js +6 -1204
  816. package/scripts/gds/client-baseurl-guard.js +5 -114
  817. package/scripts/gds/conductor-dispatch.js +6 -534
  818. package/scripts/gds/context-pack.js +6 -325
  819. package/scripts/gds/control-manifest.js +5 -197
  820. package/scripts/gds/copy-apply.js +5 -756
  821. package/scripts/gds/copy-inventory.js +5 -569
  822. package/scripts/gds/core-origin-follow.js +5 -184
  823. package/scripts/gds/core-pin-sync.js +5 -258
  824. package/scripts/gds/cost-report.js +6 -62
  825. package/scripts/gds/cost.js +6 -46
  826. package/scripts/gds/credential-presence.js +5 -294
  827. package/scripts/gds/cutover-codemod.js +5 -239
  828. package/scripts/gds/db-backup-nightly.sh +7 -231
  829. package/scripts/gds/db-backup-offsite.sh +7 -266
  830. package/scripts/gds/demote.js +6 -44
  831. package/scripts/gds/deploy-divergence.js +6 -445
  832. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  833. package/scripts/gds/design-sync.js +5 -10
  834. package/scripts/gds/dev-box-guard.js +5 -164
  835. package/scripts/gds/dev-lib.js +5 -721
  836. package/scripts/gds/dev.js +5 -643
  837. package/scripts/gds/device-flow-help.js +5 -70
  838. package/scripts/gds/diagnose-achievements.js +5 -116
  839. package/scripts/gds/diagram-facts.js +6 -355
  840. package/scripts/gds/discord-channels.js +5 -75
  841. package/scripts/gds/do-api.js +6 -109
  842. package/scripts/gds/doc-cli-guard.js +5 -266
  843. package/scripts/gds/doc-comment-coverage.js +5 -137
  844. package/scripts/gds/doc-control-claims.js +5 -166
  845. package/scripts/gds/docs-entropy.js +5 -443
  846. package/scripts/gds/doctor.js +6 -492
  847. package/scripts/gds/enroll-control-plane.js +5 -99
  848. package/scripts/gds/exec-path-guard.js +5 -562
  849. package/scripts/gds/feedback-send.js +5 -247
  850. package/scripts/gds/fetch-art-key.js +5 -104
  851. package/scripts/gds/fetch-sound-prefs.js +5 -124
  852. package/scripts/gds/figma-design-sync.js +5 -9
  853. package/scripts/gds/find-untested.js +5 -369
  854. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  855. package/scripts/gds/fitness-checks-identity.js +5 -342
  856. package/scripts/gds/fitness-checks-packaging.js +5 -131
  857. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  858. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  859. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  860. package/scripts/gds/fitness-lib.js +5 -126
  861. package/scripts/gds/fitness-migration-contraction.js +5 -49
  862. package/scripts/gds/fitness-ratchets.js +5 -563
  863. package/scripts/gds/fitness.js +5 -1493
  864. package/scripts/gds/gate-review.js +5 -328
  865. package/scripts/gds/gating.js +5 -346
  866. package/scripts/gds/gds-literal-scan.js +5 -194
  867. package/scripts/gds/gen-api-client.js +5 -555
  868. package/scripts/gds/gen-api-docs.js +5 -1100
  869. package/scripts/gds/gen-atlas.js +5 -364
  870. package/scripts/gds/gen-diagrams.js +6 -607
  871. package/scripts/gds/gen-file-map.js +5 -335
  872. package/scripts/gds/gen-freshness.js +5 -31
  873. package/scripts/gds/gen-interaction-posture.js +5 -120
  874. package/scripts/gds/gen-repo-map.js +5 -538
  875. package/scripts/gds/gen-role-responsibilities.js +5 -133
  876. package/scripts/gds/gen-session-index.js +5 -241
  877. package/scripts/gds/gen-sounds.js +5 -174
  878. package/scripts/gds/git-merge-regen.js +6 -291
  879. package/scripts/gds/go-live.js +5 -1069
  880. package/scripts/gds/goal.js +6 -271
  881. package/scripts/gds/government-walk.js +5 -1475
  882. package/scripts/gds/grade-correlation-audit.js +5 -308
  883. package/scripts/gds/grade-replay.js +5 -235
  884. package/scripts/gds/grade-smoke.js +6 -204
  885. package/scripts/gds/home-isolation-guard.js +5 -125
  886. package/scripts/gds/hooks/pre-push.js +5 -209
  887. package/scripts/gds/howto.js +5 -143
  888. package/scripts/gds/http-api-client.js +6 -81
  889. package/scripts/gds/identity-strip.js +5 -74
  890. package/scripts/gds/init.js +5 -1157
  891. package/scripts/gds/install-git-hooks.js +5 -198
  892. package/scripts/gds/instance-apex.js +5 -37
  893. package/scripts/gds/intent-retry.js +5 -51
  894. package/scripts/gds/key-card.js +6 -221
  895. package/scripts/gds/key-status.js +5 -124
  896. package/scripts/gds/land-watch.js +5 -199
  897. package/scripts/gds/leak-scan-allowlist.js +5 -291
  898. package/scripts/gds/learning-capture.js +6 -144
  899. package/scripts/gds/lib.sh +7 -73
  900. package/scripts/gds/linkify-refs.js +6 -654
  901. package/scripts/gds/lint-infra-exec.js +5 -68
  902. package/scripts/gds/lint-migrations.js +5 -100
  903. package/scripts/gds/lint-workflow-exec.js +5 -61
  904. package/scripts/gds/local-preview-lib.js +6 -128
  905. package/scripts/gds/local-preview.js +6 -81
  906. package/scripts/gds/login.js +5 -358
  907. package/scripts/gds/main-audit.js +5 -623
  908. package/scripts/gds/me.js +6 -96
  909. package/scripts/gds/memory-map.js +5 -174
  910. package/scripts/gds/merge-lock.js +6 -70
  911. package/scripts/gds/migration-namespace.js +5 -311
  912. package/scripts/gds/mirror-lineage-check.js +5 -341
  913. package/scripts/gds/mirror-redact.js +5 -348
  914. package/scripts/gds/module-artifact.js +6 -289
  915. package/scripts/gds/module-assess-docs.js +6 -237
  916. package/scripts/gds/module-assess-installs.js +6 -227
  917. package/scripts/gds/module-assess-score.js +6 -110
  918. package/scripts/gds/module-assess-security.js +6 -251
  919. package/scripts/gds/module-assess-tests.js +6 -277
  920. package/scripts/gds/module-assess-version.js +6 -91
  921. package/scripts/gds/module-error-report.js +5 -146
  922. package/scripts/gds/module-test-runner.js +6 -413
  923. package/scripts/gds/module.js +5 -1374
  924. package/scripts/gds/move-escalation.js +5 -140
  925. package/scripts/gds/newcomer-floor.js +6 -420
  926. package/scripts/gds/newcomer-floor.test.js +6 -234
  927. package/scripts/gds/next-number.js +6 -162
  928. package/scripts/gds/oauth-secret.js +5 -200
  929. package/scripts/gds/onboard.js +5 -265
  930. package/scripts/gds/onboarding-analyze.js +6 -225
  931. package/scripts/gds/onboarding-config.js +6 -179
  932. package/scripts/gds/onboarding-ship.js +6 -91
  933. package/scripts/gds/pack-env-prefix.js +5 -72
  934. package/scripts/gds/package-core.js +5 -1102
  935. package/scripts/gds/page-inventory.js +5 -346
  936. package/scripts/gds/page-reader.js +5 -720
  937. package/scripts/gds/paste-token.js +6 -211
  938. package/scripts/gds/plain-cards.js +5 -350
  939. package/scripts/gds/portability-smoke-art.sh +7 -84
  940. package/scripts/gds/portability-smoke-memory.sh +7 -175
  941. package/scripts/gds/preflight.js +5 -212
  942. package/scripts/gds/probe-cache.js +5 -244
  943. package/scripts/gds/prove-strict-versioning.js +6 -283
  944. package/scripts/gds/provision-auto-upgrade.js +5 -161
  945. package/scripts/gds/provision-byo-host.js +5 -67
  946. package/scripts/gds/provision-capacity.js +5 -78
  947. package/scripts/gds/provision-caps.js +5 -62
  948. package/scripts/gds/provision-config.js +5 -232
  949. package/scripts/gds/provision-core-upgrade.js +5 -1165
  950. package/scripts/gds/provision-disconnect.js +5 -87
  951. package/scripts/gds/provision-github-setup.js +5 -167
  952. package/scripts/gds/provision-net.js +5 -356
  953. package/scripts/gds/provision-pin-key.js +5 -175
  954. package/scripts/gds/provision-pin-replay.js +5 -125
  955. package/scripts/gds/provision-process.js +5 -169
  956. package/scripts/gds/provision-render.js +5 -200
  957. package/scripts/gds/provision-repo-auth.js +5 -163
  958. package/scripts/gds/provision-repo-private.js +5 -97
  959. package/scripts/gds/provision-repo.js +5 -1336
  960. package/scripts/gds/provision-teardown.js +5 -105
  961. package/scripts/gds/provision-units.js +5 -468
  962. package/scripts/gds/provision.js +5 -1477
  963. package/scripts/gds/publish-credential-check.js +6 -65
  964. package/scripts/gds/publish-integration-gate.js +5 -140
  965. package/scripts/gds/publish-manifest.js +5 -437
  966. package/scripts/gds/publish-watch.js +5 -266
  967. package/scripts/gds/pulse.js +6 -335
  968. package/scripts/gds/push-main.js +5 -54
  969. package/scripts/gds/push-path-brief.js +5 -98
  970. package/scripts/gds/read-session-export.js +5 -357
  971. package/scripts/gds/reauth.js +6 -154
  972. package/scripts/gds/recall.js +6 -182
  973. package/scripts/gds/redteam-patrol.js +5 -435
  974. package/scripts/gds/regen-instance-docs.js +5 -45
  975. package/scripts/gds/release-core.js +5 -78
  976. package/scripts/gds/release-notes.js +5 -270
  977. package/scripts/gds/release.js +6 -138
  978. package/scripts/gds/rename-history-check.js +5 -367
  979. package/scripts/gds/rename-ledger-prose.js +5 -480
  980. package/scripts/gds/render-api.js +5 -196
  981. package/scripts/gds/render-check.js +5 -204
  982. package/scripts/gds/render-ideas.js +6 -225
  983. package/scripts/gds/render-payload.js +5 -84
  984. package/scripts/gds/repo-metrics.js +6 -362
  985. package/scripts/gds/review-sheet.js +5 -106
  986. package/scripts/gds/role-pack-guard.js +5 -141
  987. package/scripts/gds/route-shadow-guard.js +5 -173
  988. package/scripts/gds/routine-schedule.js +5 -281
  989. package/scripts/gds/run-routine.js +5 -255
  990. package/scripts/gds/run-unit-tests.js +6 -659
  991. package/scripts/gds/runner-drift.js +5 -149
  992. package/scripts/gds/sandbox-stage.js +6 -458
  993. package/scripts/gds/scope-map-guard.js +5 -299
  994. package/scripts/gds/scope-roster-guard.js +5 -117
  995. package/scripts/gds/seam-wiring-guard.js +5 -274
  996. package/scripts/gds/search-ingest-db.js +6 -287
  997. package/scripts/gds/search-ingest-md.js +6 -268
  998. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  999. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1000. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1001. package/scripts/gds/seed-staging.sh +7 -116
  1002. package/scripts/gds/seed-verify-criteria.js +6 -124
  1003. package/scripts/gds/sequence.js +6 -596
  1004. package/scripts/gds/session-cost.js +6 -429
  1005. package/scripts/gds/session-digest-build.js +6 -293
  1006. package/scripts/gds/session-digest.js +6 -199
  1007. package/scripts/gds/session-eval.js +6 -630
  1008. package/scripts/gds/session-transcript-build.js +6 -155
  1009. package/scripts/gds/session-transcript-upload.js +6 -29
  1010. package/scripts/gds/session.js +6 -403
  1011. package/scripts/gds/setup.js +6 -645
  1012. package/scripts/gds/ship-check.js +5 -85
  1013. package/scripts/gds/ship-deploy-target.js +5 -392
  1014. package/scripts/gds/ship-escalation.js +5 -166
  1015. package/scripts/gds/ship-finish.js +5 -419
  1016. package/scripts/gds/ship-flow.js +5 -1216
  1017. package/scripts/gds/ship-git.js +5 -99
  1018. package/scripts/gds/ship-grade-steps.js +5 -546
  1019. package/scripts/gds/ship-grade.js +5 -425
  1020. package/scripts/gds/ship-honesty.js +5 -312
  1021. package/scripts/gds/ship-io.js +5 -138
  1022. package/scripts/gds/ship-land.js +5 -1129
  1023. package/scripts/gds/ship-memory-sync.js +5 -248
  1024. package/scripts/gds/ship-merge-gate.js +5 -224
  1025. package/scripts/gds/ship-merge.js +5 -465
  1026. package/scripts/gds/ship-mode-ask.js +5 -137
  1027. package/scripts/gds/ship-mode-manual.js +5 -53
  1028. package/scripts/gds/ship-preflight-steps.js +5 -398
  1029. package/scripts/gds/ship-regen.js +5 -313
  1030. package/scripts/gds/ship-resume.js +5 -200
  1031. package/scripts/gds/ship-session-upload.js +5 -312
  1032. package/scripts/gds/ship-state.js +5 -109
  1033. package/scripts/gds/ship-surprise.js +5 -83
  1034. package/scripts/gds/ship-visual.js +5 -74
  1035. package/scripts/gds/ship.js +5 -380
  1036. package/scripts/gds/shipping-mode.js +5 -69
  1037. package/scripts/gds/skill-lint.js +5 -248
  1038. package/scripts/gds/skill-preflight.js +5 -359
  1039. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1040. package/scripts/gds/smoke-batch-release.sh +7 -315
  1041. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1042. package/scripts/gds/smoke-dependencies.sh +7 -142
  1043. package/scripts/gds/smoke-gds.js +6 -255
  1044. package/scripts/gds/smoke-write.sh +7 -274
  1045. package/scripts/gds/source-text-test-scan.js +7 -0
  1046. package/scripts/gds/spark.js +6 -293
  1047. package/scripts/gds/stale-worktrees.js +5 -210
  1048. package/scripts/gds/start-goals.js +5 -101
  1049. package/scripts/gds/start.js +6 -1089
  1050. package/scripts/gds/status.js +6 -544
  1051. package/scripts/gds/strand-watch.js +5 -313
  1052. package/scripts/gds/stranded-rows.js +5 -198
  1053. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1054. package/scripts/gds/surface.js +5 -100
  1055. package/scripts/gds/task.js +6 -272
  1056. package/scripts/gds/test-path-guard.js +5 -97
  1057. package/scripts/gds/triage.js +6 -741
  1058. package/scripts/gds/turn-end-sound.js +5 -72
  1059. package/scripts/gds/tweak-halt.js +5 -68
  1060. package/scripts/gds/tweak-renders.js +5 -198
  1061. package/scripts/gds/uat.js +6 -119
  1062. package/scripts/gds/ui-kit-transform.js +5 -41
  1063. package/scripts/gds/update-channel.js +5 -510
  1064. package/scripts/gds/update-sweep.js +5 -827
  1065. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1066. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1067. package/scripts/gds/upgrade-migrate.js +5 -223
  1068. package/scripts/gds/upgrade-operator.js +6 -73
  1069. package/scripts/gds/upgrade-outcome.js +5 -173
  1070. package/scripts/gds/upgrade.js +5 -1497
  1071. package/scripts/gds/validate-design.js +5 -10
  1072. package/scripts/gds/version-close.js +6 -620
  1073. package/scripts/gds/version-literal-guard.js +5 -138
  1074. package/scripts/gds/version-select.js +5 -77
  1075. package/scripts/gds/visual-review-nudge.js +5 -38
  1076. package/scripts/gds/wedge-remedy.js +5 -173
  1077. package/scripts/gds/worktree-claim-guard.js +5 -129
  1078. package/scripts/gds/worktree.js +6 -448
  1079. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1080. package/scripts/hall-preview/server.js +2 -2
  1081. package/scripts/migrate.sh +3 -3
  1082. package/scripts/public-mirror-export.js +3 -3
  1083. package/scripts/security/dep-audit.js +50 -124
  1084. package/scripts/setup-builder.js +7 -7
  1085. package/src/bongos/api-errors.js +1 -0
  1086. package/src/bongos/api-prefix.js +1 -1
  1087. package/src/bongos/auth-github.js +19 -3
  1088. package/src/bongos/auth-idp.js +7 -0
  1089. package/src/bongos/claim-attribution.js +2 -2
  1090. package/src/bongos/core-moves.js +1 -1
  1091. package/src/bongos/core-update.js +3 -3
  1092. package/src/bongos/craft-mode.js +2 -2
  1093. package/src/bongos/db-kernel.js +15 -3
  1094. package/src/bongos/db.js +30 -4
  1095. package/src/bongos/github-repos.js +1 -1
  1096. package/src/bongos/llm-cache.js +1 -1
  1097. package/src/bongos/llm-pricing.js +1 -1
  1098. package/src/bongos/metrics.js +1 -1
  1099. package/src/bongos/middleware/rate-limit.js +2 -2
  1100. package/src/bongos/module-listing.js +93 -1
  1101. package/src/bongos/module-scope-map.js +90 -85
  1102. package/src/bongos/module-store.js +1 -1
  1103. package/src/bongos/module-submissions.js +1 -1
  1104. package/src/bongos/optimizer.js +1 -1
  1105. package/src/bongos/package-registry.js +1 -1
  1106. package/src/bongos/path-match.js +1 -1
  1107. package/src/bongos/permission-path-check.js +3 -3
  1108. package/src/bongos/platform-visibility-gate.js +3 -5
  1109. package/src/bongos/prelaunch-gate.js +7 -6
  1110. package/src/bongos/route-rank-check.js +2 -2
  1111. package/src/bongos/routes/auth.js +15 -2
  1112. package/src/bongos/routes/backup.js +1 -1
  1113. package/src/bongos/routes/builders.js +29 -1
  1114. package/src/bongos/routes/me.js +49 -18
  1115. package/src/bongos/routes/modules.js +29 -9
  1116. package/src/bongos/routes/public.js +3 -72
  1117. package/src/bongos/schema-lag.js +1 -1
  1118. package/src/bongos/sensitive-surfaces.js +1 -1
  1119. package/src/bongos/serve-internal.js +65 -16
  1120. package/src/bongos/software-update.js +2 -2
  1121. package/src/bongos/upgrade-hold.js +3 -3
  1122. package/src/hall-look.js +6 -5
  1123. package/src/module-api.js +3 -3
  1124. package/src/module-loader/catalog.js +1 -1
  1125. package/src/module-loader/error-tally.js +3 -3
  1126. package/src/module-loader/manifest-schema.js +3 -3
  1127. package/src/platform-server.js +10 -0
  1128. package/src/role-responsibilities.js +1 -1
  1129. package/src/stale-timer.js +2 -2
  1130. package/tests/accessibility_replay.mjs +1 -1
  1131. package/tests/activity_rollup_order_db.mjs +1 -1
  1132. package/tests/activity_snapshots_db.mjs +1 -1
  1133. package/tests/adopt_detect.mjs +1 -1
  1134. package/tests/adopt_import.mjs +1 -1
  1135. package/tests/adopt_preflight.mjs +1 -1
  1136. package/tests/adr_0089_scope.mjs +10 -7
  1137. package/tests/adr_0162_citation.mjs +1 -1
  1138. package/tests/adr_0162_gate_citation.mjs +1 -1
  1139. package/tests/agent_invoke.mjs +1 -1
  1140. package/tests/agent_invoke_live.mjs +3 -3
  1141. package/tests/agents_cron_trigger.mjs +2 -2
  1142. package/tests/agents_roster.mjs +1 -1
  1143. package/tests/agents_sync.mjs +4 -4
  1144. package/tests/allow_rule_guard.mjs +20 -20
  1145. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1146. package/tests/api_alias_exceptions.mjs +7 -6
  1147. package/tests/api_artifacts.mjs +214 -0
  1148. package/tests/api_cli_flags.mjs +3 -3
  1149. package/tests/api_client.mjs +56 -54
  1150. package/tests/api_docs.mjs +30 -9
  1151. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1152. package/tests/api_msys_path_repair.mjs +2 -2
  1153. package/tests/architect.mjs +1 -1
  1154. package/tests/art_stage.mjs +2 -2
  1155. package/tests/artifact_audit.mjs +2 -2
  1156. package/tests/atlas.mjs +1 -1
  1157. package/tests/audit_deps.mjs +1 -1
  1158. package/tests/audit_gate.mjs +1 -1
  1159. package/tests/auth_flow_slice1.mjs +3 -3
  1160. package/tests/auth_inactive_builder.mjs +43 -5
  1161. package/tests/auth_session_expiry_db.mjs +16 -4
  1162. package/tests/auth_session_ttl.mjs +23 -0
  1163. package/tests/authorship_audit.mjs +2 -2
  1164. package/tests/autobongos_cadence.mjs +1 -1
  1165. package/tests/autobongos_fence.mjs +1 -1
  1166. package/tests/autobongos_grade_cap.mjs +2 -2
  1167. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1168. package/tests/autobongos_host_access.mjs +3 -3
  1169. package/tests/autobongos_loop.mjs +17 -17
  1170. package/tests/autobongos_service_ps1.mjs +3 -3
  1171. package/tests/autobongos_tweak_lane.mjs +2 -2
  1172. package/tests/autobongos_verify.mjs +2 -2
  1173. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1174. package/tests/autonomy_config_idle.mjs +1 -1
  1175. package/tests/autonomy_daily_checks.mjs +201 -0
  1176. package/tests/autonomy_digest.mjs +1 -1
  1177. package/tests/autonomy_gate.mjs +1 -1
  1178. package/tests/autonomy_gauge.mjs +2 -2
  1179. package/tests/autonomy_runner_identity.mjs +1 -1
  1180. package/tests/backfill_sessions.mjs +8 -8
  1181. package/tests/backfill_subagent_rewards.mjs +1 -1
  1182. package/tests/backfill_task_rewards.mjs +2 -2
  1183. package/tests/backlog_review.mjs +3 -3
  1184. package/tests/baseline_staleness.mjs +2 -2
  1185. package/tests/bfg.mjs +11 -5
  1186. package/tests/bfg_write.mjs +20 -11
  1187. package/tests/blockers_hall.mjs +14 -4
  1188. package/tests/blockers_page_ui.mjs +56 -12
  1189. package/tests/bongos_dispatch.mjs +5 -5
  1190. package/tests/bongos_login.mjs +2 -2
  1191. package/tests/bug_attachment_audit.mjs +1 -1
  1192. package/tests/bug_attachment_recover.mjs +2 -2
  1193. package/tests/bug_triage.mjs +3 -3
  1194. package/tests/build_info.mjs +1 -1
  1195. package/tests/builder_tester_tag.mjs +184 -0
  1196. package/tests/bump_version.mjs +3 -3
  1197. package/tests/canonical_profile_url.mjs +1 -1
  1198. package/tests/capture_error_format.mjs +1 -1
  1199. package/tests/capture_goal_routing.mjs +2 -2
  1200. package/tests/category_advisory_guard.mjs +3 -3
  1201. package/tests/claim_error_surface.mjs +2 -2
  1202. package/tests/claim_from_task_and_home.mjs +1 -1
  1203. package/tests/claim_gate_open_blocker.mjs +7 -4
  1204. package/tests/claim_gate_rebase.mjs +12 -8
  1205. package/tests/claim_recall.mjs +4 -4
  1206. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1207. package/tests/claude_materialize.mjs +68 -68
  1208. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1209. package/tests/cli_allowlist_permissions.mjs +11 -11
  1210. package/tests/cli_dispatcher.mjs +2 -2
  1211. package/tests/cli_err_code.mjs +6 -6
  1212. package/tests/cli_exit_no_abort.mjs +7 -7
  1213. package/tests/cli_lib_formatters.mjs +2 -2
  1214. package/tests/cli_sessions.mjs +5 -5
  1215. package/tests/cli_surface.mjs +15 -15
  1216. package/tests/cli_token_reissue.mjs +2 -2
  1217. package/tests/client_baseurl_guard.mjs +1 -1
  1218. package/tests/client_bundle_route.mjs +35 -4
  1219. package/tests/cloud_bongos_pack.mjs +1 -1
  1220. package/tests/community_leaderboard_db.mjs +1 -1
  1221. package/tests/conductor.mjs +18 -18
  1222. package/tests/conflict_resolve.mjs +14 -16
  1223. package/tests/consumer_layout_boot.mjs +12 -12
  1224. package/tests/context_pack.mjs +6 -6
  1225. package/tests/control_manifest.mjs +4 -4
  1226. package/tests/copy_desk_page_reads.mjs +1 -1
  1227. package/tests/copy_desk_page_release.mjs +192 -0
  1228. package/tests/copy_inventory.mjs +2 -2
  1229. package/tests/core_auto_upgrade.mjs +1 -1
  1230. package/tests/core_move_notice.mjs +2 -2
  1231. package/tests/core_origin_follow.mjs +7 -7
  1232. package/tests/core_pin_sync.mjs +3 -3
  1233. package/tests/core_upgrade_door.mjs +2 -2
  1234. package/tests/core_upgrade_owner_door.mjs +34 -1
  1235. package/tests/core_upgrade_runner.mjs +19 -19
  1236. package/tests/credential_presence.mjs +2 -2
  1237. package/tests/credit_grant.mjs +3 -3
  1238. package/tests/credit_log_single_writer.mjs +5 -5
  1239. package/tests/criterion_ref_status.mjs +2 -2
  1240. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1241. package/tests/cutover_codemod.mjs +2 -4
  1242. package/tests/db_backup_nightly.mjs +1 -1
  1243. package/tests/db_backup_offsite.mjs +1 -1
  1244. package/tests/db_ownership_handover.mjs +2 -2
  1245. package/tests/dead_deps.mjs +3 -3
  1246. package/tests/dependency_advisory.mjs +1 -1
  1247. package/tests/deploy_audit_gate.mjs +4 -4
  1248. package/tests/deploy_divergence_line.mjs +36 -16
  1249. package/tests/deploy_page_projects.mjs +35 -4
  1250. package/tests/dev_lib.mjs +2 -2
  1251. package/tests/dev_windows.mjs +2 -2
  1252. package/tests/diagram_facts_offset.mjs +1 -1
  1253. package/tests/diagram_repo_slug.mjs +1 -1
  1254. package/tests/diff_derived_signals.mjs +2 -2
  1255. package/tests/dns_preflight.mjs +2 -2
  1256. package/tests/do_api.mjs +3 -3
  1257. package/tests/doc_cli_guard.mjs +28 -28
  1258. package/tests/doc_comment_coverage.mjs +1 -1
  1259. package/tests/doc_control_claims.mjs +11 -11
  1260. package/tests/docs_entropy.mjs +2 -2
  1261. package/tests/docs_openapi_route.mjs +8 -6
  1262. package/tests/doctor_hooks.mjs +1 -1
  1263. package/tests/edit_hints.mjs +3 -2
  1264. package/tests/effective_visibility_predicate.mjs +1 -19
  1265. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1266. package/tests/exec_path_guard.mjs +4 -4
  1267. package/tests/executed_closure.mjs +18 -12
  1268. package/tests/file_map.mjs +1 -1
  1269. package/tests/find_untested.mjs +13 -13
  1270. package/tests/first_admin_bootstrap.mjs +1 -1
  1271. package/tests/fitness.mjs +16 -16
  1272. package/tests/fitness_gds_ratchet.mjs +2 -2
  1273. package/tests/fitness_installed_core.mjs +3 -3
  1274. package/tests/fitness_no_raw_nul.mjs +1 -1
  1275. package/tests/fitness_ratchets.mjs +3 -3
  1276. package/tests/fitness_scope_roster.mjs +2 -2
  1277. package/tests/fitness_two_root.mjs +8 -8
  1278. package/tests/fixtures/accessibility-replay.json +5 -5
  1279. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1280. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1281. package/tests/fixtures/page-ledger.mjs +22 -0
  1282. package/tests/fixtures/session-506-digest.json +5 -5
  1283. package/tests/gate_approvals.mjs +50 -0
  1284. package/tests/gate_review.mjs +8 -8
  1285. package/tests/gating_review_retired.mjs +2 -2
  1286. package/tests/gen_freshness.mjs +3 -3
  1287. package/tests/git_guard.mjs +3 -3
  1288. package/tests/git_merge_regen.mjs +41 -65
  1289. package/tests/github_one_trip.mjs +4 -4
  1290. package/tests/github_pick_up.mjs +2 -2
  1291. package/tests/github_push_merge_driver.mjs +1 -1
  1292. package/tests/go_live.mjs +3 -2
  1293. package/tests/goal_category.mjs +1 -1
  1294. package/tests/goal_cli.mjs +2 -2
  1295. package/tests/goal_create_spec_entry.mjs +1 -1
  1296. package/tests/goal_invite_consent.mjs +3 -1
  1297. package/tests/goal_move.mjs +1 -1
  1298. package/tests/goal_working_area.mjs +1 -1
  1299. package/tests/government_agent_asks.mjs +7 -7
  1300. package/tests/government_board_room_copy.mjs +6 -1
  1301. package/tests/government_board_view.mjs +39 -0
  1302. package/tests/government_board_vote_ui.mjs +39 -1
  1303. package/tests/government_config.mjs +2 -2
  1304. package/tests/government_live_proof_shape.mjs +1 -1
  1305. package/tests/government_protected_surfaces.mjs +54 -53
  1306. package/tests/government_require_permission.mjs +9 -1
  1307. package/tests/government_vanilla_boot.mjs +1 -1
  1308. package/tests/government_vocabulary.mjs +2 -2
  1309. package/tests/government_walk.mjs +2 -2
  1310. package/tests/grade_body_limit.mjs +6 -4
  1311. package/tests/grade_correlation_audit.mjs +3 -3
  1312. package/tests/grade_diff_hash.mjs +1 -1
  1313. package/tests/grade_engine_replay.mjs +2 -2
  1314. package/tests/grade_server_authoritative.mjs +1 -1
  1315. package/tests/grade_unavailable_display.mjs +1 -1
  1316. package/tests/grader.mjs +8 -24
  1317. package/tests/grader_generated_provenance.mjs +14 -14
  1318. package/tests/grader_no_artifact.mjs +1 -1
  1319. package/tests/grader_prompt_fencing.mjs +1 -1
  1320. package/tests/grader_quality_window_overflow.mjs +1 -1
  1321. package/tests/grader_reader_lens.mjs +3 -3
  1322. package/tests/grader_regrade_delta.mjs +1 -1
  1323. package/tests/grader_unbacked_score.mjs +2 -2
  1324. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1325. package/tests/hall_asset_cache.mjs +127 -0
  1326. package/tests/hall_audit.mjs +63 -0
  1327. package/tests/hall_board_world.mjs +20 -0
  1328. package/tests/hall_city_card_words.mjs +61 -0
  1329. package/tests/hall_client_request_shape.mjs +5 -1
  1330. package/tests/hall_home_ships_bounded.mjs +160 -0
  1331. package/tests/hall_landing_boot.mjs +15 -2
  1332. package/tests/hall_nav.mjs +33 -0
  1333. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1334. package/tests/hall_oversight_world.mjs +44 -4
  1335. package/tests/hall_palette.mjs +12 -9
  1336. package/tests/hall_preview_security.mjs +1 -1
  1337. package/tests/hall_profile_world.mjs +17 -0
  1338. package/tests/hall_reading_world.mjs +16 -1
  1339. package/tests/hall_roster_world.mjs +2 -1
  1340. package/tests/hall_studio_world.mjs +4 -1
  1341. package/tests/hall_work_history_id.mjs +39 -0
  1342. package/tests/held_tweak_reporting.mjs +4 -4
  1343. package/tests/helpers.mjs +3 -3
  1344. package/tests/home_bounded_reads.mjs +1 -1
  1345. package/tests/home_isolation_guard.mjs +1 -1
  1346. package/tests/hook_core_resolve.mjs +7 -7
  1347. package/tests/hook_user_agents.mjs +1 -1
  1348. package/tests/hooks_drain.mjs +2 -2
  1349. package/tests/host_topology_skips.mjs +1 -1
  1350. package/tests/howto_guide.mjs +1 -1
  1351. package/tests/howto_moments.mjs +3 -3
  1352. package/tests/hub_account_page.mjs +1 -1
  1353. package/tests/idea_capture_grades.mjs +2 -2
  1354. package/tests/idea_develop_spark.mjs +1 -1
  1355. package/tests/idea_filed_via.mjs +2 -2
  1356. package/tests/idea_ideate_full.mjs +1 -1
  1357. package/tests/idea_spark_mark.mjs +1 -1
  1358. package/tests/idea_spark_queue.mjs +1 -1
  1359. package/tests/idea_triage.mjs +1 -1
  1360. package/tests/idea_triage_grade.mjs +3 -3
  1361. package/tests/idea_vote_permission.mjs +113 -0
  1362. package/tests/idea_votes_fold_db.mjs +123 -0
  1363. package/tests/infra_exec_paths.mjs +12 -12
  1364. package/tests/init.mjs +2 -2
  1365. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1366. package/tests/instance_feedback.mjs +9 -9
  1367. package/tests/instance_mismatch_guard.mjs +2 -2
  1368. package/tests/integration_parked_ratchet.mjs +24 -2
  1369. package/tests/intent_retry.mjs +1 -1
  1370. package/tests/interaction_posture.mjs +3 -3
  1371. package/tests/invite_expiry_db.mjs +1 -1
  1372. package/tests/joinability_invite_only.mjs +1 -1
  1373. package/tests/karma_vote_lists.mjs +270 -0
  1374. package/tests/key-card.mjs +2 -2
  1375. package/tests/key-status.mjs +2 -2
  1376. package/tests/knip_ratchet_ambient.mjs +2 -2
  1377. package/tests/known_failing_ratchet.mjs +1 -1
  1378. package/tests/land_watch.mjs +2 -2
  1379. package/tests/landing_legal_pages.mjs +1 -1
  1380. package/tests/landing_page.mjs +2 -2
  1381. package/tests/leaderboard_roles.mjs +4 -1
  1382. package/tests/leak_scan_allowlist.mjs +8 -8
  1383. package/tests/leak_scan_fail_closed.mjs +1 -1
  1384. package/tests/lib_sh_resolution.mjs +9 -9
  1385. package/tests/lifecycle-card.mjs +7 -7
  1386. package/tests/linkify_check.mjs +2 -2
  1387. package/tests/linkify_refs.mjs +1 -1
  1388. package/tests/llm-cache-route.mjs +1 -1
  1389. package/tests/local_preview.mjs +2 -2
  1390. package/tests/main_audit.mjs +3 -3
  1391. package/tests/main_audit_attestation.mjs +1 -1
  1392. package/tests/main_audit_db_roster.mjs +2 -2
  1393. package/tests/main_worktree_busy_reason.mjs +3 -3
  1394. package/tests/markdown_line_endings.mjs +2 -2
  1395. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1396. package/tests/membership_kind_lockstep.mjs +1 -1
  1397. package/tests/memory_isolation.mjs +16 -8
  1398. package/tests/memory_map.mjs +2 -2
  1399. package/tests/memory_pull.mjs +33 -25
  1400. package/tests/merge_driver_register.mjs +3 -3
  1401. package/tests/migration_allocation.mjs +2 -2
  1402. package/tests/migration_namespace.mjs +1 -1
  1403. package/tests/migrations_forward_safe.mjs +1 -1
  1404. package/tests/mingle.mjs +1 -1
  1405. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1406. package/tests/mirror_lineage_proof.mjs +2 -2
  1407. package/tests/mirror_redact.mjs +4 -4
  1408. package/tests/missing_dep_classify.mjs +3 -3
  1409. package/tests/module-scope-map.mjs +22 -22
  1410. package/tests/module_api_lazy.mjs +1 -1
  1411. package/tests/module_assess_docs.mjs +2 -2
  1412. package/tests/module_assess_installs.mjs +3 -3
  1413. package/tests/module_assess_price_parity.mjs +5 -5
  1414. package/tests/module_assess_score.mjs +5 -5
  1415. package/tests/module_assess_security.mjs +4 -4
  1416. package/tests/module_assess_tests.mjs +3 -3
  1417. package/tests/module_assessments_migration.mjs +1 -1
  1418. package/tests/module_catalog.mjs +2 -2
  1419. package/tests/module_cli.mjs +3 -3
  1420. package/tests/module_entitlements.mjs +1 -1
  1421. package/tests/module_error_counts.mjs +1 -1
  1422. package/tests/module_install.mjs +4 -4
  1423. package/tests/module_loader.mjs +3 -1
  1424. package/tests/module_owned_tests.mjs +1 -1
  1425. package/tests/module_release_channels.mjs +1 -1
  1426. package/tests/module_store_howto.mjs +3 -3
  1427. package/tests/module_store_listing.mjs +139 -2
  1428. package/tests/module_store_publish.mjs +4 -4
  1429. package/tests/module_store_publish_route.mjs +1 -1
  1430. package/tests/module_store_reassess.mjs +1 -1
  1431. package/tests/module_store_registry_migration.mjs +1 -1
  1432. package/tests/module_test_runner.mjs +3 -3
  1433. package/tests/module_update.mjs +4 -4
  1434. package/tests/module_upgrade_updates.mjs +1 -1
  1435. package/tests/move_escalation.mjs +2 -2
  1436. package/tests/nav_permission_atoms.mjs +3 -2
  1437. package/tests/needs_rebase.mjs +7 -3
  1438. package/tests/newcomer_floor.mjs +1 -1
  1439. package/tests/next_number.mjs +1 -1
  1440. package/tests/no_artifact_escalation.mjs +3 -3
  1441. package/tests/npm_release_where.mjs +1 -1
  1442. package/tests/oauth_secret.mjs +2 -2
  1443. package/tests/onboard.mjs +6 -6
  1444. package/tests/onboarding_gate.mjs +2 -2
  1445. package/tests/opt_in_skill_modules.mjs +3 -3
  1446. package/tests/own_scope_guard.mjs +1 -1
  1447. package/tests/own_session_revoke.mjs +4 -1
  1448. package/tests/package_core.mjs +10 -11
  1449. package/tests/page_inventory.mjs +5 -5
  1450. package/tests/page_reader.mjs +7 -7
  1451. package/tests/page_tweak_hold.mjs +6 -6
  1452. package/tests/parallel-load.mjs +1 -1
  1453. package/tests/paste_token_api_base.mjs +1 -1
  1454. package/tests/paste_token_session_store.mjs +2 -2
  1455. package/tests/pending_invite_purge_db.mjs +1 -1
  1456. package/tests/permission_path.mjs +1 -1
  1457. package/tests/pin_replay.mjs +1 -1
  1458. package/tests/pin_write_key.mjs +7 -7
  1459. package/tests/plain_cards.mjs +15 -15
  1460. package/tests/pr_assign.mjs +1 -1
  1461. package/tests/pre_push_hook.mjs +3 -3
  1462. package/tests/preflight_checks.mjs +2 -2
  1463. package/tests/prelaunch_gate.mjs +1 -1
  1464. package/tests/privacy_matrix.mjs +1 -1
  1465. package/tests/probe_cache.mjs +6 -6
  1466. package/tests/profile_connections_ui.mjs +4 -3
  1467. package/tests/profile_fields.mjs +11 -1
  1468. package/tests/profile_privacy_owner_view.mjs +1 -1
  1469. package/tests/profile_role_headline.mjs +10 -9
  1470. package/tests/project_admin_console_model.mjs +1 -1
  1471. package/tests/projects_hub.mjs +1 -1
  1472. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1473. package/tests/promote_goal_id.mjs +6 -6
  1474. package/tests/promotion_sweep.mjs +1 -1
  1475. package/tests/provision.mjs +24 -24
  1476. package/tests/provision_account_identity.mjs +2 -2
  1477. package/tests/provision_byo_host.mjs +1 -1
  1478. package/tests/provision_caddy_wiring.mjs +2 -2
  1479. package/tests/provision_disconnect.mjs +2 -2
  1480. package/tests/provision_dns_first.mjs +1 -1
  1481. package/tests/provision_render.mjs +9 -9
  1482. package/tests/provision_repo_private.mjs +3 -3
  1483. package/tests/provision_resource_caps.mjs +5 -5
  1484. package/tests/provision_restart.mjs +3 -3
  1485. package/tests/provision_settings_apply.mjs +7 -7
  1486. package/tests/provision_teardown_address.mjs +2 -2
  1487. package/tests/provisioning_capacity.mjs +5 -5
  1488. package/tests/provisioning_credential_preflight.mjs +1 -1
  1489. package/tests/provisioning_disconnect.mjs +1 -1
  1490. package/tests/provisioning_error_note_scope.mjs +4 -4
  1491. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1492. package/tests/provisioning_planet_physics.mjs +16 -0
  1493. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1494. package/tests/provisioning_settings_env.mjs +1 -1
  1495. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1496. package/tests/public_mirror_export.mjs +1 -1
  1497. package/tests/publish_integration_gate.mjs +2 -2
  1498. package/tests/publish_manifest.mjs +6 -6
  1499. package/tests/publish_watch.mjs +1 -1
  1500. package/tests/push_path_brief.mjs +2 -2
  1501. package/tests/raise.mjs +248 -0
  1502. package/tests/rank_roles_audit.mjs +1 -1
  1503. package/tests/rank_tier_single_source.mjs +2 -2
  1504. package/tests/rate_limit_public.mjs +1 -1
  1505. package/tests/read_default_meter.mjs +2 -2
  1506. package/tests/read_session_export.mjs +1 -1
  1507. package/tests/rebase_gate_set_aside.mjs +1 -1
  1508. package/tests/recall_cli.mjs +1 -1
  1509. package/tests/recall_corpus_health.mjs +3 -2
  1510. package/tests/recall_hints.mjs +1 -1
  1511. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1512. package/tests/redteam_patrol.mjs +2 -2
  1513. package/tests/regrade_actual_minutes.mjs +2 -2
  1514. package/tests/regrade_eligibility.mjs +2 -2
  1515. package/tests/release_core.mjs +2 -2
  1516. package/tests/release_notes.mjs +4 -4
  1517. package/tests/rename_history_restraint.mjs +3 -3
  1518. package/tests/rename_ledger_prose.mjs +6 -6
  1519. package/tests/render_api.mjs +1 -1
  1520. package/tests/render_check.mjs +4 -4
  1521. package/tests/render_deploy.mjs +1 -1
  1522. package/tests/repo_info_binding.mjs +1 -1
  1523. package/tests/repo_map.mjs +5 -5
  1524. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1525. package/tests/reward_mode_surfacing.mjs +1 -1
  1526. package/tests/role_responsibilities.mjs +1 -1
  1527. package/tests/route_permission_check.mjs +1 -1
  1528. package/tests/route_shadow_guard.mjs +1 -1
  1529. package/tests/route_validation.mjs +1 -1
  1530. package/tests/routine_capture_kind.mjs +24 -13
  1531. package/tests/routine_schedule.mjs +51 -9
  1532. package/tests/run_routine.mjs +5 -5
  1533. package/tests/run_routine_two_root.mjs +5 -5
  1534. package/tests/runner_drift.mjs +17 -17
  1535. package/tests/sandbox_stage.mjs +5 -5
  1536. package/tests/scope_map_guard.mjs +7 -7
  1537. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1538. package/tests/scripts_gds_forwarders.mjs +224 -0
  1539. package/tests/scrubber_corpus.mjs +2 -2
  1540. package/tests/seam_wiring_guard.mjs +1 -1
  1541. package/tests/search_ingest.mjs +2 -2
  1542. package/tests/search_ingest_db.mjs +1 -1
  1543. package/tests/search_ingest_nul.mjs +6 -6
  1544. package/tests/seed_verify_criteria.mjs +3 -3
  1545. package/tests/sequence.mjs +3 -3
  1546. package/tests/served_paths_shipped.mjs +3 -3
  1547. package/tests/session_506_regression.mjs +1 -1
  1548. package/tests/session_accessibility.mjs +1 -1
  1549. package/tests/session_caps.mjs +1 -1
  1550. package/tests/session_cost.mjs +1 -1
  1551. package/tests/session_digest.mjs +2 -2
  1552. package/tests/session_eval.mjs +6 -6
  1553. package/tests/session_index.mjs +1 -1
  1554. package/tests/session_records.mjs +4 -4
  1555. package/tests/session_rename_fallback.mjs +2 -2
  1556. package/tests/session_reward_on_land.mjs +7 -149
  1557. package/tests/session_reward_on_land_db.mjs +191 -0
  1558. package/tests/session_reward_reconcile.mjs +6 -88
  1559. package/tests/session_reward_reconcile_db.mjs +132 -0
  1560. package/tests/session_transcript.mjs +1 -1
  1561. package/tests/sessions_kit_pager.mjs +2 -1
  1562. package/tests/setup_device_flow_fallback.mjs +2 -2
  1563. package/tests/setup_smoke.mjs +12 -5
  1564. package/tests/setup_status_facts.mjs +54 -12
  1565. package/tests/ship_autolinkify.mjs +2 -2
  1566. package/tests/ship_automerge_injection.mjs +1 -1
  1567. package/tests/ship_base_flag.mjs +1 -1
  1568. package/tests/ship_broadcast_routing.mjs +1 -1
  1569. package/tests/ship_broadcast_server.mjs +2 -2
  1570. package/tests/ship_builder_model.mjs +1 -1
  1571. package/tests/ship_cannot_lie.mjs +9 -9
  1572. package/tests/ship_card.mjs +2 -2
  1573. package/tests/ship_ci_deploy.mjs +7 -7
  1574. package/tests/ship_error_shape.mjs +1 -1
  1575. package/tests/ship_land_ci_not_started.mjs +3 -3
  1576. package/tests/ship_land_conflict.mjs +3 -3
  1577. package/tests/ship_land_proof.mjs +3 -3
  1578. package/tests/ship_land_red_pr.mjs +5 -5
  1579. package/tests/ship_merge_gate.mjs +14 -14
  1580. package/tests/ship_mode.mjs +1 -1
  1581. package/tests/ship_mode_first_ship.mjs +4 -4
  1582. package/tests/ship_mode_hands_off.mjs +8 -8
  1583. package/tests/ship_post_land_verify.mjs +1 -1
  1584. package/tests/ship_preflight.mjs +19 -19
  1585. package/tests/ship_premerge.mjs +1 -1
  1586. package/tests/ship_publish_error.mjs +2 -2
  1587. package/tests/ship_push_diagnosis.mjs +1 -1
  1588. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1589. package/tests/ship_resume.mjs +4 -4
  1590. package/tests/ship_smoke_gate.mjs +1 -1
  1591. package/tests/ship_upload_skip.mjs +1 -1
  1592. package/tests/ship_upstream_deletion.mjs +1 -1
  1593. package/tests/ship_vendored_instance.mjs +8 -8
  1594. package/tests/ship_visual_regrade.mjs +3 -3
  1595. package/tests/ship_zero_commit.mjs +1 -1
  1596. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1597. package/tests/skill_friction_kind.mjs +1 -1
  1598. package/tests/skill_grade_recover.mjs +1 -1
  1599. package/tests/skill_grader_health.mjs +1 -1
  1600. package/tests/skill_lint.mjs +1 -1
  1601. package/tests/skill_menu_ruling.mjs +1 -1
  1602. package/tests/skill_preflight.mjs +7 -7
  1603. package/tests/skip_is_not_pass.mjs +22 -1
  1604. package/tests/smoke_dependencies_witness.mjs +2 -2
  1605. package/tests/smoke_preflight.mjs +1 -1
  1606. package/tests/smoke_target.mjs +2 -2
  1607. package/tests/smoke_write_contract.mjs +2 -2
  1608. package/tests/sound_player.mjs +8 -8
  1609. package/tests/source_text_test_ratchet.mjs +97 -0
  1610. package/tests/speciality_corpus_scope.mjs +1 -1
  1611. package/tests/speciality_session_skills.mjs +1 -1
  1612. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1613. package/tests/stale_timer.mjs +3 -3
  1614. package/tests/stale_worktrees.mjs +1 -1
  1615. package/tests/start_env_guard.mjs +1 -1
  1616. package/tests/start_goal_first.mjs +3 -3
  1617. package/tests/start_inbox_count.mjs +1 -1
  1618. package/tests/start_rebase_warning.mjs +1 -1
  1619. package/tests/status_default_version.mjs +3 -3
  1620. package/tests/status_mirror_sync.mjs +1 -1
  1621. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1622. package/tests/stop_refcheck.mjs +1 -1
  1623. package/tests/strand_watch.mjs +1 -1
  1624. package/tests/stranded_rows.mjs +1 -1
  1625. package/tests/stuck_detector.mjs +14 -14
  1626. package/tests/sweep_app_account.mjs +3 -3
  1627. package/tests/task_cli.mjs +2 -2
  1628. package/tests/task_detail_ui.mjs +11 -1
  1629. package/tests/task_discipline_required.mjs +2 -2
  1630. package/tests/task_list_paging.mjs +1 -1
  1631. package/tests/task_visual_slots.mjs +2 -2
  1632. package/tests/terms_acceptance.mjs +1 -1
  1633. package/tests/terms_grandfather_db.mjs +1 -1
  1634. package/tests/test_path_guard.mjs +1 -1
  1635. package/tests/triage_development.mjs +1 -1
  1636. package/tests/tweak_batch_apply.mjs +2 -2
  1637. package/tests/tweak_land_heal.mjs +3 -3
  1638. package/tests/tweak_unattended.mjs +3 -3
  1639. package/tests/ui_design_skills.mjs +2 -2
  1640. package/tests/unit_report_status.mjs +2 -2
  1641. package/tests/unit_runner_serial.mjs +2 -2
  1642. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1643. package/tests/update_channel.mjs +2 -2
  1644. package/tests/update_channel_db.mjs +4 -4
  1645. package/tests/update_subscription_engine.mjs +26 -26
  1646. package/tests/update_sweep_home.mjs +14 -14
  1647. package/tests/upgrade.mjs +11 -11
  1648. package/tests/upgrade_artist_gate.mjs +4 -4
  1649. package/tests/upgrade_commit_identity.mjs +2 -2
  1650. package/tests/upgrade_migrate.mjs +7 -7
  1651. package/tests/upgrade_operator.mjs +2 -2
  1652. package/tests/upgrade_outcome.mjs +2 -2
  1653. package/tests/upgrade_persist_pin.mjs +5 -5
  1654. package/tests/upkeep_home.mjs +1 -1
  1655. package/tests/version_close.mjs +2 -2
  1656. package/tests/version_close_cli.mjs +2 -2
  1657. package/tests/version_close_route.mjs +1 -1
  1658. package/tests/version_literals.mjs +23 -23
  1659. package/tests/visual_review.mjs +5 -5
  1660. package/tests/wedge_remedy.mjs +5 -5
  1661. package/tests/welcome_boot.mjs +116 -0
  1662. package/tests/welcome_boot_browser.mjs +271 -0
  1663. package/tests/wizard_born_first_board.mjs +3 -3
  1664. package/tests/wizard_demo.mjs +1 -1
  1665. package/tests/wizard_one_page.mjs +4 -3
  1666. package/tests/wizard_physics.mjs +3 -1
  1667. package/tests/wizard_physics_more.mjs +42 -3
  1668. package/tests/work_title_wrap.mjs +1 -1
  1669. package/tests/workflow_exec_paths.mjs +6 -6
  1670. package/tests/worktree_claim_guard.mjs +1 -1
  1671. package/tests/worktree_helper.mjs +2 -2
  1672. package/tests/write_validation_gaps.mjs +3 -3
  1673. package/scripts/gds/api.sh +0 -6
  1674. package/scripts/gds/artifact-staleness.js +0 -267
  1675. package/scripts/gds/audit-exports.js +0 -128
  1676. package/scripts/gds/classify-discipline.js +0 -153
  1677. package/scripts/gds/codemod-rename-src-gds.js +0 -145
  1678. package/scripts/gds/coreB-carve-proof.sh +0 -725
  1679. package/scripts/gds/goal-names.js +0 -102
  1680. package/scripts/gds/rename-goals.js +0 -109
  1681. package/scripts/gds/resolve-skill-model.js +0 -57
  1682. package/scripts/gds/security-baseline-check.sh +0 -180
  1683. package/scripts/gds/seed-adopt-tasks.js +0 -75
  1684. package/scripts/gds/seed-api-contract-goal-tasks.js +0 -141
  1685. package/scripts/gds/seed-board-room-tasks.js +0 -196
  1686. package/scripts/gds/seed-bongos-app-tasks.js +0 -294
  1687. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +0 -81
  1688. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +0 -100
  1689. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +0 -307
  1690. package/scripts/gds/seed-bongos-module-system-tasks.js +0 -346
  1691. package/scripts/gds/seed-bongos-tasks.js +0 -214
  1692. package/scripts/gds/seed-bongos-v1-seo-tasks.js +0 -104
  1693. package/scripts/gds/seed-bv1-community-tasks.js +0 -131
  1694. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +0 -133
  1695. package/scripts/gds/seed-bv1-profile-page-tasks.js +0 -161
  1696. package/scripts/gds/seed-bv1-r01-delta-tasks.js +0 -154
  1697. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +0 -277
  1698. package/scripts/gds/seed-gds-v4-tasks.js +0 -624
  1699. package/scripts/gds/seed-governance-tasks.js +0 -340
  1700. package/scripts/gds/seed-medusa-tasks.js +0 -440
  1701. package/scripts/gds/seed-module-upstreaming.js +0 -219
  1702. package/scripts/gds/seed-productization-tasks.js +0 -235
  1703. package/scripts/gds/seed-project-admin-console-tasks.js +0 -88
  1704. package/scripts/gds/seed-provisioning-tasks.js +0 -83
  1705. package/scripts/gds/seed-strict-versioning-tasks.js +0 -275
  1706. package/scripts/gds/seed-v2-world-tasks.js +0 -283
  1707. package/scripts/gds/spike-task-map.js +0 -899
  1708. package/scripts/migrate_cost_ledger.sh +0 -178
  1709. package/scripts/status-probe.mjs +0 -213
  1710. package/src/bongos/uptime-poller.js +0 -93
  1711. package/tests/artifact_staleness.mjs +0 -207
  1712. package/tests/goal_names.mjs +0 -120
  1713. package/tests/government_fold_bench.mjs +0 -50
  1714. package/tests/spike_task_map.mjs +0 -422
  1715. package/tests/status-probe.mjs +0 -89
  1716. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1717. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1718. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1719. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -0,0 +1,1090 @@
1
+ #!/usr/bin/env node
2
+ // Builder start — what can I claim right now?
3
+ //
4
+ // Usage:
5
+ // node scripts/bongos/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 rankCrossDisciplineRecommendations in modules/lifecycle/db-tasks.js
49
+ // (the canonical server-side home for this logic — kept in sync deliberately;
50
+ // start.js is a pure HTTP 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, errCode, errDetails, requireSession, fmtUsd, printOnboardingNudge, printCostWarning, printNeedsNudge, hallBase, API_BASE, rewardPolicy, costPlusOnlyNote, isDispatcherIncompatError, cardFlagsFromMe } = require('./cli-lib');
56
+ const { plainCardLines } = require('./plain-cards');
57
+ const { contextPack, formatContextPackCompact } = require('./context-pack');
58
+ const { depsFinding } = require('./preflight');
59
+
60
+ // task 1284: the card shows only the top N claimable rows. The table is the bulk
61
+ // of the widget HTML the model relays verbatim, so fewer rows = fewer tokens +
62
+ // faster render; the true total sits in the header and a "N more — show all"
63
+ // affordance covers the rest. --json is unchanged (full list for the runner).
64
+ const CARD_ROWS = 5;
65
+
66
+ // ---------- header widget helpers ----------
67
+
68
+ // Compact ascii progress bar. Width 10. Filled = █, empty = ░.
69
+ function progressBar(percent, width = 10) {
70
+ const p = Math.max(0, Math.min(100, Number(percent) || 0));
71
+ const filled = Math.round((p / 100) * width);
72
+ return '█'.repeat(filled) + '░'.repeat(width - filled);
73
+ }
74
+
75
+ function formatVersionsRow(progress) {
76
+ if (!Array.isArray(progress) || progress.length === 0) return null;
77
+ // Only show versions currently building (status==='building').
78
+ // Fall back to non-shipped if none are flagged building.
79
+ let active = progress.filter((v) => v.status === 'building');
80
+ if (active.length === 0) active = progress.filter((v) => v.status !== 'shipped');
81
+ if (active.length === 0) return null;
82
+ const parts = active.map((v) => `${v.version_id} ${progressBar(v.percent_complete)} ${v.percent_complete}%`);
83
+ return parts.join(' · ');
84
+ }
85
+
86
+ function formatCostRow(cost) {
87
+ if (!cost || typeof cost !== 'object') return null;
88
+ const spent = Number(cost.total_usd) || 0;
89
+ const credits = Number(cost.total_value_credits) || 0;
90
+ // No verdict. The old line computed `credits >= spent` and printed
91
+ // "value > cost ✓" — comparing unitless reward drachmae against USD, so it
92
+ // was green by unit mismatch, not by economics (spike #482 audit, F2). It was
93
+ // also resting on an incomplete cost figure: cost_log captures almost no LLM
94
+ // spend (audit F1; api category was $0.60). Until spend is captured honestly
95
+ // (#483/#486) and given a real value basis, we show the two ledgers plainly
96
+ // and labelled for what they are — logged spend vs reward credits — and let
97
+ // them stand without a manufactured ✓/✗.
98
+ return `${fmtUsd(spent)} logged spend · ${credits}c reward shipped`;
99
+ }
100
+
101
+ // inboxOpenCount — how many ideas are OPEN in the inbox, from a GET /inbox response.
102
+ //
103
+ // WHY THIS IS NOT ideas.length (task 1003454). GET /inbox answers
104
+ // { ideas, open_count }, where `ideas` is a PAGE (default 50 rows) and
105
+ // `open_count` is the real total, counted server-side under the same rank gate
106
+ // as the rows. Reading the array length therefore reported the page size: the
107
+ // card said "50 ideas in inbox" while the payload said 99, and once the queue
108
+ // passed one page the figure pinned at exactly 50 forever — a number that looks
109
+ // plausible, never moves, and understates the backlog the card exists to make
110
+ // visible. capture.js already destructured open_count correctly, which is what
111
+ // made this an oversight rather than a convention.
112
+ //
113
+ // The page length stays as a FALLBACK so an older core that predates open_count
114
+ // still renders a figure rather than "N/A". Returns null when neither is
115
+ // readable, which the callers render as "ideas: N/A".
116
+ function inboxOpenCount(inboxRes) {
117
+ if (!inboxRes || !inboxRes.ok) return null;
118
+ const data = inboxRes.data;
119
+ if (data && typeof data.open_count === 'number') return data.open_count;
120
+ if (data && Array.isArray(data.ideas)) return data.ideas.length;
121
+ if (data && typeof data.count === 'number') return data.count;
122
+ return null;
123
+ }
124
+
125
+ function formatRecentRow({ recentShipped, inboxCount, blockerCount }) {
126
+ const bits = [];
127
+ // "1 ship in last 24h" — recent_shipped returns tasks shipped within
128
+ // a recent window; we re-filter to strictly <24h for the header.
129
+ if (Array.isArray(recentShipped)) {
130
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
131
+ const last24 = recentShipped.filter((t) => {
132
+ const ts = t.shipped_at ? Date.parse(t.shipped_at) : 0;
133
+ return ts && ts >= cutoff;
134
+ }).length;
135
+ bits.push(`${last24} ship${last24 === 1 ? '' : 's'} in last 24h`);
136
+ } else {
137
+ bits.push('ships: N/A');
138
+ }
139
+ bits.push(inboxCount == null ? 'ideas: N/A' : `${inboxCount} idea${inboxCount === 1 ? '' : 's'} in inbox`);
140
+ bits.push(blockerCount == null ? 'blockers: N/A' : `${blockerCount} open blocker${blockerCount === 1 ? '' : 's'}`);
141
+ return bits.join(' · ');
142
+ }
143
+
144
+ // ---------- card helpers (task 1273) ----------
145
+ // The default /builder-start view is a single deterministic "card" rendered as
146
+ // markdown: a quiet status line, identity, holdings, a clean claimable table,
147
+ // and a next-step line. Same shape every session — the skill relays this stdout
148
+ // verbatim, which is what removes the per-session re-summarizing drift.
149
+
150
+ // Shared status selection — single source of truth for what the quiet status
151
+ // line shows, so the markdown line and the widget render the same thing.
152
+ // Surfaces the versions with real momentum: drop not-yet-started (0%) ones,
153
+ // lead with the most-progressed, so a dormant planning version doesn't crowd
154
+ // out the one actually being built.
155
+ function statusParts({ progress, recentShipped, inboxCount, blockerCount }) {
156
+ let versions = [];
157
+ if (Array.isArray(progress) && progress.length) {
158
+ let active = progress.filter((v) => v.status === 'building');
159
+ if (active.length === 0) active = progress.filter((v) => v.status !== 'shipped');
160
+ versions = active
161
+ .filter((v) => Number(v.percent_complete) > 0)
162
+ .sort((a, b) => Number(b.percent_complete) - Number(a.percent_complete))
163
+ .slice(0, 2)
164
+ .map((v) => ({ id: v.version_id, pct: Number(v.percent_complete) }));
165
+ }
166
+ let ships24 = null;
167
+ if (Array.isArray(recentShipped)) {
168
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
169
+ ships24 = recentShipped.filter((t) => t.shipped_at && Date.parse(t.shipped_at) >= cutoff).length;
170
+ }
171
+ return { versions, ships24, ideas: inboxCount, blockers: blockerCount };
172
+ }
173
+
174
+ // One muted line of ambient status (markdown). Italic so the feed renders it
175
+ // quiet. null if empty.
176
+ function quietStatusLine(header) {
177
+ const { versions, ships24, ideas, blockers } = statusParts(header);
178
+ const parts = [];
179
+ for (const v of versions) parts.push(`${v.id} ${progressBar(v.pct, 8)} ${v.pct}%`);
180
+ if (ships24 != null) parts.push(`${ships24} ship${ships24 === 1 ? '' : 's'}/24h`);
181
+ if (ideas != null) parts.push(`${ideas} idea${ideas === 1 ? '' : 's'} in inbox`);
182
+ if (blockers != null) parts.push(`${blockers} open blocker${blockers === 1 ? '' : 's'}`);
183
+ if (parts.length === 0) return null;
184
+ return surface.em(parts.join(' · '));
185
+ }
186
+
187
+ // Calibrated estimate, compact: ~8m / ~2h / ~1.5h.
188
+ function estimateShort(t) {
189
+ const m = t.est_minutes_calibrated != null ? t.est_minutes_calibrated : t.est_minutes;
190
+ if (m == null) return '—';
191
+ if (m < 60) return `~${m}m`;
192
+ const h = m / 60;
193
+ return Number.isInteger(h) ? `~${h}h` : `~${h.toFixed(1)}h`;
194
+ }
195
+
196
+ function clip(s, n) {
197
+ s = String(s == null ? '' : s).replace(/\s+/g, ' ').trim();
198
+ return s.length > n ? s.slice(0, n - 1) + '…' : s;
199
+ }
200
+
201
+ // Escape pipes so a title can't break the markdown table.
202
+ function cell(s) {
203
+ return String(s == null ? '' : s).replace(/\|/g, '\\|');
204
+ }
205
+
206
+ // Per-column values, shared by the markdown table and the widget. Version
207
+ // (V2 / GDS-V4) is its own column; Type is the work lane (Engineer / Artist /
208
+ // Ideator), its own column rather than baked into the title.
209
+ // task 1003936: ONE word for this axis — Role, per ADR 0174 Decision 5. The hall's
210
+ // copy of this lives in modules/hall-ui/public/dom-utils.js (OTB.roleLabel); this
211
+ // card is a separate runtime and cannot read it, so the word is restated here and
212
+ // nowhere else in this file. 'ui' keeps its upper case, as the hall's does.
213
+ const ROLE_AXIS_LABEL = 'Role';
214
+ function roleLabel(t) {
215
+ const d = t.discipline;
216
+ if (!d || d === 'unclassified') return '';
217
+ return d === 'ui' ? 'UI' : d.charAt(0).toUpperCase() + d.slice(1);
218
+ }
219
+ // Per-lane accent — the OTB palette (sea / terracotta / olive); mid-ramp hexes
220
+ // that read in both light and dark. Colours the Type column so the work lane
221
+ // reads at a glance (task 1273 follow-up: "spice up the view").
222
+ function disciplineColor(d) {
223
+ if (d === 'engineer') return '#1D9E75'; // sea-teal
224
+ if (d === 'artist') return '#D85A30'; // terracotta
225
+ if (d === 'ideator') return '#639922'; // olive
226
+ return '#888780'; // unclassified — neutral gray
227
+ }
228
+ function whatItIs(t) {
229
+ return clip(t.title, 64);
230
+ }
231
+
232
+ // The claimable table — # / Version / Type / Reward / Est. / What it is.
233
+ // Ids are emitted as hall links (renders as a clean #N) — a bare "#NNN" in a
234
+ // relayed chat message autolinks to GitHub and 404s (CLAUDE.md ref rule).
235
+ const surface = require('./surface');
236
+ const startGoals = require('./start-goals');
237
+ const HALL_TASK = `${hallBase()}#/task/`;
238
+ function claimableTable(rows, rewardFromServer, goals) {
239
+ // On a cost-plus-only instance the Reward column is an advertised estimate that
240
+ // is never paid — say so in the header so the column can't read as a promise,
241
+ // and footnote what IS paid below the table (task 1002469).
242
+ const perTask = rewardPolicy(rewardFromServer).perTaskCredit;
243
+ const rewardHead = perTask ? 'Reward' : 'Reward (est.)';
244
+ const headers = ['#', 'Version', ROLE_AXIS_LABEL, rewardHead, 'Est.', 'What it is'];
245
+ const rowCells = (t) => [
246
+ surface.taskRef(t.id, HALL_TASK),
247
+ cell(t.version_id || '?'),
248
+ cell(roleLabel(t) || '—'),
249
+ `${t.credits_reward ?? 0}c`,
250
+ estimateShort(t),
251
+ cell(whatItIs(t)),
252
+ ];
253
+ // task 1002852: one table per goal, each under its goal's name; goal-less work
254
+ // last under "Other work". An empty goal list (a failed read) still groups by id.
255
+ const out = [];
256
+ for (const g of startGoals.groupByGoal(rows, goals)) {
257
+ if (out.length) out.push('');
258
+ out.push(surface.strong(g.title) + (g.joined ? ' · your goal' : ''), surface.table(headers, g.rows.map(rowCells)));
259
+ }
260
+ const cpNote = costPlusOnlyNote(rewardFromServer);
261
+ if (cpNote) out.push('', surface.em(cpNote));
262
+ return out.join('\n');
263
+ }
264
+
265
+ // ---------- widget renderer (task 1273) ----------
266
+ // `--widget` emits this self-contained HTML on stdout; the skill pipes it
267
+ // straight to the app's widget renderer (show_widget). Script-owned markup =
268
+ // the same card every time, app-native. Falls back to the markdown card when
269
+ // the client can't draw widgets. Design system: flat, 0.5px borders, CSS
270
+ // theme vars (light/dark), Tabler icons, no emoji.
271
+ const hesc = (s) => String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
272
+ const jsq = (s) => String(s == null ? '' : s).replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, ' ');
273
+
274
+ function miniBar(pct) {
275
+ // Fill tinted OTB sea-teal so the status line carries a little of the brand.
276
+ // Class-based (task 1279 efficiency pass): the .bs-* rules live in WIDGET_STYLE,
277
+ // so this markup is only meaningful inside the widget renderWidget emits.
278
+ return `<span class="bs-bar"><span class="bs-barfill" style="width:${pct}%;"></span></span>`;
279
+ }
280
+
281
+ // ---------- owed-rebase warning (ADR 0120 part 5) ----------
282
+ // The builder's un-landed confirmed tasks the publish-reconciler flagged
283
+ // needs_rebase (part 2). They GATE new claims (part 3: claimTask refuses with
284
+ // REBASE_REQUIRED) and their per-task reward now lands only on ship (part 1),
285
+ // so this is the single most urgent thing to show at session start — rendered
286
+ // prominently, before the claimable table, in both the markdown card and the
287
+ // widget. /me carries them as `needs_rebase_tasks` (each { id, title, … }).
288
+ // Refs use the `task N` form, NEVER a bare "#N" (a bare #N in relayed chat
289
+ // autolinks to GitHub issues and 404s — the CLAUDE.md linkify rule).
290
+
291
+ // Normalize the /me list into a small render model, or null when nothing is
292
+ // owed. Shared by the markdown + widget renderers and unit-tested directly
293
+ // (no live server needed).
294
+ function rebaseWarningModel(needsRebaseTasks) {
295
+ const owed = Array.isArray(needsRebaseTasks)
296
+ ? needsRebaseTasks.filter((t) => t && t.id != null)
297
+ : [];
298
+ if (owed.length === 0) return null;
299
+ const n = owed.length;
300
+ return {
301
+ count: n,
302
+ refs: owed.map((t) => `task ${t.id}`).join(', '),
303
+ noun: n === 1 ? 'task' : 'tasks',
304
+ pronoun: n === 1 ? 'it' : 'them',
305
+ };
306
+ }
307
+
308
+ // The markdown warning line (prominent, before the claimable table), or null
309
+ // when nothing is owed.
310
+ function rebaseWarningMarkdown(needsRebaseTasks) {
311
+ const w = rebaseWarningModel(needsRebaseTasks);
312
+ if (!w) return null;
313
+ return `⚠️ ${surface.strong('Land owed — your queue is GATED.')} ${w.count} ${w.noun} can't land and block new claims`
314
+ + ` until you ${surface.code('git merge origin/main')} + re-ship (or ${surface.code(surface.action('release'))}) ${w.pronoun}: ${w.refs}.`
315
+ + ' Merge, never rebase — a published branch that is rewritten cannot be pushed again (task 1002788).';
316
+ }
317
+
318
+ // The widget warning block (Tabler alert icon, danger-tinted), or '' when none.
319
+ function rebaseWarningWidget(needsRebaseTasks) {
320
+ const w = rebaseWarningModel(needsRebaseTasks);
321
+ if (!w) return '';
322
+ return `<div class="bs-warn"><i class="ti ti-alert-triangle" aria-hidden="true"></i>`
323
+ + `<span><strong>Land owed — your queue is GATED.</strong> ${w.count} ${w.noun} can't land and block new claims until you <code>git merge origin/main</code> + re-ship (or /builder-release) ${w.pronoun}: ${hesc(w.refs)}. Merge, never rebase — a published branch that is rewritten cannot be pushed again (task 1002788).</span></div>`;
324
+ }
325
+
326
+ // Run console.log-based helpers (printCostWarning/printOnboardingNudge) without
327
+ // polluting stdout (which must be pure HTML in --widget mode); return the lines.
328
+ function captureLog(fn) {
329
+ const orig = console.log;
330
+ const lines = [];
331
+ console.log = (...a) => lines.push(a.join(' '));
332
+ try { fn(); } finally { console.log = orig; }
333
+ return lines;
334
+ }
335
+
336
+ // task 1282: reinforce the relay contract IN-BAND, not just in the skill. The
337
+ // rule — render/print the card verbatim, then stop; don't rebuild it into prose
338
+ // + tables + a recommendation — used to live ONLY in SKILL.md (advisory), so a
339
+ // model in old habits (or a stale checkout's old skill) reverted to hand-built
340
+ // tables. This emits a one-line `[otb-card]` directive on STDERR (stdout stays
341
+ // pure HTML/markdown, so the show_widget pipe + the skill's first-char branch
342
+ // are untouched). The skill treats `[otb-card]` stderr lines as instructions
343
+ // for itself and never relays them to the user. Mirrors the ship card.
344
+ const CARD_DIRECTIVE = {
345
+ 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.',
346
+ 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.',
347
+ };
348
+ function emitCardDirective(form) {
349
+ // Addressed to the model, not the reader. A terminal user has no card to relay and no
350
+ // show_widget to call, so this line is pure confusion there (task 1003680).
351
+ if (surface.isTerminal()) return;
352
+ process.stderr.write(CARD_DIRECTIVE[form] + '\n');
353
+ }
354
+
355
+ // task 1279 efficiency pass: the /builder-start widget used to inline a full
356
+ // style="…" on every one of its ~30+ elements — the 7×N claimable grid was the
357
+ // bulk — making the HTML the agent must relay verbatim ~18.7KB. Hoisting the
358
+ // repeated rules into one class block (the pattern the ship card already uses)
359
+ // cuts that markup substantially with byte-identical rendering. Classes are
360
+ // `.bs-*` (builder-start) so they can't collide with the ship card's `.cc-*`.
361
+ const WIDGET_STYLE = `<style>
362
+ .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;}
363
+ .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);}
364
+ .bs-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
365
+ .bs-brand{display:inline-flex;align-items:center;gap:8px;}
366
+ .bs-title{font-size:16px;font-weight:500;}
367
+ .bs-title i{font-size:16px;vertical-align:-2px;margin-right:6px;color:#D85A30;}
368
+ .bs-meta{font-size:13px;color:var(--color-text-secondary);}
369
+ .bs-status{font-size:13px;color:var(--color-text-secondary);margin-top:8px;display:flex;flex-wrap:wrap;gap:4px 12px;align-items:center;}
370
+ .bs-dot{color:var(--color-text-tertiary);}
371
+ .bs-bar{display:inline-block;width:34px;height:5px;border-radius:3px;background:var(--color-border-tertiary);overflow:hidden;vertical-align:middle;}
372
+ .bs-barfill{display:block;height:100%;background:#1D9E75;}
373
+ .bs-warn{display:flex;gap:8px;align-items:flex-start;font-size:13px;margin-top:8px;padding:8px 10px;border-radius:var(--border-radius-md);background:var(--color-background-danger);color:var(--color-text-danger);}
374
+ .bs-warn i{font-size:15px;flex:none;margin-top:1px;}
375
+ .bs-line{font-size:13px;color:var(--color-text-secondary);margin-top:8px;}
376
+ .bs-line i{font-size:14px;vertical-align:-2px;margin-right:4px;}
377
+ .bs-holditem{margin-top:4px;padding-left:18px;}
378
+ .bs-link{color:var(--color-text-secondary);}
379
+ .bs-menuh{font-size:13px;color:var(--color-text-primary);margin-top:14px;margin-bottom:2px;font-weight:500;}
380
+ .bs-table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:13px;margin-top:4px;}
381
+ .bs-thead{text-align:left;color:var(--color-text-tertiary);font-size:12px;}
382
+ .bs-th{padding:0 6px 4px;font-weight:400;}
383
+ .bs-tr{cursor:pointer;}
384
+ .bs-group td{padding:10px 0 4px;font-size:12px;font-weight:500;color:var(--color-text-secondary);}
385
+ .bs-td{padding:7px 6px;border-top:0.5px solid var(--color-border-tertiary);}
386
+ .bs-id{color:var(--color-text-secondary);font-family:var(--font-mono);font-size:12px;}
387
+ .bs-nowrap{white-space:nowrap;}
388
+ .bs-ellip{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
389
+ .bs-ellip-sub{color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
390
+ .bs-sub{color:var(--color-text-secondary);}
391
+ .bs-lane{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:middle;}
392
+ .bs-foot{font-size:13px;color:var(--color-text-tertiary);margin-top:12px;}
393
+ </style>`;
394
+
395
+ function renderWidget({ builder, claims, claimable, total, streak, recommendations, header, routingByPreference, preferred, filters, readyToClose, needsRebaseTasks, goals, yourGoals }) {
396
+ const b = builder || {};
397
+ // ADR 0120 part 5: the owed-rebase gate warning, rendered at the top of the
398
+ // card (before status/holdings) since it blocks new claims. '' when none owed.
399
+ const rebaseRow = rebaseWarningWidget(needsRebaseTasks);
400
+ // Streak badge — warm amber, the one bold pop of colour + the motivational
401
+ // stat. Shown only on an active (>0) streak; tooltip carries the record.
402
+ // (Singular element — left inline; the savings live in the repeated grid.)
403
+ const streakBadge = (streak && Number(streak.current) > 0)
404
+ ? `<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>`
405
+ : '';
406
+ const rank = b.rank ? b.rank[0].toUpperCase() + b.rank.slice(1) : 'Thetes';
407
+ const disc = (b.preferred_disciplines && b.preferred_disciplines.length) ? b.preferred_disciplines.join(' + ') : 'all disciplines';
408
+ const credits = Number(b.total_credits || 0).toLocaleString();
409
+ const TH = (label) => `<th class="bs-th">${label}</th>`;
410
+ const TD = (inner, cls = '') => `<td class="bs-td${cls ? ' ' + cls : ''}">${inner}</td>`;
411
+
412
+ // status line
413
+ const { versions, ships24, ideas, blockers } = statusParts(header);
414
+ const sBits = [];
415
+ for (const v of versions) sBits.push(`${hesc(v.id)} ${miniBar(v.pct)} ${v.pct}%`);
416
+ if (ships24 != null) sBits.push(`${ships24} ship${ships24 === 1 ? '' : 's'}/24h`);
417
+ if (ideas != null) sBits.push(`${ideas} idea${ideas === 1 ? '' : 's'}`);
418
+ if (blockers != null) sBits.push(`${blockers} blocker${blockers === 1 ? '' : 's'}`);
419
+ const statusRow = sBits.length
420
+ ? `<div class="bs-status">${sBits.join('<span class="bs-dot">·</span>')}</div>`
421
+ : '';
422
+
423
+ // holdings — each held task gets quick actions off it (ship / release /
424
+ // open). Parallel sessions under one builder are normal, so this informs.
425
+ const hallUrl = (id) => `${hallBase()}#/task/${encodeURIComponent(id)}`;
426
+ const dot = '<span class="bs-dot"> · </span>';
427
+ const act = (label, msg) => `<a href="#" onclick="event.preventDefault();sendPrompt('${jsq(msg)}')" class="bs-link">${label} ↗</a>`;
428
+ 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>`;
429
+ let holdings = '';
430
+ if (claims.length === 1) {
431
+ const c = claims[0];
432
+ 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>`;
433
+ } else if (claims.length > 1) {
434
+ const items = claims.map((c) => `<div class="bs-holditem">#${hesc(c.task_id)} — ${hesc(clip(c.title, 38))}${dot}${actionsFor(c)}</div>`).join('');
435
+ holdings = `<div class="bs-line"><i class="ti ti-bookmark" aria-hidden="true"></i>Holding ${claims.length} claims (parallel sessions OK):${items}</div>`;
436
+ }
437
+
438
+ // version-close banner (rare, Archon action)
439
+ const closeBanner = (readyToClose || []).map((s) =>
440
+ `<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>`
441
+ ).join('');
442
+
443
+ // menu header note
444
+ const matched = routingByPreference ? ` matched to ${hesc(preferred.join(' + '))}` : '';
445
+ const fBits = [
446
+ filters.version && `in ${filters.version}`,
447
+ filters.discipline && `discipline=${filters.discipline}`,
448
+ filters.fit && `fit=${filters.fit}`,
449
+ ].filter(Boolean);
450
+ const fNote = fBits.length ? ` (${hesc(fBits.join(', '))})` : '';
451
+
452
+ // rows — click to claim. Columns: # / Version / Type / Reward /
453
+ // Est. / What it is (the work lane is its own column, not baked into the title).
454
+ const taskRow = (t) => {
455
+ const claimMsg = jsq(`Claim task ${t.id}`);
456
+ const titleAttr = hesc(`Claim #${t.id}: ${t.title || ''}`);
457
+ const d = t.discipline;
458
+ const laneDot = (d && d !== 'unclassified')
459
+ ? `<span class="bs-lane" style="background:${disciplineColor(d)};"></span>`
460
+ : '';
461
+ 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}')}">`
462
+ + TD(`#${hesc(t.id)}`, 'bs-id')
463
+ + TD(hesc(t.version_id || '?'), 'bs-nowrap')
464
+ + TD(`${laneDot}${hesc(roleLabel(t) || '—')}`, 'bs-ellip-sub')
465
+ + TD(hesc((t.credits_reward ?? 0) + 'c'))
466
+ + TD(hesc(estimateShort(t)), 'bs-sub')
467
+ + TD(hesc(t.title || ''), 'bs-ellip')
468
+ + `</tr>`;
469
+ };
470
+ // task 1002852: the same rows, grouped under each task's goal ("Other work" last).
471
+ const rows = startGoals.groupByGoal(claimable, goals).map((g) =>
472
+ `<tr class="bs-group"><td colspan="6">${hesc(g.title)}${g.joined ? '<span class="bs-sub"> · your goal</span>' : ''}</td></tr>`
473
+ + g.rows.map(taskRow).join('')).join('');
474
+ // task 1002852: the goals this builder joined, ABOVE the table (never instead of it).
475
+ const goalsBlock = yourGoals.goals.length
476
+ ? `<div class="bs-menuh">Your goals</div>${yourGoals.goals.map((g) =>
477
+ `<div class="bs-line"><i class="ti ti-target" aria-hidden="true"></i>${hesc(clip(g.title, 60))}<span class="bs-dot"> · </span><span class="bs-sub">${hesc(startGoals.claimableWord(g.claimable))}</span></div>`).join('')}${yourGoals.more ? `<div class="bs-line bs-sub">and ${yourGoals.more} more</div>` : ''}`
478
+ : '';
479
+
480
+ const menu = claimable.length
481
+ ? `<table class="bs-table">
482
+ <colgroup><col style="width:44px;"><col style="width:52px;"><col style="width:68px;"><col style="width:48px;"><col style="width:44px;"><col></colgroup>
483
+ <thead><tr class="bs-thead">${TH('#')}${TH('Version')}${TH(ROLE_AXIS_LABEL)}${TH('Reward')}${TH('Est.')}${TH('What it is')}</tr></thead>
484
+ <tbody>${rows}</tbody>
485
+ </table>`
486
+ : `<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>`;
487
+
488
+ // footer actions: a "more" link when the list was capped, then the
489
+ // cross-lane pointer. (The old "just exploring" link was dropped — not
490
+ // picking is already "not claiming"; task 1273 follow-up.)
491
+ const moreCount = Math.max(0, (total || claimable.length) - claimable.length);
492
+ const moreLink = moreCount > 0
493
+ ? ` · <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>`
494
+ : '';
495
+ let crossLane = '';
496
+ if (recommendations.length > 0) {
497
+ const ids = recommendations.map((t) => '#' + t.id).join(', ');
498
+ crossLane = ` · <a href="#" onclick="event.preventDefault();sendPrompt('${jsq('Show me the tasks outside my disciplines: ' + ids)}')" class="bs-link">Outside your roles: ${hesc(ids)} ↗</a>`;
499
+ } else if (routingByPreference) {
500
+ crossLane = ` · <a href="#" onclick="event.preventDefault();sendPrompt('Show me every role, not just mine')" class="bs-link">Show all roles ↗</a>`;
501
+ }
502
+
503
+ 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.`;
504
+ return `${WIDGET_STYLE}
505
+ <h2 class="bs-sr">${hesc(summary)}</h2>
506
+ <div class="bs-card">
507
+ <div class="bs-head">
508
+ <span class="bs-brand"><span class="bs-title"><i class="ti ti-player-play" aria-hidden="true"></i>builder-start</span>${streakBadge}</span>
509
+ <span class="bs-meta">${hesc(b.github_login)} · ${hesc(rank)} · ${hesc(credits)} credits · ${hesc(disc)}</span>
510
+ </div>
511
+ ${rebaseRow}
512
+ ${statusRow}
513
+ ${holdings}
514
+ ${closeBanner}
515
+ ${goalsBlock}
516
+ <div class="bs-menuh">Claim one to start — ${total || claimable.length} ready for you right now${matched}${fNote}</div>
517
+ ${menu}
518
+ <div class="bs-foot">Click a task to claim it${moreLink}${crossLane}</div>
519
+ </div>`;
520
+ }
521
+
522
+ // Cross-discipline recommendations — mirror of
523
+ // rankCrossDisciplineRecommendations in modules/lifecycle/db-tasks.js (the
524
+ // canonical copy; it moved there from src/bongos/db.js in the twelve-unit
525
+ // carve). Given the full claimable list and the builder's
526
+ // preferred_disciplines, return up to `limit` tasks whose discipline is OUTSIDE
527
+ // the builder's preferences, ranked:
528
+ // priority ASC (unset last), credits/min DESC, est_minutes ASC, id ASC.
529
+ // Priority 1 is the MOST urgent — the DB's own convention (CHECK (priority
530
+ // BETWEEN 1 AND 5), weighted 6 - COALESCE(priority, 5)); an unset priority
531
+ // sorts after an explicit P5, never ahead of a P1.
532
+ // 'unclassified' tasks are excluded (un-triaged, not a real lane). Empty
533
+ // preferences → [] (everything is already in the main list; nothing outside).
534
+ // This copy and the canonical one are pinned together by
535
+ // tests/cross_discipline_priority_direction.mjs — change one, change the other.
536
+ function rankCrossDisciplineRecommendations(claimable, preferredDisciplines, limit = 3) {
537
+ const rows = Array.isArray(claimable) ? claimable : [];
538
+ const prefs = Array.isArray(preferredDisciplines) ? preferredDisciplines : [];
539
+ if (prefs.length === 0) return [];
540
+ const prefSet = new Set(prefs);
541
+ const cpm = (t) => {
542
+ const credits = Number(t.credits_reward) || 0;
543
+ const mins = Number(t.est_minutes_calibrated ?? t.est_minutes) || 0;
544
+ return mins > 0 ? credits / mins : 0;
545
+ };
546
+ // `ASC NULLS LAST` in JS — an absent/blank/non-numeric priority sorts after
547
+ // every explicit 1..5. Not `Number(t.priority) || 0`: that maps NULL to 0,
548
+ // which under an ascending sort outranks a P1.
549
+ const prio = (t) => {
550
+ if (t.priority === null || t.priority === undefined || t.priority === '') return Infinity;
551
+ const n = Number(t.priority);
552
+ return Number.isFinite(n) ? n : Infinity;
553
+ };
554
+ const outside = rows.filter(
555
+ (t) => t.discipline && t.discipline !== 'unclassified' && !prefSet.has(t.discipline)
556
+ );
557
+ outside.sort((a, b) => {
558
+ const pa = prio(a);
559
+ const pb = prio(b);
560
+ if (pa !== pb) return pa - pb;
561
+ const ca = cpm(a);
562
+ const cb = cpm(b);
563
+ if (cb !== ca) return cb - ca;
564
+ const ma = Number(a.est_minutes_calibrated ?? a.est_minutes) || Infinity;
565
+ const mb = Number(b.est_minutes_calibrated ?? b.est_minutes) || Infinity;
566
+ if (ma !== mb) return ma - mb;
567
+ return (Number(a.id) || 0) - (Number(b.id) || 0);
568
+ });
569
+ return outside.slice(0, Math.max(0, limit));
570
+ }
571
+
572
+ // ---------- environment guard (task 1002403 / goal 1000052) ----------
573
+ // /builder-start is often the FIRST command run in a freshly-cloned instance —
574
+ // before the local server has ever been brought up. When the API can't be
575
+ // reached, guide the builder to the one-command bring-up instead of dying with a
576
+ // raw fetch stack trace (the old failure). The generated client REJECTS on a
577
+ // network error even under throwOnError:false (see clients/bongos-client), so the
578
+ // Promise.all in main() throws into the guard below. Wrong-instance (exit 3) and
579
+ // no-session (exit 2) are handled upstream in cliClient()/apiCall, and the
580
+ // builder-start skill routes those + the pre-install "bongos not found" case.
581
+ function isConnectionError(err) {
582
+ if (!err) return false;
583
+ // task 1002670: a dispatcher/argument bug (e.g. a vendored undici Agent the
584
+ // built-in fetch rejects with UND_ERR_INVALID_ARG) throws before any network
585
+ // I/O. That is a CLIENT bug — never present it as "instance isn't reachable".
586
+ if (isDispatcherIncompatError(err)) return false;
587
+ const codes = ['ECONNREFUSED', 'ENOTFOUND', 'ECONNRESET', 'EAI_AGAIN', 'ETIMEDOUT', 'UND_ERR_CONNECT_TIMEOUT', 'UND_ERR_SOCKET'];
588
+ const code = err.code || (err.cause && err.cause.code) || '';
589
+ if (codes.includes(code)) return true;
590
+ const msg = `${err.message || ''} ${(err.cause && err.cause.message) || ''}`;
591
+ return /fetch failed|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|network|socket hang up/i.test(msg);
592
+ }
593
+
594
+ // isLocalOrigin — does this origin name a server THIS MACHINE is supposed to run?
595
+ // The whole shape of the unreachable-instance advice turns on it, so it is its own
596
+ // named predicate rather than an inline regex (task 1003675). Anything that is not
597
+ // recognisably loopback is treated as REMOTE: guessing "local" for a hosted board
598
+ // is the failure this exists to prevent, and the remote branch degrades gracefully
599
+ // (it points at a URL) while the local branch would tell someone to stand up a
600
+ // second, empty instance.
601
+ function isLocalOrigin(origin) {
602
+ if (!origin) return true; // nothing to go on → the old local-first wording
603
+ let host;
604
+ try { host = new URL(origin).hostname.toLowerCase(); } catch (_) { return false; }
605
+ return host === 'localhost' || host.endsWith('.localhost')
606
+ || host === '127.0.0.1' || host.startsWith('127.') || host === '::1' || host === '[::1]';
607
+ }
608
+
609
+ // The guided "instance isn't running" card. Markdown (never leads with `<`), so
610
+ // the builder-start skill relays it verbatim even in --widget mode.
611
+ //
612
+ // It branches on WHERE THE BOARD LIVES, because the same words are actively
613
+ // harmful in the two cases (task 1003675 — the owner hit this twice on a hosted
614
+ // instance). A HOSTED instance is not this machine's server to start: `bongos dev`
615
+ // would stand up a separate LOCAL instance with its OWN EMPTY DATABASE, so a
616
+ // builder who follows it obediently arrives at a board that is not theirs and the
617
+ // real outage stays hidden behind it. The hosted branch therefore leads with the
618
+ // thing that needs nothing installed — the board is a website — and offers the
619
+ // health probe instead of a bring-up.
620
+ //
621
+ // The local branch is unchanged, and still tailors its first step to whether deps
622
+ // are installed: a fresh clone needs `npm install` before the `bongos` CLI (which
623
+ // ships inside the PRIVATE @bongos/core package) even exists.
624
+ function instanceNotRunningCard({ origin, depsMissing } = {}) {
625
+ const out = [];
626
+ out.push(surface.strong("builder-start — this instance isn't reachable yet"));
627
+ out.push('');
628
+
629
+ if (!isLocalOrigin(origin)) {
630
+ out.push(`I couldn't reach ${surface.code(origin)}. That instance is ${surface.strong('hosted')} — it isn't this machine's server to start, so there's nothing to bring up here.`);
631
+ out.push('');
632
+ out.push(`1. ${surface.strong('The board is a website, and it needs nothing installed')} — open ${origin}/builders to see and claim work right now.`);
633
+ out.push(`2. If that doesn't load either, the instance itself is down: \`curl -sI ${origin}/healthz\` says whether it's answering.`);
634
+ out.push(`3. Once it answers, re-run ${surface.code(surface.action('start'))}.`);
635
+ out.push('');
636
+ out.push(`${surface.strong(`Don't run ${surface.code(surface.cli('dev'))} for this.`)} It stands up a separate local instance with its own empty database — it cannot show you this board, and it would hide the outage behind an empty one.`);
637
+ if (depsMissing) {
638
+ out.push('');
639
+ out.push(`(The ${surface.code('bongos')} CLI isn't installed here. It's optional — the website above is the same board. ${surface.code('@bongos/core')} is ${surface.strong('public')} on npm, so ${surface.code('npm install @bongos/core')} needs no token or login; a failure here is a real error, not the expected tokenless 404 it used to be.)`);
640
+ }
641
+ return out.join('\n');
642
+ }
643
+
644
+ out.push(`I couldn't reach the Cloud Bongos instance${origin ? ` at \`${origin}\`` : ''}. On a freshly-cloned project that almost always just means it hasn't been brought up yet. To start it locally:`);
645
+ out.push('');
646
+ let n = 1;
647
+ if (depsMissing) {
648
+ out.push(`${n++}. \`npm install\` — installs the toolchain first (the \`bongos\` CLI ships inside \`@bongos/core\`, so nothing else runs until this does).`);
649
+ }
650
+ out.push(`${n++}. ${surface.code(surface.cli('dev'))} — one command: starts Postgres, builds the tables, runs the server, and signs you in.`);
651
+ out.push(`${n++}. Re-run ${surface.code(surface.action('start'))}.`);
652
+ out.push('');
653
+ out.push(`Meant to work on a *different* instance that's already running? Sign in to it with ${surface.code(surface.cli('login <url>'))} first.`);
654
+ return out.join('\n');
655
+ }
656
+ function emitInstanceNotRunningCard(opts) {
657
+ console.log(instanceNotRunningCard(opts));
658
+ }
659
+
660
+ async function main() {
661
+ await requireSession();
662
+ const args = process.argv.slice(2);
663
+ const json = args.includes('--json');
664
+ const versionIdx = args.indexOf('--version');
665
+ const version = versionIdx >= 0 ? args[versionIdx + 1] : null;
666
+ const disciplineIdx = args.indexOf('--discipline');
667
+ const discipline = disciplineIdx >= 0 ? args[disciplineIdx + 1] : null;
668
+ const allDisciplines = args.includes('--all-disciplines');
669
+ const fitIdx = args.indexOf('--fit');
670
+ const fit = fitIdx >= 0 ? args[fitIdx + 1] : null;
671
+ const limitIdx = args.indexOf('--limit');
672
+ const limit = limitIdx >= 0 ? Number(args[limitIdx + 1]) : 10;
673
+ // --full restores the detailed ambient widgets + context pack that the lean
674
+ // card omits (task 1273). Default is the lean card.
675
+ const full = args.includes('--full');
676
+ // --widget emits the card as self-contained HTML on stdout for the app's
677
+ // widget renderer (task 1273). Private warnings go to stderr so stdout stays
678
+ // pure HTML the skill can pipe verbatim.
679
+ const widget = args.includes('--widget');
680
+ // --hook (task 1288): machine envelope for the builder-start-card hook — both
681
+ // card forms (HTML + markdown) + the private warnings from a single fetch, so
682
+ // the hook can hand the model a finished card it only has to render. Not a
683
+ // user surface; stdout is the JSON envelope only.
684
+ const hookMode = args.includes('--hook');
685
+
686
+ // Server-side filtering: only push an explicit --discipline (single-lane
687
+ // override). Preference-based routing is done client-side below, because
688
+ // (a) a builder can prefer BOTH disciplines and the server filter takes a
689
+ // single value, and (b) the "You might enjoy" section needs the full
690
+ // claimable set (across all disciplines) to compute recommendations from.
691
+ const claimableQuery = {};
692
+ if (version) claimableQuery.version = version;
693
+ if (discipline) claimableQuery.discipline = discipline;
694
+ if (fit) claimableQuery.fit = fit;
695
+
696
+ // Fire everything in parallel. Header widgets are non-critical — if any
697
+ // endpoint fails, that widget degrades to "N/A" rather than killing
698
+ // /builder-start.
699
+ const api = await cliClient();
700
+ let me, r, closeRes, progressRes, costRes, recentRes, inboxRes, blockersRes, goalsRes;
701
+ try {
702
+ [me, r, closeRes, progressRes, costRes, recentRes, inboxRes, blockersRes, goalsRes] = await Promise.all([
703
+ api.me.getMe(),
704
+ api.tasks.getTasksClaimable({ query: claimableQuery }),
705
+ api.versions.getVersionsCloseSuggestions(),
706
+ api.public.getPublicProgress(),
707
+ api.public.getPublicCostSummary(),
708
+ api.public.getPublicRecentShipped(),
709
+ api.inbox.getInbox({ query: { status: 'open' } }),
710
+ api.blockers.getBlockers(),
711
+ // task 1002852: best-effort — a failed goals read leaves the table flat-grouped by id.
712
+ api.goals.getGoals({ query: { status: 'open' } }).catch(() => ({ ok: false })),
713
+ ]);
714
+ } catch (err) {
715
+ // A fresh-clone instance that was never brought up refuses the connection.
716
+ // Human modes get a guided bring-up card + clean exit; machine modes (--json,
717
+ // --hook) keep the throw so the autonomous runner still sees the failure.
718
+ if (isConnectionError(err) && !json && !hookMode) {
719
+ let depsMissing = false;
720
+ try { depsMissing = depsFinding({ repoRoot: process.cwd() }).level !== 'ok'; } catch (_) { /* best-effort */ }
721
+ let origin = '';
722
+ try { origin = new URL(API_BASE).origin; } catch (_) { origin = API_BASE || ''; }
723
+ emitInstanceNotRunningCard({ origin, depsMissing });
724
+ process.exit(0);
725
+ }
726
+ throw err;
727
+ }
728
+ // #766: the primer-read gate on the claimable endpoint was removed, so a
729
+ // newcomer no longer gets a 403 stage_required here. A generic stage_required
730
+ // (any future onboarding gate) still renders cleanly rather than crashing.
731
+ // ADR 0116 nests the slug and its payload — see the note in cli-lib errCode (task
732
+ // 1003658). The onboarding copy lives in error.details, so reading it off the top
733
+ // level rendered an empty prompt even when the branch fired.
734
+ if (r.status === 403 && errCode(r.data) === 'stage_required') {
735
+ const d = errDetails(r.data);
736
+ console.log('');
737
+ console.log(d.what_to_do || `Clear "${d.required_stage_label || d.required_stage}" before the work queue opens.`);
738
+ for (const line of plainCardLines('stage_required')) console.log(line);
739
+ console.log('');
740
+ process.exit(0);
741
+ }
742
+ if (!r.ok) {
743
+ console.error(`failed (${r.status}):`, r.data);
744
+ for (const line of plainCardLines('board_unavailable')) console.error(line);
745
+ process.exit(1);
746
+ }
747
+
748
+ // Full claimable set as returned by the server (already filtered for
749
+ // touches[] safety, version/fit, and any explicit --discipline).
750
+ const rawClaimable = r.data.claimable || [];
751
+
752
+ // Discipline routing (V3.R81 / #299). preferred_disciplines lives on the
753
+ // builder row (migration 027), surfaced via /api/bongos/me.
754
+ const preferred = (me.ok && Array.isArray(me.data?.builder?.preferred_disciplines))
755
+ ? me.data.builder.preferred_disciplines
756
+ : [];
757
+ // Apply preference narrowing unless the builder explicitly opted out
758
+ // (--all-disciplines), explicitly chose a single lane (--discipline X,
759
+ // already applied server-side), or stated no preference.
760
+ const routingByPreference = !allDisciplines && !discipline && preferred.length > 0;
761
+ const filtered = routingByPreference
762
+ ? rawClaimable.filter((t) => preferred.includes(t.discipline))
763
+ : rawClaimable;
764
+ // task 1002852: goal-first. The open goals (with the server's viewer_is_member)
765
+ // group the table and put the builder's joined goals' rows ahead of the cap.
766
+ const goals = goalsRes && goalsRes.ok && Array.isArray(goalsRes.data?.goals) ? goalsRes.data.goals : [];
767
+ const claimable = startGoals.joinedFirst(filtered, goals).slice(0, limit);
768
+
769
+ // "You might enjoy" — up to 3 claimable tasks outside the builder's lanes.
770
+ // Computed from the FULL set so it can reach across disciplines. Suppressed
771
+ // when an explicit single-lane --discipline filter is in play (the builder
772
+ // asked to see exactly one lane) — but shown for --all-disciplines and the
773
+ // default preference-routed view.
774
+ const recommendations = discipline
775
+ ? []
776
+ : rankCrossDisciplineRecommendations(rawClaimable, preferred, 3);
777
+
778
+ // Close-suggestions endpoint is non-critical; if it fails (e.g. older
779
+ // server without the route), surface no banner rather than blowing up.
780
+ const closeSuggestions = closeRes.ok && Array.isArray(closeRes.data?.suggestions)
781
+ ? closeRes.data.suggestions
782
+ : [];
783
+ const readyToClose = closeSuggestions.filter((s) => s.ready);
784
+ const yourGoals = startGoals.yourGoals(goals, filtered);
785
+
786
+ // Header widget data (each independently optional).
787
+ const progress = progressRes.ok && Array.isArray(progressRes.data?.progress) ? progressRes.data.progress : null;
788
+ const cost = costRes.ok ? costRes.data : null;
789
+ const recentShipped = recentRes.ok && Array.isArray(recentRes.data?.tasks) ? recentRes.data.tasks : null;
790
+ const inboxCount = inboxOpenCount(inboxRes);
791
+ const blockerCount = blockersRes.ok && Array.isArray(blockersRes.data?.blockers)
792
+ ? blockersRes.data.blockers.filter((b) => b.status === 'open' || !b.status).length
793
+ : null;
794
+
795
+ // ADR 0120 part 5: the confirmed tasks this builder owes a rebase on (they
796
+ // GATE new claims; the reward lands only on ship). Shared by every card form;
797
+ // already present verbatim in --json via me.data.needs_rebase_tasks below.
798
+ const needsRebaseTasks = me.ok && Array.isArray(me.data?.needs_rebase_tasks)
799
+ ? me.data.needs_rebase_tasks
800
+ : [];
801
+
802
+ if (json) {
803
+ console.log(JSON.stringify(
804
+ {
805
+ me: me.data,
806
+ claimable,
807
+ recommendations,
808
+ your_goals: yourGoals.goals,
809
+ discipline_routing: {
810
+ preferred_disciplines: preferred,
811
+ applied: routingByPreference,
812
+ all_disciplines: allDisciplines,
813
+ explicit_discipline: discipline || null,
814
+ },
815
+ close_suggestions: closeSuggestions,
816
+ header: {
817
+ progress,
818
+ cost,
819
+ recent_shipped: recentShipped,
820
+ inbox_count: inboxCount,
821
+ blocker_count: blockerCount,
822
+ },
823
+ },
824
+ null, 2
825
+ ));
826
+ return;
827
+ }
828
+
829
+ // ---------- widget (HTML for the app renderer) ----------
830
+ // task 1279 / 1002518: the per-builder card-richness level. Below the widget
831
+ // rung, even an explicit --widget request degrades to the markdown card below
832
+ // — so no HTML is emitted, read, or re-relayed (a real token saving, not just
833
+ // a visual change). /me carries the resolved level; an older instance carries
834
+ // only the boolean and cardFlagsFromMe reads either. Headless/cron callers
835
+ // don't pass --widget at all (no renderer), so they're unaffected.
836
+ //
837
+ // The `minimal` rung lands on the markdown card here rather than on nothing:
838
+ // the lifecycle card has a guaranteed one-line confirmation to fall back to,
839
+ // and this card — the list of what you can claim — has no such floor. Dropping
840
+ // it would leave a session opening with no answer to the question it asked.
841
+ const widgetsPref = me.ok ? cardFlagsFromMe(me).showWidget : true;
842
+ if (widget && widgetsPref) {
843
+ const myClaims = me.ok ? (me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : [])) : [];
844
+ // Private warnings (budget / onboarding next-stage) → stderr, so stdout
845
+ // stays pure HTML the skill can pipe straight into show_widget.
846
+ if (me.ok) {
847
+ const warnings = captureLog(() => { printOnboardingNudge(me.data); printCostWarning(me.data); printNeedsNudge(me.data); });
848
+ for (const w of warnings) process.stderr.write(w + '\n');
849
+ }
850
+ emitCardDirective('html');
851
+ process.stdout.write(renderWidget({
852
+ builder: me.ok ? me.data.builder : {},
853
+ claims: myClaims,
854
+ claimable: claimable.slice(0, CARD_ROWS),
855
+ total: filtered.length,
856
+ streak: me.ok ? me.data.streak : null,
857
+ recommendations,
858
+ header: { progress, recentShipped, inboxCount, blockerCount },
859
+ routingByPreference,
860
+ preferred,
861
+ filters: { version, discipline, fit },
862
+ readyToClose,
863
+ needsRebaseTasks,
864
+ goals,
865
+ yourGoals,
866
+ }) + '\n');
867
+ return;
868
+ }
869
+
870
+ // ---------- the card (default) ----------
871
+ // task 1288: the markdown card body, lifted into a closure so the --hook
872
+ // envelope can capture it (via captureLog) next to the widget HTML from the
873
+ // single fetch above; the normal markdown path just calls it below. The body
874
+ // is kept VERBATIM (same indentation) so this stays a pure wrap+call with zero
875
+ // change to the shipped card. Closes over the locals computed above. (task
876
+ // 1273: relaying this verbatim is what keeps the card identical every session;
877
+ // `--full` adds the ambient widgets + context pack.)
878
+ const emitMarkdownCard = () => {
879
+ // V3.R13 (#237): one-line "next stage" nudge for newcomers. Silent for
880
+ // graduated builders and anyone past first_ship.
881
+ if (me.ok) printOnboardingNudge(me.data);
882
+ // task 1013 / ADR 0073: flag any input the system needs from the builder
883
+ // (e.g. their own image-generation key once free coverage ends). Silent unless
884
+ // something is in the action_needed state.
885
+ if (me.ok) printNeedsNudge(me.data);
886
+
887
+ // identity line
888
+ if (me.ok) {
889
+ const b = me.data.builder;
890
+ const rankLabel = b.rank ? b.rank.charAt(0).toUpperCase() + b.rank.slice(1) : 'Thetes';
891
+ const discLabel = Array.isArray(b.preferred_disciplines) && b.preferred_disciplines.length
892
+ ? b.preferred_disciplines.join(' + ')
893
+ : 'all disciplines';
894
+ const credits = Number(b.total_credits || 0).toLocaleString();
895
+ console.log(`${surface.strong('builder-start')} · ${b.github_login} (${rankLabel}) · ${credits} credits · ${discLabel}`);
896
+ const sk = me.data.streak;
897
+ if (sk && Number(sk.current) > 0) {
898
+ console.log(`🔥 ${sk.current}-day streak${Number(sk.longest) > Number(sk.current) ? ` · longest ${sk.longest}` : ''}`);
899
+ }
900
+ }
901
+
902
+ // ADR 0120 part 5: the owed-rebase gate warning — rendered directly under the
903
+ // identity line and before the claimable table, since it BLOCKS new claims
904
+ // until the builder lands (`git merge origin/main` + re-ship — task 1002788:
905
+ // MERGE, because the branch is already published and the server's publish is
906
+ // append-only, so a rebase makes it permanently un-pushable) or releases them.
907
+ const rebaseLine = rebaseWarningMarkdown(needsRebaseTasks);
908
+ if (rebaseLine) {
909
+ console.log('');
910
+ console.log(rebaseLine);
911
+ }
912
+
913
+ // ambient status: one quiet line by default; the full widgets + context pack
914
+ // under --full.
915
+ if (full) {
916
+ const rows = [
917
+ formatVersionsRow(progress),
918
+ formatCostRow(cost),
919
+ formatRecentRow({ recentShipped, inboxCount, blockerCount }),
920
+ ].filter(Boolean);
921
+ if (rows.length) console.log(rows.join('\n'));
922
+ // Worktree root (the #1 wrong-path footgun) + API prefix/enums. Also printed
923
+ // at /builder-claim, where it matters most; here it's --full-only detail.
924
+ try {
925
+ console.log('');
926
+ console.log(formatContextPackCompact(contextPack()));
927
+ } catch (_) { /* fail-open */ }
928
+ } else {
929
+ const status = quietStatusLine({ progress, recentShipped, inboxCount, blockerCount });
930
+ if (status) console.log(status);
931
+ }
932
+ console.log('');
933
+
934
+ // V3.R84 (#302), criterion C3: private session-start budget ping. The CLI is
935
+ // the builder's private channel, so the soft-cap (80%) warning / hard-cap
936
+ // (100%) refusal surface here rather than via Discord (a shared mirror).
937
+ if (me.ok) printCostWarning(me.data);
938
+
939
+ // your holdings — calm + factual, with quick actions off each held task.
940
+ // Parallel sessions under one builder are normal, so this informs (it does
941
+ // not block — feedback_parallel_sessions). Ids are hall links (ref rule).
942
+ if (me.ok) {
943
+ const myClaims = me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : []);
944
+ const heldActions = (id) => ` → ship: ${surface.code(surface.action('ship', id))}`
945
+ + ` · release: ${surface.code(surface.action('release', id))}`
946
+ + ` · open: ${surface.taskRef(id, HALL_TASK)}`;
947
+ if (myClaims.length === 1) {
948
+ const c = myClaims[0];
949
+ console.log(`You're holding ${surface.taskRef(c.task_id, HALL_TASK)} — ${clip(c.title, 56)}`);
950
+ console.log(heldActions(c.task_id));
951
+ console.log('');
952
+ } else if (myClaims.length > 1) {
953
+ console.log(`You're holding ${myClaims.length} claims (parallel sessions OK):`);
954
+ for (const c of myClaims) {
955
+ console.log(` ${surface.taskRef(c.task_id, HALL_TASK)} — ${clip(c.title, 50)}`);
956
+ console.log(heldActions(c.task_id));
957
+ }
958
+ console.log('');
959
+ }
960
+ }
961
+
962
+ // Version-close gate banner — informational; fires rarely (an Archon action)
963
+ // when a building version is >= 80% weighted AND every criterion is satisfied.
964
+ for (const s of readyToClose) {
965
+ console.log(
966
+ `🚦 ${s.versionId} looks ready to close ` +
967
+ `(${s.criteriaSatisfied}/${s.criteriaTotal} criteria, ${s.percentComplete}% weighted; ` +
968
+ `${s.tasksShipped} shipped, ${s.tasksCarryOver} carry-over). Run ${surface.action('version-close', s.versionId)}.`
969
+ );
970
+ console.log('');
971
+ }
972
+
973
+ // ---------- the menu ----------
974
+ const matched = routingByPreference ? ` matched to ${preferred.join(' + ')}` : '';
975
+ const filterBits = [
976
+ version && `in ${version}`,
977
+ discipline && `discipline=${discipline}`,
978
+ fit && `fit=${fit}`,
979
+ ].filter(Boolean);
980
+ const filterNote = filterBits.length ? ` (${filterBits.join(', ')})` : '';
981
+ // task 1002852: the goals this builder joined, above the table (never instead of it).
982
+ if (yourGoals.goals.length) {
983
+ console.log(surface.strong('Your goals'));
984
+ for (const g of yourGoals.goals) console.log(` ${clip(g.title, 60)} · ${startGoals.claimableWord(g.claimable)}`);
985
+ if (yourGoals.more) console.log(` and ${yourGoals.more} more`);
986
+ console.log('');
987
+ }
988
+ console.log(`${surface.strong('Claim one to start')} — ${filtered.length} ready for you right now${matched}${filterNote}:`);
989
+ console.log('');
990
+ if (claimable.length) {
991
+ const cardRows = claimable.slice(0, CARD_ROWS);
992
+ console.log(claimableTable(cardRows, me.ok ? me.data?.reward : null, goals));
993
+ const moreN = filtered.length - cardRows.length;
994
+ if (moreN > 0) {
995
+ console.log('');
996
+ console.log(surface.em(`…and ${moreN} more — say "show all", or run with --limit 30.`));
997
+ }
998
+ } else {
999
+ console.log(surface.em(
1000
+ "Nothing claimable right now — everything is in flight, blocked, or shipped."
1001
+ + (surface.isTerminal() ? '' : " Run /blocker-review to see what's stuck.")
1002
+ ));
1003
+ }
1004
+
1005
+ // Cross-discipline pointer (one line) — only when preference-routed.
1006
+ if (recommendations.length > 0) {
1007
+ const ids = recommendations.map((t) => `#${t.id}`).join(', ');
1008
+ console.log('');
1009
+ console.log(`Outside your roles: ${ids} — say the word to see them, or run with \`--all-disciplines\`.`);
1010
+ } else if (routingByPreference) {
1011
+ console.log('');
1012
+ console.log('_Showing your roles — run with `--all-disciplines` to see every role._');
1013
+ }
1014
+
1015
+ // ---------- next ----------
1016
+ console.log('');
1017
+ console.log(`→ ${surface.isTerminal() ? `Claim one with ${surface.code(surface.cli('claim <id>'))} in a checkout` : `${surface.strong('Tell me a number')} to claim it`}.`);
1018
+ if (full) {
1019
+ console.log('');
1020
+ console.log('Commands:');
1021
+ console.log(' claim: node scripts/bongos/claim.js <task-id> [--worktree NAME]');
1022
+ console.log(' ship: node scripts/bongos/ship.js <task-id> --notes "..." --summary "..."');
1023
+ console.log(' release: node scripts/bongos/release.js <task-id>');
1024
+ }
1025
+ };
1026
+
1027
+ // --hook (task 1288): a UserPromptSubmit hook can neither render UI, call
1028
+ // show_widget, nor detect whether that tool exists — only the model can. So
1029
+ // the hook runs THIS script and injects the finished card + a one-step
1030
+ // directive; the model's only remaining job is to emit it. Emit BOTH forms
1031
+ // (+ the private budget/onboarding warnings) from the single fetch above as a
1032
+ // machine envelope; stdout carries nothing else.
1033
+ if (hookMode) {
1034
+ const myClaims = me.ok ? (me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : [])) : [];
1035
+ const html = widgetsPref
1036
+ ? renderWidget({
1037
+ builder: me.ok ? me.data.builder : {},
1038
+ claims: myClaims,
1039
+ claimable: claimable.slice(0, CARD_ROWS),
1040
+ total: filtered.length,
1041
+ streak: me.ok ? me.data.streak : null,
1042
+ recommendations,
1043
+ header: { progress, recentShipped, inboxCount, blockerCount },
1044
+ routingByPreference,
1045
+ preferred,
1046
+ filters: { version, discipline, fit },
1047
+ readyToClose,
1048
+ needsRebaseTasks,
1049
+ goals,
1050
+ yourGoals,
1051
+ })
1052
+ : null;
1053
+ const markdown = captureLog(emitMarkdownCard).join('\n');
1054
+ const warnings = me.ok
1055
+ ? captureLog(() => { printOnboardingNudge(me.data); printCostWarning(me.data); printNeedsNudge(me.data); })
1056
+ : [];
1057
+ process.stdout.write(JSON.stringify({ widgets_enabled: widgetsPref, html, markdown, warnings }) + '\n');
1058
+ return;
1059
+ }
1060
+
1061
+ // Markdown card path — default invocation, `--full`, or `--widget` with the
1062
+ // widgets knob off. The relay directive goes to stderr (task 1282); the card
1063
+ // body to stdout.
1064
+ emitCardDirective('markdown');
1065
+ emitMarkdownCard();
1066
+ }
1067
+
1068
+ // Only auto-run when invoked directly (`node start.js …`); a `require()` (the
1069
+ // unit test) imports the pure render helpers without executing the fetch flow —
1070
+ // the claim.js precedent. The owed-rebase warning helpers (ADR 0120 part 5) are
1071
+ // exported so they can be unit-tested without a live server, and so is
1072
+ // rankCrossDisciplineRecommendations — the mirror test executes THIS copy
1073
+ // alongside the canonical one rather than pattern-matching the source.
1074
+ if (require.main === module) {
1075
+ main().catch((err) => {
1076
+ console.error('fatal:', err);
1077
+ process.exit(1);
1078
+ });
1079
+ }
1080
+
1081
+ module.exports = {
1082
+ inboxOpenCount,
1083
+ rankCrossDisciplineRecommendations,
1084
+ rebaseWarningModel,
1085
+ rebaseWarningMarkdown,
1086
+ rebaseWarningWidget,
1087
+ isConnectionError,
1088
+ instanceNotRunningCard,
1089
+ isLocalOrigin,
1090
+ };