@bongos/core 1.21.174 → 1.21.176

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 (1744) hide show
  1. package/.bongos-core.json +3565 -1515
  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 +14 -14
  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/docs/adr/0029-status-page-outage-resilience.md +6 -6
  58. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  59. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  60. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  61. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  62. package/docs/adr/README.md +2 -0
  63. package/docs/api/openapi.json +606 -44
  64. package/docs/api-reference.md +25 -12
  65. package/docs/architecture.md +8 -7
  66. package/docs/canonical-permissions.md +3 -3
  67. package/docs/copy-inventory.md +1389 -1437
  68. package/docs/copy-registry.json +2160 -2634
  69. package/docs/design/demonolith-plan.md +6 -6
  70. package/docs/design/modular-architecture/00-research-report.md +1 -1
  71. package/docs/design/project-startup-direction.md +2 -2
  72. package/docs/design/projects-hub-direction-v2.md +1 -1
  73. package/docs/design/reviews/hall-v2/README.md +2 -2
  74. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  75. package/docs/file-map.md +89 -88
  76. package/docs/handoff-template.md +4 -4
  77. package/docs/module-api-changelog.md +6 -2
  78. package/docs/modules-contract.md +8 -7
  79. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  80. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  81. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  82. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  83. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  84. package/docs/onboarding/diagrams/README.md +2 -2
  85. package/docs/onboarding/diagrams/assertions.json +2 -2
  86. package/docs/onboarding/slash-commands.md +2 -2
  87. package/docs/packs/artist.md +4 -4
  88. package/docs/packs/engineer.md +11 -10
  89. package/docs/packs/ideator.md +7 -7
  90. package/docs/page-inventory.json +25 -1
  91. package/docs/page-readings.json +4388 -4602
  92. package/docs/recipes/README.md +1 -1
  93. package/docs/recipes/audit-replay.md +4 -4
  94. package/docs/recipes/autobongos-windows-host.md +6 -6
  95. package/docs/recipes/bongos-cli-release.md +2 -2
  96. package/docs/recipes/claude-design-loop.md +7 -7
  97. package/docs/recipes/core-release-pipeline.md +19 -19
  98. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  99. package/docs/recipes/figma-design-loop.md +6 -6
  100. package/docs/recipes/gds-db-backup.md +9 -9
  101. package/docs/recipes/instance-deploy.md +3 -3
  102. package/docs/recipes/instance-first-run.md +1 -1
  103. package/docs/recipes/multi-builder-merge.md +2 -2
  104. package/docs/recipes/ops-gotchas.md +10 -9
  105. package/docs/recipes/packaging-the-core.md +6 -6
  106. package/docs/recipes/parallel-goal-waves.md +4 -4
  107. package/docs/recipes/private-npm-distribution.md +9 -9
  108. package/docs/recipes/redteam-patrol.md +5 -5
  109. package/docs/recipes/render-pilot.md +2 -2
  110. package/docs/recipes/reranking-a-goals-board.md +2 -2
  111. package/docs/recipes/search-index-ingestion.md +5 -5
  112. package/docs/recipes/self-host.md +1 -1
  113. package/docs/recipes/ship-and-regrade.md +4 -4
  114. package/docs/recipes/staging-environment.md +1 -1
  115. package/docs/recipes/standalone-live-docs.md +1 -1
  116. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  117. package/docs/recipes/upgrading-the-core.md +11 -11
  118. package/docs/recipes/windows-builders.md +18 -18
  119. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  120. package/docs/research/task-network-map-readability.md +3 -3
  121. package/migrations/core_278_builder_tester_tag.sql +18 -0
  122. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  123. package/modules/agents/lib/answer-hold.js +1 -1
  124. package/modules/agents/lib/gate.js +1 -1
  125. package/modules/agents/lib/validate.js +1 -1
  126. package/modules/autonomy/gauge.js +1 -1
  127. package/modules/autonomy/governor-docket.js +2 -2
  128. package/modules/autonomy/pollers/routine-timers.js +3 -3
  129. package/modules/autonomy/routes/autonomy.js +3 -3
  130. package/modules/builder-settings/interaction-prefs.js +1 -1
  131. package/modules/builder-settings/render-prefs.js +1 -1
  132. package/modules/builder-settings/routes/settings.js +1 -1
  133. package/modules/builder-settings/skill-prefs.js +2 -2
  134. package/modules/builder-settings/wandering-prefs.js +2 -2
  135. package/modules/copy-desk/module.json +2 -2
  136. package/modules/copy-desk/page-data.js +5 -5
  137. package/modules/copy-desk/page-decisions.js +13 -1
  138. package/modules/copy-desk/proposals.js +4 -4
  139. package/modules/copy-desk/registry.js +2 -2
  140. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  141. package/modules/copy-desk/routes/copy-desk.js +3 -12
  142. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  143. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  144. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  145. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  146. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  147. package/modules/design-styles/skills/README.md +4 -4
  148. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  149. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  150. package/modules/discord/bug-attachments.js +1 -1
  151. package/modules/discord/ship-broadcast.js +1 -1
  152. package/modules/economy/achievements.js +49 -7
  153. package/modules/economy/cost-classify.js +6 -6
  154. package/modules/economy/cost-report.js +1 -1
  155. package/modules/economy/cost.js +1 -1
  156. package/modules/economy/credits.js +2 -1
  157. package/modules/economy/idea-size.js +2 -2
  158. package/modules/economy/reward.js +2 -0
  159. package/modules/economy/routes/cost.js +1 -1
  160. package/modules/economy/streak.js +43 -4
  161. package/modules/government/asks.js +1 -1
  162. package/modules/government/board.js +19 -2
  163. package/modules/government/catalog.js +3 -0
  164. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  165. package/modules/government/protected-surfaces.json +48 -47
  166. package/modules/government/recommendations.js +6 -2
  167. package/modules/government/routes/government.js +1 -1
  168. package/modules/grading/generated-provenance.js +13 -5
  169. package/modules/grading/grade-engine.js +1 -1
  170. package/modules/grading/grader-rubric.json +1 -1
  171. package/modules/grading/grader-score.js +1 -1
  172. package/modules/grading/grader-workers/index.js +1 -1
  173. package/modules/grading/grader.js +1 -1
  174. package/modules/grading/routes/grade.js +1 -1
  175. package/modules/hall-ui/public/atlas.html +5 -7
  176. package/modules/hall-ui/public/atlas.js +1 -1
  177. package/modules/hall-ui/public/atlas.states.json +1 -1
  178. package/modules/hall-ui/public/blockers.css +9 -0
  179. package/modules/hall-ui/public/blockers.html +6 -4
  180. package/modules/hall-ui/public/blockers.js +39 -27
  181. package/modules/hall-ui/public/board-room.css +5 -12
  182. package/modules/hall-ui/public/board-room.html +6 -6
  183. package/modules/hall-ui/public/board-room.js +41 -23
  184. package/modules/hall-ui/public/board-room.states.json +1 -1
  185. package/modules/hall-ui/public/brand-apply.js +1 -1
  186. package/modules/hall-ui/public/brand-holes.js +1 -1
  187. package/modules/hall-ui/public/builders.js +40 -86
  188. package/modules/hall-ui/public/city-decide.js +18 -4
  189. package/modules/hall-ui/public/city.html +1 -1
  190. package/modules/hall-ui/public/collab.html +1 -1
  191. package/modules/hall-ui/public/commands.html +6 -9
  192. package/modules/hall-ui/public/copy-desk.html +1 -1
  193. package/modules/hall-ui/public/copy-desk.js +2 -2
  194. package/modules/hall-ui/public/craft-mode.js +4 -0
  195. package/modules/hall-ui/public/deploy.html +6 -2
  196. package/modules/hall-ui/public/deploy.js +21 -13
  197. package/modules/hall-ui/public/diagrams.css +1 -1
  198. package/modules/hall-ui/public/diagrams.html +5 -8
  199. package/modules/hall-ui/public/diagrams.states.json +1 -1
  200. package/modules/hall-ui/public/drachmae.html +3 -7
  201. package/modules/hall-ui/public/fleet.html +3 -2
  202. package/modules/hall-ui/public/fleet.js +0 -4
  203. package/modules/hall-ui/public/gate.html +7 -7
  204. package/modules/hall-ui/public/gate.js +58 -77
  205. package/modules/hall-ui/public/goal-inbox.js +69 -86
  206. package/modules/hall-ui/public/goal-map.html +1 -1
  207. package/modules/hall-ui/public/goals-page.js +5 -5
  208. package/modules/hall-ui/public/goals-render.js +10 -11
  209. package/modules/hall-ui/public/goals.css +10 -0
  210. package/modules/hall-ui/public/goals.html +14 -7
  211. package/modules/hall-ui/public/government.html +3 -5
  212. package/modules/hall-ui/public/government.js +1 -5
  213. package/modules/hall-ui/public/hall-ask.css +57 -0
  214. package/modules/hall-ui/public/hall-ask.js +50 -0
  215. package/modules/hall-ui/public/hall-render.js +117 -57
  216. package/modules/hall-ui/public/hall-widgets.js +11 -11
  217. package/modules/hall-ui/public/idea.html +1 -1
  218. package/modules/hall-ui/public/ideas.html +3 -1
  219. package/modules/hall-ui/public/ideas.js +1 -0
  220. package/modules/hall-ui/public/index.html +15 -6
  221. package/modules/hall-ui/public/index.states.json +1 -1
  222. package/modules/hall-ui/public/mine-lens.js +1 -1
  223. package/modules/hall-ui/public/modules.html +7 -10
  224. package/modules/hall-ui/public/modules.js +0 -2
  225. package/modules/hall-ui/public/my-agents.html +1 -1
  226. package/modules/hall-ui/public/palette.js +5 -5
  227. package/modules/hall-ui/public/primer.html +4 -9
  228. package/modules/hall-ui/public/profile-connections.js +10 -2
  229. package/modules/hall-ui/public/profile-roles.js +3 -10
  230. package/modules/hall-ui/public/profile.html +12 -10
  231. package/modules/hall-ui/public/profile.js +13 -17
  232. package/modules/hall-ui/public/project-settings.html +3 -4
  233. package/modules/hall-ui/public/project-settings.js +0 -3
  234. package/modules/hall-ui/public/ranks.html +5 -11
  235. package/modules/hall-ui/public/ranks.js +6 -8
  236. package/modules/hall-ui/public/roadmap.css +0 -2
  237. package/modules/hall-ui/public/roadmap.html +1 -1
  238. package/modules/hall-ui/public/roadmap.js +16 -51
  239. package/modules/hall-ui/public/roster.html +1 -1
  240. package/modules/hall-ui/public/sessions.html +6 -8
  241. package/modules/hall-ui/public/sessions.js +7 -7
  242. package/modules/hall-ui/public/settings.html +1 -1
  243. package/modules/hall-ui/public/shell-trail.js +1 -1
  244. package/modules/hall-ui/public/shell.js +17 -17
  245. package/modules/hall-ui/public/street-deck.css +2 -1
  246. package/modules/hall-ui/public/street-deck.js +10 -2
  247. package/modules/hall-ui/public/street-desk.js +16 -5
  248. package/modules/hall-ui/public/street.html +1 -1
  249. package/modules/hall-ui/public/studio-lib.js +4 -0
  250. package/modules/hall-ui/public/studio.css +2 -0
  251. package/modules/hall-ui/public/studio.html +1 -1
  252. package/modules/hall-ui/public/studio.js +27 -1
  253. package/modules/hall-ui/public/style.css +43 -26
  254. package/modules/hall-ui/public/task-detail.js +10 -7
  255. package/modules/hall-ui/public/task.css +2 -0
  256. package/modules/hall-ui/public/task.html +3 -1
  257. package/modules/hall-ui/public/task.js +23 -7
  258. package/modules/hall-ui/public/thinking.html +1 -1
  259. package/modules/hall-ui/public/tweak-editor.html +1 -1
  260. package/modules/hall-ui/public/vote-control.js +208 -0
  261. package/modules/hall-ui/public/watch.html +3 -5
  262. package/modules/hall-ui/public/watch.js +5 -4
  263. package/modules/hall-ui/public/welcome-boot.css +130 -0
  264. package/modules/hall-ui/public/welcome-boot.js +334 -0
  265. package/modules/hall-ui/public/welcome-day.webp +0 -0
  266. package/modules/hall-ui/public/welcome-night.webp +0 -0
  267. package/modules/hall-ui/public/work-summary.js +1 -1
  268. package/modules/hall-ui/public/work.css +1 -0
  269. package/modules/hall-ui/public/work.html +3 -1
  270. package/modules/hall-ui/public/work.js +2 -1
  271. package/modules/hall-ui/records/accomplishments.md +16 -0
  272. package/modules/hall-ui/records/hall-ask-card.md +33 -0
  273. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  274. package/modules/hall-ui/records/oversight-family.md +1 -1
  275. package/modules/hall-ui/records/profile-connections.md +2 -0
  276. package/modules/hall-ui/records/profile-roles.md +1 -1
  277. package/modules/hall-ui/records/reading-rooms.md +1 -1
  278. package/modules/hall-ui/records/welcome-tower.md +50 -0
  279. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  280. package/modules/ideas/projection.js +1 -1
  281. package/modules/ideas/routes/blockers.js +3 -3
  282. package/modules/ideas/routes/inbox.js +29 -1
  283. package/modules/ideas/routes/ratify-goal.js +1 -1
  284. package/modules/ideas/routing.js +1 -1
  285. package/modules/ideas/templates.js +1 -1
  286. package/modules/ideas/trail-descent.js +1 -1
  287. package/modules/ideas/trail-size.js +1 -1
  288. package/modules/ideas/votes.js +93 -0
  289. package/modules/lifecycle/abandon-leftovers.js +1 -1
  290. package/modules/lifecycle/cascade.js +1 -1
  291. package/modules/lifecycle/conflict-resolve.js +13 -21
  292. package/modules/lifecycle/criterion-ref.js +1 -1
  293. package/modules/lifecycle/db-analytics.js +57 -4
  294. package/modules/lifecycle/db-deps-criteria.js +1 -1
  295. package/modules/lifecycle/db-ship.js +2 -2
  296. package/modules/lifecycle/db-tasks.js +2 -2
  297. package/modules/lifecycle/db-versions.js +1 -1
  298. package/modules/lifecycle/db.js +2 -0
  299. package/modules/lifecycle/dead-deps.js +3 -3
  300. package/modules/lifecycle/dependency-advisory.js +3 -3
  301. package/modules/lifecycle/goal-category.js +1 -1
  302. package/modules/lifecycle/goal-forest.js +1 -1
  303. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  304. package/modules/lifecycle/kickoff-checklist.js +1 -1
  305. package/modules/lifecycle/kickoff-seed.js +1 -1
  306. package/modules/lifecycle/lifecycle.js +2 -0
  307. package/modules/lifecycle/merge-reach.js +29 -15
  308. package/modules/lifecycle/missing-dep-classify.js +3 -3
  309. package/modules/lifecycle/module.json +2 -1
  310. package/modules/lifecycle/page-tweak-approve.js +85 -1
  311. package/modules/lifecycle/page-tweak-hold.js +1 -1
  312. package/modules/lifecycle/publish-reconciler.js +1 -2
  313. package/modules/lifecycle/rot.js +1 -1
  314. package/modules/lifecycle/routes/artist-gate.js +1 -1
  315. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  316. package/modules/lifecycle/routes/goals.js +1 -1
  317. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  318. package/modules/lifecycle/routes/task-votes.js +54 -0
  319. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  320. package/modules/lifecycle/routes/tasks.js +2 -2
  321. package/modules/lifecycle/routes/versions.js +2 -2
  322. package/modules/lifecycle/ship-card.js +4 -4
  323. package/modules/lifecycle/ship-preflight.js +1 -1
  324. package/modules/lifecycle/task-classifier.js +1 -1
  325. package/modules/lifecycle/task-status.js +1 -1
  326. package/modules/lifecycle/task-visual-db.js +1 -1
  327. package/modules/memory/learnings.js +1 -1
  328. package/modules/memory/pollers/search-index.js +2 -2
  329. package/modules/memory/routes/learnings.js +1 -1
  330. package/modules/memory/routes/memory.js +1 -1
  331. package/modules/memory/search.js +2 -2
  332. package/modules/npm-release/release.js +1 -1
  333. package/modules/onboarding/howto-moments.js +1 -1
  334. package/modules/onboarding/newcomer-restock.js +3 -3
  335. package/modules/onboarding/onboarding.js +1 -1
  336. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  337. package/modules/platform-identity/origin-containment.js +1 -1
  338. package/modules/platform-identity/publish-gate.js +1 -1
  339. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  340. package/modules/provisioning/capacity.js +1 -1
  341. package/modules/provisioning/core-upgrade.js +15 -9
  342. package/modules/provisioning/credential-preflight.js +3 -3
  343. package/modules/provisioning/disconnect.js +1 -1
  344. package/modules/provisioning/dns-resolves.js +1 -1
  345. package/modules/provisioning/module.json +1 -1
  346. package/modules/provisioning/onboard-plan.js +1 -1
  347. package/modules/provisioning/paid-shape-gate.js +2 -2
  348. package/modules/provisioning/planet-physics.js +11 -2
  349. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  350. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  351. package/modules/provisioning/provisioning.js +2 -2
  352. package/modules/provisioning/render-lookup.js +1 -1
  353. package/modules/provisioning/render-standup.js +3 -3
  354. package/modules/provisioning/repo-private.js +1 -1
  355. package/modules/provisioning/routes/callback-page.js +1 -1
  356. package/modules/provisioning/routes/core-upgrade.js +23 -3
  357. package/modules/provisioning/routes/provisioning.js +2 -2
  358. package/modules/provisioning/routes/render-standup.js +1 -1
  359. package/modules/provisioning/routes/repo-private.js +1 -1
  360. package/modules/provisioning/soft-limits.js +1 -1
  361. package/modules/provisioning/starter-bundles.js +4 -2
  362. package/modules/provisioning/tests/provisioning.mjs +1 -1
  363. package/modules/public-landing/public/account.html +4 -6
  364. package/modules/public-landing/public/assets/cosmos.css +13 -6
  365. package/modules/public-landing/public/connections.html +4 -6
  366. package/modules/public-landing/public/contact.html +4 -6
  367. package/modules/public-landing/public/guild.html +4 -6
  368. package/modules/public-landing/public/index.html +11 -9
  369. package/modules/public-landing/public/invitations.html +4 -6
  370. package/modules/public-landing/public/privacy.html +4 -6
  371. package/modules/public-landing/public/projects.html +168 -46
  372. package/modules/public-landing/public/terms.html +4 -6
  373. package/modules/raise/content/copy.json +40 -0
  374. package/modules/raise/content/nda.html +39 -0
  375. package/modules/raise/content/settings.json +49 -0
  376. package/modules/raise/db.js +95 -0
  377. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  378. package/modules/raise/module.json +28 -0
  379. package/modules/raise/page.js +194 -0
  380. package/modules/raise/public/edit.js +152 -0
  381. package/modules/raise/public/favicon.svg +1 -0
  382. package/modules/raise/public/logo-ink.svg +1 -0
  383. package/modules/raise/public/logo-night.svg +1 -0
  384. package/modules/raise/public/mode.js +8 -0
  385. package/modules/raise/public/raise.css +234 -0
  386. package/modules/raise/public/raise.js +91 -0
  387. package/modules/raise/raise.js +174 -0
  388. package/modules/raise/routes/raise.js +152 -0
  389. package/modules/raise/views/gate.html +39 -0
  390. package/modules/raise/views/nda.html +21 -0
  391. package/modules/raise/views/page.html +133 -0
  392. package/modules/raise/web.js +72 -0
  393. package/modules/render-deploy/deploys.js +1 -1
  394. package/modules/render-deploy/render.js +2 -2
  395. package/modules/security/secret-scrub.js +3 -3
  396. package/modules/security/security.js +1 -1
  397. package/modules/security/tests/artifact_scan.mjs +1 -1
  398. package/modules/security/tests/mirror.mjs +1 -1
  399. package/modules/security/tests/scan_store.mjs +1 -1
  400. package/modules/sessions/db.js +2 -2
  401. package/modules/sessions/pulse.js +2 -2
  402. package/modules/sessions/routes/sessions.js +1 -1
  403. package/modules/specialities/specialities.js +1 -1
  404. package/modules/status-ui/public/README.md +3 -4
  405. package/modules/status-ui/public/index.html +5 -31
  406. package/modules/status-ui/public/status.js +6 -174
  407. package/modules/status-ui/public/style.css +4 -133
  408. package/modules/ui-design/docs/design-contract.md +3 -3
  409. package/modules/ui-design/kit/README.md +1 -1
  410. package/modules/ui-design/kit/serve.js +13 -4
  411. package/modules/ui-design/scripts/design-sync.js +1 -1
  412. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  413. package/modules/ui-design/scripts/validate-design.js +1 -1
  414. package/package-lock.json +27 -11
  415. package/package.json +2 -3
  416. package/release-notes.json +178 -0
  417. package/scripts/bongos/CLAUDE.md +15 -0
  418. package/scripts/bongos/abandon.js +137 -0
  419. package/scripts/bongos/accessibility-replay.js +195 -0
  420. package/scripts/bongos/address-park-sweep.sh +91 -0
  421. package/scripts/bongos/adopt-detect.js +123 -0
  422. package/scripts/bongos/adopt-import.js +111 -0
  423. package/scripts/bongos/adopt-preflight.js +187 -0
  424. package/scripts/bongos/adr-namespace.js +273 -0
  425. package/scripts/bongos/agent-invoke.js +689 -0
  426. package/scripts/bongos/agents-sync.js +502 -0
  427. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  428. package/scripts/bongos/api-artifacts.js +91 -0
  429. package/scripts/bongos/api.js +86 -0
  430. package/scripts/bongos/api.ps1 +26 -0
  431. package/scripts/bongos/architect-audit.js +294 -0
  432. package/scripts/bongos/artifact-audit.js +326 -0
  433. package/scripts/bongos/artifact-format.js +203 -0
  434. package/scripts/bongos/artifact-staleness.js +267 -0
  435. package/scripts/bongos/ask.js +231 -0
  436. package/scripts/bongos/audit-authorship.sh +329 -0
  437. package/scripts/bongos/audit-deps.js +189 -0
  438. package/scripts/bongos/audit-gate.js +121 -0
  439. package/scripts/bongos/audit-rank-roles.js +172 -0
  440. package/scripts/bongos/audit-replay.sh +205 -0
  441. package/scripts/bongos/autobongos-digest.js +123 -0
  442. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  443. package/scripts/bongos/autobongos-loop.js +210 -0
  444. package/scripts/bongos/autobongos-run.js +1361 -0
  445. package/scripts/bongos/autobongos-service.cmd +50 -0
  446. package/scripts/bongos/autobongos-service.ps1 +270 -0
  447. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  448. package/scripts/bongos/autobongos-verify.js +618 -0
  449. package/scripts/bongos/autonomy-gate.js +135 -0
  450. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  451. package/scripts/bongos/autonomy-gauge.js +84 -0
  452. package/scripts/bongos/backfill-cost.js +176 -0
  453. package/scripts/bongos/backfill-disciplines.js +144 -0
  454. package/scripts/bongos/backfill-session-earnings.js +123 -0
  455. package/scripts/bongos/backfill-session-types.js +87 -0
  456. package/scripts/bongos/backfill-sessions.js +411 -0
  457. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  458. package/scripts/bongos/backfill-task-rewards.js +413 -0
  459. package/scripts/bongos/backlog-review.js +399 -0
  460. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  461. package/scripts/bongos/backup.js +116 -0
  462. package/scripts/bongos/baseline-staleness.js +217 -0
  463. package/scripts/bongos/bfg-principal-token.js +65 -0
  464. package/scripts/bongos/bug-attachment-audit.js +149 -0
  465. package/scripts/bongos/bug-attachment-recover.js +198 -0
  466. package/scripts/bongos/bug-triage.js +292 -0
  467. package/scripts/bongos/build-bongos.js +94 -0
  468. package/scripts/bongos/bump-version.js +221 -0
  469. package/scripts/bongos/capture.js +481 -0
  470. package/scripts/bongos/category-advisory-guard.js +206 -0
  471. package/scripts/bongos/ci-grade.js +82 -0
  472. package/scripts/bongos/claim-recall.js +112 -0
  473. package/scripts/bongos/claim.js +789 -0
  474. package/scripts/bongos/classify-discipline.js +153 -0
  475. package/scripts/bongos/claude-materialize.js +1200 -0
  476. package/scripts/bongos/claude-md-template.js +142 -0
  477. package/scripts/bongos/cleanup-orphans.js +74 -0
  478. package/scripts/bongos/cli-lib.js +1226 -0
  479. package/scripts/bongos/client-baseurl-guard.js +116 -0
  480. package/scripts/bongos/codemod-rename-scripts-gds.js +381 -0
  481. package/scripts/bongos/codemod-rename-src-gds.js +145 -0
  482. package/scripts/bongos/conductor-dispatch.js +535 -0
  483. package/scripts/bongos/context-pack.js +326 -0
  484. package/scripts/bongos/control-manifest.js +199 -0
  485. package/scripts/bongos/copy-apply.js +758 -0
  486. package/scripts/bongos/copy-inventory.js +571 -0
  487. package/scripts/bongos/core-origin-follow.js +185 -0
  488. package/scripts/bongos/core-pin-sync.js +260 -0
  489. package/scripts/bongos/coreB-carve-proof.sh +725 -0
  490. package/scripts/bongos/cost-report.js +63 -0
  491. package/scripts/bongos/cost.js +47 -0
  492. package/scripts/bongos/credential-presence.js +296 -0
  493. package/scripts/bongos/cutover-codemod.js +240 -0
  494. package/scripts/bongos/db-backup-nightly.sh +232 -0
  495. package/scripts/bongos/db-backup-offsite.sh +267 -0
  496. package/scripts/bongos/demote.js +45 -0
  497. package/scripts/bongos/deploy-divergence.js +454 -0
  498. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  499. package/scripts/bongos/design-sync.js +12 -0
  500. package/scripts/bongos/dev-box-guard.js +166 -0
  501. package/scripts/bongos/dev-lib.js +722 -0
  502. package/scripts/bongos/dev.js +645 -0
  503. package/scripts/bongos/device-flow-help.js +72 -0
  504. package/scripts/bongos/diagnose-achievements.js +118 -0
  505. package/scripts/bongos/diagram-facts.js +355 -0
  506. package/scripts/bongos/discord-channels.js +77 -0
  507. package/scripts/bongos/do-api.js +109 -0
  508. package/scripts/bongos/doc-cli-guard.js +274 -0
  509. package/scripts/bongos/doc-comment-coverage.js +139 -0
  510. package/scripts/bongos/doc-control-claims.js +170 -0
  511. package/scripts/bongos/docs-entropy.js +453 -0
  512. package/scripts/bongos/doctor.js +493 -0
  513. package/scripts/bongos/enroll-control-plane.js +101 -0
  514. package/scripts/bongos/exec-path-guard.js +564 -0
  515. package/scripts/bongos/feedback-send.js +249 -0
  516. package/scripts/bongos/fetch-art-key.js +106 -0
  517. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  518. package/scripts/bongos/figma-design-sync.js +11 -0
  519. package/scripts/bongos/find-untested.js +371 -0
  520. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  521. package/scripts/bongos/fitness-checks-identity.js +343 -0
  522. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  523. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  524. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  525. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  526. package/scripts/bongos/fitness-lib.js +127 -0
  527. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  528. package/scripts/bongos/fitness-ratchets.js +594 -0
  529. package/scripts/bongos/fitness.js +1498 -0
  530. package/scripts/bongos/forwarder.js +80 -0
  531. package/scripts/bongos/gate-review.js +330 -0
  532. package/scripts/bongos/gating.js +348 -0
  533. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  534. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  535. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  537. package/scripts/bongos/gds-literal-scan.js +196 -0
  538. package/scripts/bongos/gen-api-client.js +576 -0
  539. package/scripts/bongos/gen-api-docs.js +1111 -0
  540. package/scripts/bongos/gen-atlas.js +366 -0
  541. package/scripts/bongos/gen-diagrams.js +608 -0
  542. package/scripts/bongos/gen-file-map.js +337 -0
  543. package/scripts/bongos/gen-freshness.js +32 -0
  544. package/scripts/bongos/gen-interaction-posture.js +122 -0
  545. package/scripts/bongos/gen-repo-map.js +540 -0
  546. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  547. package/scripts/bongos/gen-session-index.js +243 -0
  548. package/scripts/bongos/gen-sounds.js +176 -0
  549. package/scripts/bongos/git-merge-regen.js +254 -0
  550. package/scripts/bongos/go-live.js +1071 -0
  551. package/scripts/bongos/goal-names.js +102 -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 +336 -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-goals.js +109 -0
  655. package/scripts/bongos/rename-history-check.js +369 -0
  656. package/scripts/bongos/rename-ledger-prose.js +482 -0
  657. package/scripts/bongos/render-api.js +197 -0
  658. package/scripts/bongos/render-check.js +206 -0
  659. package/scripts/bongos/render-ideas.js +226 -0
  660. package/scripts/bongos/render-payload.js +85 -0
  661. package/scripts/bongos/repo-metrics.js +363 -0
  662. package/scripts/bongos/review-sheet.js +108 -0
  663. package/scripts/bongos/role-pack-guard.js +142 -0
  664. package/scripts/bongos/route-shadow-guard.js +175 -0
  665. package/scripts/bongos/routine-schedule.js +283 -0
  666. package/scripts/bongos/run-routine.js +257 -0
  667. package/scripts/bongos/run-unit-tests.js +654 -0
  668. package/scripts/bongos/runner-drift.js +151 -0
  669. package/scripts/bongos/sandbox-stage.js +459 -0
  670. package/scripts/bongos/scope-map-guard.js +300 -0
  671. package/scripts/bongos/scope-roster-guard.js +118 -0
  672. package/scripts/bongos/seam-wiring-guard.js +275 -0
  673. package/scripts/bongos/search-ingest-db.js +288 -0
  674. package/scripts/bongos/search-ingest-md.js +269 -0
  675. package/scripts/bongos/seed-adopt-tasks.js +75 -0
  676. package/scripts/bongos/seed-api-contract-goal-tasks.js +141 -0
  677. package/scripts/bongos/seed-board-room-tasks.js +196 -0
  678. package/scripts/bongos/seed-bongos-app-tasks.js +294 -0
  679. package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +81 -0
  680. package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +100 -0
  681. package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +307 -0
  682. package/scripts/bongos/seed-bongos-module-system-tasks.js +346 -0
  683. package/scripts/bongos/seed-bongos-tasks.js +214 -0
  684. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  685. package/scripts/bongos/seed-bongos-v1-seo-tasks.js +104 -0
  686. package/scripts/bongos/seed-bv1-community-tasks.js +131 -0
  687. package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +133 -0
  688. package/scripts/bongos/seed-bv1-profile-page-tasks.js +161 -0
  689. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  690. package/scripts/bongos/seed-bv1-r01-delta-tasks.js +154 -0
  691. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  692. package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +277 -0
  693. package/scripts/bongos/seed-gds-v4-tasks.js +624 -0
  694. package/scripts/bongos/seed-governance-tasks.js +340 -0
  695. package/scripts/bongos/seed-medusa-tasks.js +440 -0
  696. package/scripts/bongos/seed-module-upstreaming.js +219 -0
  697. package/scripts/bongos/seed-productization-tasks.js +235 -0
  698. package/scripts/bongos/seed-project-admin-console-tasks.js +88 -0
  699. package/scripts/bongos/seed-provisioning-tasks.js +83 -0
  700. package/scripts/bongos/seed-staging.sh +117 -0
  701. package/scripts/bongos/seed-strict-versioning-tasks.js +275 -0
  702. package/scripts/bongos/seed-v2-world-tasks.js +283 -0
  703. package/scripts/bongos/seed-verify-criteria.js +124 -0
  704. package/scripts/bongos/sequence.js +597 -0
  705. package/scripts/bongos/session-cost.js +430 -0
  706. package/scripts/bongos/session-digest-build.js +293 -0
  707. package/scripts/bongos/session-digest.js +200 -0
  708. package/scripts/bongos/session-eval.js +631 -0
  709. package/scripts/bongos/session-transcript-build.js +155 -0
  710. package/scripts/bongos/session-transcript-upload.js +29 -0
  711. package/scripts/bongos/session.js +404 -0
  712. package/scripts/bongos/setup.js +646 -0
  713. package/scripts/bongos/ship-check.js +89 -0
  714. package/scripts/bongos/ship-deploy-target.js +393 -0
  715. package/scripts/bongos/ship-escalation.js +167 -0
  716. package/scripts/bongos/ship-finish.js +420 -0
  717. package/scripts/bongos/ship-flow.js +1217 -0
  718. package/scripts/bongos/ship-git.js +100 -0
  719. package/scripts/bongos/ship-grade-steps.js +547 -0
  720. package/scripts/bongos/ship-grade.js +426 -0
  721. package/scripts/bongos/ship-honesty.js +314 -0
  722. package/scripts/bongos/ship-io.js +139 -0
  723. package/scripts/bongos/ship-land.js +1130 -0
  724. package/scripts/bongos/ship-memory-sync.js +249 -0
  725. package/scripts/bongos/ship-merge-gate.js +225 -0
  726. package/scripts/bongos/ship-merge.js +466 -0
  727. package/scripts/bongos/ship-mode-ask.js +138 -0
  728. package/scripts/bongos/ship-mode-manual.js +54 -0
  729. package/scripts/bongos/ship-preflight-steps.js +399 -0
  730. package/scripts/bongos/ship-regen.js +292 -0
  731. package/scripts/bongos/ship-resume.js +201 -0
  732. package/scripts/bongos/ship-session-upload.js +313 -0
  733. package/scripts/bongos/ship-state.js +110 -0
  734. package/scripts/bongos/ship-surprise.js +84 -0
  735. package/scripts/bongos/ship-visual.js +75 -0
  736. package/scripts/bongos/ship.js +382 -0
  737. package/scripts/bongos/shipping-mode.js +71 -0
  738. package/scripts/bongos/skill-lint.js +250 -0
  739. package/scripts/bongos/skill-preflight.js +361 -0
  740. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  741. package/scripts/bongos/smoke-batch-release.sh +316 -0
  742. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  743. package/scripts/bongos/smoke-dependencies.sh +143 -0
  744. package/scripts/bongos/smoke-gds.js +256 -0
  745. package/scripts/bongos/smoke-write.sh +275 -0
  746. package/scripts/bongos/source-text-test-scan.js +106 -0
  747. package/scripts/bongos/spark.js +294 -0
  748. package/scripts/bongos/stale-worktrees.js +212 -0
  749. package/scripts/bongos/start-goals.js +102 -0
  750. package/scripts/bongos/start.js +1090 -0
  751. package/scripts/bongos/status.js +545 -0
  752. package/scripts/bongos/strand-watch.js +315 -0
  753. package/scripts/bongos/stranded-rows.js +200 -0
  754. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  755. package/scripts/bongos/surface.js +101 -0
  756. package/scripts/bongos/task.js +273 -0
  757. package/scripts/bongos/test-path-guard.js +99 -0
  758. package/scripts/bongos/triage.js +742 -0
  759. package/scripts/bongos/turn-end-sound.js +74 -0
  760. package/scripts/bongos/tweak-halt.js +70 -0
  761. package/scripts/bongos/tweak-renders.js +200 -0
  762. package/scripts/bongos/uat.js +120 -0
  763. package/scripts/bongos/ui-kit-transform.js +43 -0
  764. package/scripts/bongos/update-channel.js +512 -0
  765. package/scripts/bongos/update-sweep.js +829 -0
  766. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  767. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  768. package/scripts/bongos/upgrade-migrate.js +224 -0
  769. package/scripts/bongos/upgrade-operator.js +73 -0
  770. package/scripts/bongos/upgrade-outcome.js +174 -0
  771. package/scripts/bongos/upgrade.js +1499 -0
  772. package/scripts/bongos/validate-design.js +12 -0
  773. package/scripts/bongos/version-close.js +621 -0
  774. package/scripts/bongos/version-literal-guard.js +140 -0
  775. package/scripts/bongos/version-select.js +79 -0
  776. package/scripts/bongos/visual-review-nudge.js +39 -0
  777. package/scripts/bongos/wedge-remedy.js +174 -0
  778. package/scripts/bongos/worktree-claim-guard.js +130 -0
  779. package/scripts/bongos/worktree.js +449 -0
  780. package/scripts/discord/post.js +1 -1
  781. package/scripts/gds/README.md +9 -0
  782. package/scripts/gds/abandon.js +6 -136
  783. package/scripts/gds/accessibility-replay.js +5 -194
  784. package/scripts/gds/address-park-sweep.sh +7 -90
  785. package/scripts/gds/adopt-detect.js +5 -121
  786. package/scripts/gds/adopt-import.js +5 -109
  787. package/scripts/gds/adopt-preflight.js +5 -185
  788. package/scripts/gds/adr-namespace.js +5 -271
  789. package/scripts/gds/agent-invoke.js +5 -687
  790. package/scripts/gds/agents-sync.js +5 -500
  791. package/scripts/gds/api-alias-caller-scan.js +5 -255
  792. package/scripts/gds/api-artifacts.js +6 -0
  793. package/scripts/gds/api.js +6 -85
  794. package/scripts/gds/api.ps1 +8 -26
  795. package/scripts/gds/architect-audit.js +6 -293
  796. package/scripts/gds/artifact-audit.js +5 -324
  797. package/scripts/gds/artifact-format.js +6 -203
  798. package/scripts/gds/artifact-staleness.js +5 -265
  799. package/scripts/gds/ask.js +5 -229
  800. package/scripts/gds/audit-authorship.sh +7 -328
  801. package/scripts/gds/audit-deps.js +6 -188
  802. package/scripts/gds/audit-gate.js +5 -119
  803. package/scripts/gds/audit-rank-roles.js +6 -171
  804. package/scripts/gds/audit-replay.sh +7 -204
  805. package/scripts/gds/autobongos-digest.js +5 -121
  806. package/scripts/gds/autobongos-grade-cap.js +5 -186
  807. package/scripts/gds/autobongos-loop.js +5 -208
  808. package/scripts/gds/autobongos-run.js +5 -1359
  809. package/scripts/gds/autobongos-service.cmd +8 -49
  810. package/scripts/gds/autobongos-service.ps1 +8 -270
  811. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  812. package/scripts/gds/autobongos-verify.js +5 -616
  813. package/scripts/gds/autonomy-gate.js +5 -133
  814. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  815. package/scripts/gds/autonomy-gauge.js +5 -82
  816. package/scripts/gds/backfill-cost.js +6 -175
  817. package/scripts/gds/backfill-disciplines.js +5 -142
  818. package/scripts/gds/backfill-session-earnings.js +5 -121
  819. package/scripts/gds/backfill-session-types.js +5 -85
  820. package/scripts/gds/backfill-sessions.js +5 -409
  821. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  822. package/scripts/gds/backfill-task-rewards.js +5 -411
  823. package/scripts/gds/backlog-review.js +6 -398
  824. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  825. package/scripts/gds/backup.js +6 -115
  826. package/scripts/gds/baseline-staleness.js +5 -215
  827. package/scripts/gds/bfg-principal-token.js +6 -64
  828. package/scripts/gds/bug-attachment-audit.js +5 -147
  829. package/scripts/gds/bug-attachment-recover.js +5 -196
  830. package/scripts/gds/bug-triage.js +6 -291
  831. package/scripts/gds/build-bongos.js +5 -92
  832. package/scripts/gds/bump-version.js +5 -219
  833. package/scripts/gds/capture.js +6 -480
  834. package/scripts/gds/category-advisory-guard.js +5 -205
  835. package/scripts/gds/ci-grade.js +6 -81
  836. package/scripts/gds/claim-recall.js +6 -111
  837. package/scripts/gds/claim.js +6 -788
  838. package/scripts/gds/classify-discipline.js +6 -152
  839. package/scripts/gds/claude-materialize.js +5 -1198
  840. package/scripts/gds/claude-md-template.js +5 -140
  841. package/scripts/gds/cleanup-orphans.js +6 -73
  842. package/scripts/gds/cli-lib.js +6 -1204
  843. package/scripts/gds/client-baseurl-guard.js +5 -114
  844. package/scripts/gds/codemod-rename-src-gds.js +6 -144
  845. package/scripts/gds/conductor-dispatch.js +6 -534
  846. package/scripts/gds/context-pack.js +6 -325
  847. package/scripts/gds/control-manifest.js +5 -197
  848. package/scripts/gds/copy-apply.js +5 -756
  849. package/scripts/gds/copy-inventory.js +5 -569
  850. package/scripts/gds/core-origin-follow.js +5 -184
  851. package/scripts/gds/core-pin-sync.js +5 -258
  852. package/scripts/gds/coreB-carve-proof.sh +7 -724
  853. package/scripts/gds/cost-report.js +6 -62
  854. package/scripts/gds/cost.js +6 -46
  855. package/scripts/gds/credential-presence.js +5 -294
  856. package/scripts/gds/cutover-codemod.js +5 -239
  857. package/scripts/gds/db-backup-nightly.sh +7 -231
  858. package/scripts/gds/db-backup-offsite.sh +7 -266
  859. package/scripts/gds/demote.js +6 -44
  860. package/scripts/gds/deploy-divergence.js +6 -445
  861. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  862. package/scripts/gds/design-sync.js +5 -10
  863. package/scripts/gds/dev-box-guard.js +5 -164
  864. package/scripts/gds/dev-lib.js +5 -721
  865. package/scripts/gds/dev.js +5 -643
  866. package/scripts/gds/device-flow-help.js +5 -70
  867. package/scripts/gds/diagnose-achievements.js +5 -116
  868. package/scripts/gds/diagram-facts.js +6 -355
  869. package/scripts/gds/discord-channels.js +5 -75
  870. package/scripts/gds/do-api.js +6 -109
  871. package/scripts/gds/doc-cli-guard.js +5 -266
  872. package/scripts/gds/doc-comment-coverage.js +5 -137
  873. package/scripts/gds/doc-control-claims.js +5 -166
  874. package/scripts/gds/docs-entropy.js +5 -443
  875. package/scripts/gds/doctor.js +6 -492
  876. package/scripts/gds/enroll-control-plane.js +5 -99
  877. package/scripts/gds/exec-path-guard.js +5 -562
  878. package/scripts/gds/feedback-send.js +5 -247
  879. package/scripts/gds/fetch-art-key.js +5 -104
  880. package/scripts/gds/fetch-sound-prefs.js +5 -124
  881. package/scripts/gds/figma-design-sync.js +5 -9
  882. package/scripts/gds/find-untested.js +5 -369
  883. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  884. package/scripts/gds/fitness-checks-identity.js +5 -342
  885. package/scripts/gds/fitness-checks-packaging.js +5 -131
  886. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  887. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  888. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  889. package/scripts/gds/fitness-lib.js +5 -126
  890. package/scripts/gds/fitness-migration-contraction.js +5 -49
  891. package/scripts/gds/fitness-ratchets.js +5 -563
  892. package/scripts/gds/fitness.js +5 -1493
  893. package/scripts/gds/gate-review.js +5 -328
  894. package/scripts/gds/gating.js +5 -346
  895. package/scripts/gds/gds-literal-scan.js +5 -194
  896. package/scripts/gds/gen-api-client.js +5 -555
  897. package/scripts/gds/gen-api-docs.js +5 -1100
  898. package/scripts/gds/gen-atlas.js +5 -364
  899. package/scripts/gds/gen-diagrams.js +6 -607
  900. package/scripts/gds/gen-file-map.js +5 -335
  901. package/scripts/gds/gen-freshness.js +5 -31
  902. package/scripts/gds/gen-interaction-posture.js +5 -120
  903. package/scripts/gds/gen-repo-map.js +5 -538
  904. package/scripts/gds/gen-role-responsibilities.js +5 -133
  905. package/scripts/gds/gen-session-index.js +5 -241
  906. package/scripts/gds/gen-sounds.js +5 -174
  907. package/scripts/gds/git-merge-regen.js +6 -291
  908. package/scripts/gds/go-live.js +5 -1069
  909. package/scripts/gds/goal-names.js +5 -100
  910. package/scripts/gds/goal.js +6 -271
  911. package/scripts/gds/government-walk.js +5 -1475
  912. package/scripts/gds/grade-correlation-audit.js +5 -308
  913. package/scripts/gds/grade-replay.js +5 -235
  914. package/scripts/gds/grade-smoke.js +6 -204
  915. package/scripts/gds/home-isolation-guard.js +5 -125
  916. package/scripts/gds/hooks/pre-push.js +5 -209
  917. package/scripts/gds/howto.js +5 -143
  918. package/scripts/gds/http-api-client.js +6 -81
  919. package/scripts/gds/identity-strip.js +5 -74
  920. package/scripts/gds/init.js +5 -1157
  921. package/scripts/gds/install-git-hooks.js +5 -198
  922. package/scripts/gds/instance-apex.js +5 -37
  923. package/scripts/gds/intent-retry.js +5 -51
  924. package/scripts/gds/key-card.js +6 -221
  925. package/scripts/gds/key-status.js +5 -124
  926. package/scripts/gds/land-watch.js +5 -199
  927. package/scripts/gds/leak-scan-allowlist.js +5 -291
  928. package/scripts/gds/learning-capture.js +6 -144
  929. package/scripts/gds/lib.sh +7 -73
  930. package/scripts/gds/linkify-refs.js +6 -654
  931. package/scripts/gds/lint-infra-exec.js +5 -68
  932. package/scripts/gds/lint-migrations.js +5 -100
  933. package/scripts/gds/lint-workflow-exec.js +5 -61
  934. package/scripts/gds/local-preview-lib.js +6 -128
  935. package/scripts/gds/local-preview.js +6 -81
  936. package/scripts/gds/login.js +5 -358
  937. package/scripts/gds/main-audit.js +5 -623
  938. package/scripts/gds/me.js +6 -96
  939. package/scripts/gds/memory-map.js +5 -174
  940. package/scripts/gds/merge-lock.js +6 -70
  941. package/scripts/gds/migration-namespace.js +5 -311
  942. package/scripts/gds/mirror-lineage-check.js +5 -341
  943. package/scripts/gds/mirror-redact.js +5 -348
  944. package/scripts/gds/module-artifact.js +6 -289
  945. package/scripts/gds/module-assess-docs.js +6 -237
  946. package/scripts/gds/module-assess-installs.js +6 -227
  947. package/scripts/gds/module-assess-score.js +6 -110
  948. package/scripts/gds/module-assess-security.js +6 -251
  949. package/scripts/gds/module-assess-tests.js +6 -277
  950. package/scripts/gds/module-assess-version.js +6 -91
  951. package/scripts/gds/module-error-report.js +5 -146
  952. package/scripts/gds/module-test-runner.js +6 -413
  953. package/scripts/gds/module.js +5 -1374
  954. package/scripts/gds/move-escalation.js +5 -140
  955. package/scripts/gds/newcomer-floor.js +6 -420
  956. package/scripts/gds/newcomer-floor.test.js +6 -234
  957. package/scripts/gds/next-number.js +6 -162
  958. package/scripts/gds/oauth-secret.js +5 -200
  959. package/scripts/gds/onboard.js +5 -265
  960. package/scripts/gds/onboarding-analyze.js +6 -225
  961. package/scripts/gds/onboarding-config.js +6 -179
  962. package/scripts/gds/onboarding-ship.js +6 -91
  963. package/scripts/gds/pack-env-prefix.js +5 -72
  964. package/scripts/gds/package-core.js +5 -1102
  965. package/scripts/gds/page-inventory.js +5 -346
  966. package/scripts/gds/page-reader.js +5 -720
  967. package/scripts/gds/paste-token.js +6 -211
  968. package/scripts/gds/plain-cards.js +5 -350
  969. package/scripts/gds/portability-smoke-art.sh +7 -84
  970. package/scripts/gds/portability-smoke-memory.sh +7 -175
  971. package/scripts/gds/preflight.js +5 -212
  972. package/scripts/gds/probe-cache.js +5 -244
  973. package/scripts/gds/prove-strict-versioning.js +6 -283
  974. package/scripts/gds/provision-auto-upgrade.js +5 -161
  975. package/scripts/gds/provision-byo-host.js +5 -67
  976. package/scripts/gds/provision-capacity.js +5 -78
  977. package/scripts/gds/provision-caps.js +5 -62
  978. package/scripts/gds/provision-config.js +5 -232
  979. package/scripts/gds/provision-core-upgrade.js +5 -1165
  980. package/scripts/gds/provision-disconnect.js +5 -87
  981. package/scripts/gds/provision-github-setup.js +5 -167
  982. package/scripts/gds/provision-net.js +5 -356
  983. package/scripts/gds/provision-pin-key.js +5 -175
  984. package/scripts/gds/provision-pin-replay.js +5 -125
  985. package/scripts/gds/provision-process.js +5 -169
  986. package/scripts/gds/provision-render.js +5 -200
  987. package/scripts/gds/provision-repo-auth.js +5 -163
  988. package/scripts/gds/provision-repo-private.js +5 -97
  989. package/scripts/gds/provision-repo.js +5 -1336
  990. package/scripts/gds/provision-teardown.js +5 -105
  991. package/scripts/gds/provision-units.js +5 -468
  992. package/scripts/gds/provision.js +5 -1477
  993. package/scripts/gds/publish-credential-check.js +6 -65
  994. package/scripts/gds/publish-integration-gate.js +5 -140
  995. package/scripts/gds/publish-manifest.js +5 -437
  996. package/scripts/gds/publish-watch.js +5 -266
  997. package/scripts/gds/pulse.js +6 -335
  998. package/scripts/gds/push-main.js +5 -54
  999. package/scripts/gds/push-path-brief.js +5 -98
  1000. package/scripts/gds/read-session-export.js +5 -357
  1001. package/scripts/gds/reauth.js +6 -154
  1002. package/scripts/gds/recall.js +6 -182
  1003. package/scripts/gds/redteam-patrol.js +5 -435
  1004. package/scripts/gds/regen-instance-docs.js +5 -45
  1005. package/scripts/gds/release-core.js +5 -78
  1006. package/scripts/gds/release-notes.js +5 -270
  1007. package/scripts/gds/release.js +6 -138
  1008. package/scripts/gds/rename-goals.js +5 -107
  1009. package/scripts/gds/rename-history-check.js +5 -367
  1010. package/scripts/gds/rename-ledger-prose.js +5 -480
  1011. package/scripts/gds/render-api.js +5 -196
  1012. package/scripts/gds/render-check.js +5 -204
  1013. package/scripts/gds/render-ideas.js +6 -225
  1014. package/scripts/gds/render-payload.js +5 -84
  1015. package/scripts/gds/repo-metrics.js +6 -362
  1016. package/scripts/gds/review-sheet.js +5 -106
  1017. package/scripts/gds/role-pack-guard.js +5 -141
  1018. package/scripts/gds/route-shadow-guard.js +5 -173
  1019. package/scripts/gds/routine-schedule.js +5 -281
  1020. package/scripts/gds/run-routine.js +5 -255
  1021. package/scripts/gds/run-unit-tests.js +6 -659
  1022. package/scripts/gds/runner-drift.js +5 -149
  1023. package/scripts/gds/sandbox-stage.js +6 -458
  1024. package/scripts/gds/scope-map-guard.js +5 -299
  1025. package/scripts/gds/scope-roster-guard.js +5 -117
  1026. package/scripts/gds/seam-wiring-guard.js +5 -274
  1027. package/scripts/gds/search-ingest-db.js +6 -287
  1028. package/scripts/gds/search-ingest-md.js +6 -268
  1029. package/scripts/gds/seed-adopt-tasks.js +6 -74
  1030. package/scripts/gds/seed-api-contract-goal-tasks.js +6 -140
  1031. package/scripts/gds/seed-board-room-tasks.js +6 -196
  1032. package/scripts/gds/seed-bongos-app-tasks.js +6 -293
  1033. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +6 -80
  1034. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +6 -99
  1035. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +6 -306
  1036. package/scripts/gds/seed-bongos-module-system-tasks.js +6 -345
  1037. package/scripts/gds/seed-bongos-tasks.js +6 -213
  1038. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  1039. package/scripts/gds/seed-bongos-v1-seo-tasks.js +6 -104
  1040. package/scripts/gds/seed-bv1-community-tasks.js +6 -131
  1041. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +6 -133
  1042. package/scripts/gds/seed-bv1-profile-page-tasks.js +6 -161
  1043. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1044. package/scripts/gds/seed-bv1-r01-delta-tasks.js +6 -154
  1045. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1046. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +6 -277
  1047. package/scripts/gds/seed-gds-v4-tasks.js +6 -623
  1048. package/scripts/gds/seed-governance-tasks.js +6 -339
  1049. package/scripts/gds/seed-medusa-tasks.js +6 -439
  1050. package/scripts/gds/seed-module-upstreaming.js +5 -217
  1051. package/scripts/gds/seed-productization-tasks.js +6 -234
  1052. package/scripts/gds/seed-project-admin-console-tasks.js +6 -88
  1053. package/scripts/gds/seed-provisioning-tasks.js +6 -82
  1054. package/scripts/gds/seed-staging.sh +7 -116
  1055. package/scripts/gds/seed-strict-versioning-tasks.js +6 -274
  1056. package/scripts/gds/seed-v2-world-tasks.js +6 -282
  1057. package/scripts/gds/seed-verify-criteria.js +6 -124
  1058. package/scripts/gds/sequence.js +6 -596
  1059. package/scripts/gds/session-cost.js +6 -429
  1060. package/scripts/gds/session-digest-build.js +6 -293
  1061. package/scripts/gds/session-digest.js +6 -199
  1062. package/scripts/gds/session-eval.js +6 -630
  1063. package/scripts/gds/session-transcript-build.js +6 -155
  1064. package/scripts/gds/session-transcript-upload.js +6 -29
  1065. package/scripts/gds/session.js +6 -403
  1066. package/scripts/gds/setup.js +6 -645
  1067. package/scripts/gds/ship-check.js +5 -85
  1068. package/scripts/gds/ship-deploy-target.js +5 -392
  1069. package/scripts/gds/ship-escalation.js +5 -166
  1070. package/scripts/gds/ship-finish.js +5 -419
  1071. package/scripts/gds/ship-flow.js +5 -1216
  1072. package/scripts/gds/ship-git.js +5 -99
  1073. package/scripts/gds/ship-grade-steps.js +5 -546
  1074. package/scripts/gds/ship-grade.js +5 -425
  1075. package/scripts/gds/ship-honesty.js +5 -312
  1076. package/scripts/gds/ship-io.js +5 -138
  1077. package/scripts/gds/ship-land.js +5 -1129
  1078. package/scripts/gds/ship-memory-sync.js +5 -248
  1079. package/scripts/gds/ship-merge-gate.js +5 -224
  1080. package/scripts/gds/ship-merge.js +5 -465
  1081. package/scripts/gds/ship-mode-ask.js +5 -137
  1082. package/scripts/gds/ship-mode-manual.js +5 -53
  1083. package/scripts/gds/ship-preflight-steps.js +5 -398
  1084. package/scripts/gds/ship-regen.js +5 -313
  1085. package/scripts/gds/ship-resume.js +5 -200
  1086. package/scripts/gds/ship-session-upload.js +5 -312
  1087. package/scripts/gds/ship-state.js +5 -109
  1088. package/scripts/gds/ship-surprise.js +5 -83
  1089. package/scripts/gds/ship-visual.js +5 -74
  1090. package/scripts/gds/ship.js +5 -380
  1091. package/scripts/gds/shipping-mode.js +5 -69
  1092. package/scripts/gds/skill-lint.js +5 -248
  1093. package/scripts/gds/skill-preflight.js +5 -359
  1094. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1095. package/scripts/gds/smoke-batch-release.sh +7 -315
  1096. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1097. package/scripts/gds/smoke-dependencies.sh +7 -142
  1098. package/scripts/gds/smoke-gds.js +6 -255
  1099. package/scripts/gds/smoke-write.sh +7 -274
  1100. package/scripts/gds/source-text-test-scan.js +7 -0
  1101. package/scripts/gds/spark.js +6 -293
  1102. package/scripts/gds/stale-worktrees.js +5 -210
  1103. package/scripts/gds/start-goals.js +5 -101
  1104. package/scripts/gds/start.js +6 -1089
  1105. package/scripts/gds/status.js +6 -544
  1106. package/scripts/gds/strand-watch.js +5 -313
  1107. package/scripts/gds/stranded-rows.js +5 -198
  1108. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1109. package/scripts/gds/surface.js +5 -100
  1110. package/scripts/gds/task.js +6 -272
  1111. package/scripts/gds/test-path-guard.js +5 -97
  1112. package/scripts/gds/triage.js +6 -741
  1113. package/scripts/gds/turn-end-sound.js +5 -72
  1114. package/scripts/gds/tweak-halt.js +5 -68
  1115. package/scripts/gds/tweak-renders.js +5 -198
  1116. package/scripts/gds/uat.js +6 -119
  1117. package/scripts/gds/ui-kit-transform.js +5 -41
  1118. package/scripts/gds/update-channel.js +5 -510
  1119. package/scripts/gds/update-sweep.js +5 -827
  1120. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1121. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1122. package/scripts/gds/upgrade-migrate.js +5 -223
  1123. package/scripts/gds/upgrade-operator.js +6 -73
  1124. package/scripts/gds/upgrade-outcome.js +5 -173
  1125. package/scripts/gds/upgrade.js +5 -1497
  1126. package/scripts/gds/validate-design.js +5 -10
  1127. package/scripts/gds/version-close.js +6 -620
  1128. package/scripts/gds/version-literal-guard.js +5 -138
  1129. package/scripts/gds/version-select.js +5 -77
  1130. package/scripts/gds/visual-review-nudge.js +5 -38
  1131. package/scripts/gds/wedge-remedy.js +5 -173
  1132. package/scripts/gds/worktree-claim-guard.js +5 -129
  1133. package/scripts/gds/worktree.js +6 -448
  1134. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1135. package/scripts/hall-preview/server.js +2 -2
  1136. package/scripts/migrate.sh +3 -3
  1137. package/scripts/public-mirror-export.js +3 -3
  1138. package/scripts/setup-builder.js +7 -7
  1139. package/src/bongos/api-errors.js +1 -0
  1140. package/src/bongos/api-prefix.js +1 -1
  1141. package/src/bongos/auth-github.js +19 -3
  1142. package/src/bongos/auth-idp.js +7 -0
  1143. package/src/bongos/claim-attribution.js +2 -2
  1144. package/src/bongos/core-moves.js +1 -1
  1145. package/src/bongos/core-update.js +3 -3
  1146. package/src/bongos/craft-mode.js +2 -2
  1147. package/src/bongos/db-kernel.js +15 -3
  1148. package/src/bongos/db.js +30 -4
  1149. package/src/bongos/github-repos.js +1 -1
  1150. package/src/bongos/llm-cache.js +1 -1
  1151. package/src/bongos/llm-pricing.js +1 -1
  1152. package/src/bongos/metrics.js +1 -1
  1153. package/src/bongos/middleware/rate-limit.js +2 -2
  1154. package/src/bongos/module-listing.js +93 -1
  1155. package/src/bongos/module-scope-map.js +90 -85
  1156. package/src/bongos/module-store.js +1 -1
  1157. package/src/bongos/module-submissions.js +1 -1
  1158. package/src/bongos/optimizer.js +1 -1
  1159. package/src/bongos/package-registry.js +1 -1
  1160. package/src/bongos/path-match.js +1 -1
  1161. package/src/bongos/permission-path-check.js +3 -3
  1162. package/src/bongos/platform-visibility-gate.js +3 -5
  1163. package/src/bongos/prelaunch-gate.js +7 -6
  1164. package/src/bongos/route-rank-check.js +2 -2
  1165. package/src/bongos/routes/auth.js +15 -2
  1166. package/src/bongos/routes/backup.js +1 -1
  1167. package/src/bongos/routes/builders.js +29 -1
  1168. package/src/bongos/routes/me.js +49 -18
  1169. package/src/bongos/routes/modules.js +29 -9
  1170. package/src/bongos/routes/public.js +3 -72
  1171. package/src/bongos/schema-lag.js +1 -1
  1172. package/src/bongos/sensitive-surfaces.js +1 -1
  1173. package/src/bongos/serve-internal.js +65 -16
  1174. package/src/bongos/software-update.js +2 -2
  1175. package/src/bongos/upgrade-hold.js +3 -3
  1176. package/src/hall-look.js +6 -5
  1177. package/src/module-api.js +3 -3
  1178. package/src/module-loader/catalog.js +1 -1
  1179. package/src/module-loader/error-tally.js +3 -3
  1180. package/src/module-loader/manifest-schema.js +3 -3
  1181. package/src/platform-server.js +10 -0
  1182. package/src/role-responsibilities.js +1 -1
  1183. package/src/stale-timer.js +2 -2
  1184. package/tests/accessibility_replay.mjs +1 -1
  1185. package/tests/activity_rollup_order_db.mjs +1 -1
  1186. package/tests/activity_snapshots_db.mjs +1 -1
  1187. package/tests/adopt_detect.mjs +1 -1
  1188. package/tests/adopt_import.mjs +1 -1
  1189. package/tests/adopt_preflight.mjs +1 -1
  1190. package/tests/adr_0089_scope.mjs +10 -7
  1191. package/tests/adr_0162_citation.mjs +1 -1
  1192. package/tests/adr_0162_gate_citation.mjs +1 -1
  1193. package/tests/agent_invoke.mjs +1 -1
  1194. package/tests/agent_invoke_live.mjs +3 -3
  1195. package/tests/agents_cron_trigger.mjs +2 -2
  1196. package/tests/agents_roster.mjs +1 -1
  1197. package/tests/agents_sync.mjs +4 -4
  1198. package/tests/allow_rule_guard.mjs +20 -20
  1199. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1200. package/tests/api_alias_exceptions.mjs +7 -6
  1201. package/tests/api_artifacts.mjs +214 -0
  1202. package/tests/api_cli_flags.mjs +3 -3
  1203. package/tests/api_client.mjs +56 -54
  1204. package/tests/api_docs.mjs +30 -9
  1205. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1206. package/tests/api_msys_path_repair.mjs +2 -2
  1207. package/tests/architect.mjs +1 -1
  1208. package/tests/art_stage.mjs +2 -2
  1209. package/tests/artifact_audit.mjs +2 -2
  1210. package/tests/artifact_staleness.mjs +9 -9
  1211. package/tests/atlas.mjs +1 -1
  1212. package/tests/audit_deps.mjs +1 -1
  1213. package/tests/audit_gate.mjs +1 -1
  1214. package/tests/auth_flow_slice1.mjs +3 -3
  1215. package/tests/auth_inactive_builder.mjs +43 -5
  1216. package/tests/auth_session_expiry_db.mjs +16 -4
  1217. package/tests/auth_session_ttl.mjs +23 -0
  1218. package/tests/authorship_audit.mjs +2 -2
  1219. package/tests/autobongos_cadence.mjs +1 -1
  1220. package/tests/autobongos_fence.mjs +1 -1
  1221. package/tests/autobongos_grade_cap.mjs +2 -2
  1222. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1223. package/tests/autobongos_host_access.mjs +3 -3
  1224. package/tests/autobongos_loop.mjs +17 -17
  1225. package/tests/autobongos_service_ps1.mjs +3 -3
  1226. package/tests/autobongos_tweak_lane.mjs +2 -2
  1227. package/tests/autobongos_verify.mjs +2 -2
  1228. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1229. package/tests/autonomy_config_idle.mjs +1 -1
  1230. package/tests/autonomy_digest.mjs +1 -1
  1231. package/tests/autonomy_gate.mjs +1 -1
  1232. package/tests/autonomy_gauge.mjs +2 -2
  1233. package/tests/autonomy_runner_identity.mjs +1 -1
  1234. package/tests/backfill_sessions.mjs +8 -8
  1235. package/tests/backfill_subagent_rewards.mjs +1 -1
  1236. package/tests/backfill_task_rewards.mjs +2 -2
  1237. package/tests/backlog_review.mjs +3 -3
  1238. package/tests/baseline_staleness.mjs +2 -2
  1239. package/tests/bfg.mjs +11 -5
  1240. package/tests/bfg_write.mjs +20 -11
  1241. package/tests/blockers_hall.mjs +17 -5
  1242. package/tests/blockers_page_ui.mjs +56 -12
  1243. package/tests/bongos_dispatch.mjs +5 -5
  1244. package/tests/bongos_login.mjs +2 -2
  1245. package/tests/bug_attachment_audit.mjs +1 -1
  1246. package/tests/bug_attachment_recover.mjs +2 -2
  1247. package/tests/bug_triage.mjs +3 -3
  1248. package/tests/build_info.mjs +1 -1
  1249. package/tests/builder_tester_tag.mjs +184 -0
  1250. package/tests/bump_version.mjs +3 -3
  1251. package/tests/canonical_profile_url.mjs +1 -1
  1252. package/tests/capture_error_format.mjs +1 -1
  1253. package/tests/capture_goal_routing.mjs +2 -2
  1254. package/tests/category_advisory_guard.mjs +3 -3
  1255. package/tests/claim_error_surface.mjs +2 -2
  1256. package/tests/claim_from_task_and_home.mjs +1 -1
  1257. package/tests/claim_gate_open_blocker.mjs +7 -4
  1258. package/tests/claim_gate_rebase.mjs +12 -8
  1259. package/tests/claim_recall.mjs +4 -4
  1260. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1261. package/tests/claude_materialize.mjs +58 -58
  1262. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1263. package/tests/cli_allowlist_permissions.mjs +11 -11
  1264. package/tests/cli_dispatcher.mjs +2 -2
  1265. package/tests/cli_err_code.mjs +6 -6
  1266. package/tests/cli_exit_no_abort.mjs +7 -7
  1267. package/tests/cli_lib_formatters.mjs +2 -2
  1268. package/tests/cli_sessions.mjs +5 -5
  1269. package/tests/cli_surface.mjs +15 -15
  1270. package/tests/cli_token_reissue.mjs +2 -2
  1271. package/tests/client_baseurl_guard.mjs +1 -1
  1272. package/tests/client_bundle_route.mjs +35 -4
  1273. package/tests/cloud_bongos_pack.mjs +1 -1
  1274. package/tests/community_leaderboard_db.mjs +1 -1
  1275. package/tests/conductor.mjs +18 -18
  1276. package/tests/conflict_resolve.mjs +14 -16
  1277. package/tests/consumer_layout_boot.mjs +12 -12
  1278. package/tests/context_pack.mjs +6 -6
  1279. package/tests/control_manifest.mjs +4 -4
  1280. package/tests/copy_desk_page_reads.mjs +1 -1
  1281. package/tests/copy_desk_page_release.mjs +192 -0
  1282. package/tests/copy_inventory.mjs +2 -2
  1283. package/tests/core_auto_upgrade.mjs +1 -1
  1284. package/tests/core_move_notice.mjs +2 -2
  1285. package/tests/core_origin_follow.mjs +7 -7
  1286. package/tests/core_pin_sync.mjs +3 -3
  1287. package/tests/core_upgrade_door.mjs +2 -2
  1288. package/tests/core_upgrade_owner_door.mjs +34 -1
  1289. package/tests/core_upgrade_runner.mjs +19 -19
  1290. package/tests/credential_presence.mjs +2 -2
  1291. package/tests/credit_grant.mjs +3 -3
  1292. package/tests/credit_log_single_writer.mjs +5 -5
  1293. package/tests/criterion_ref_status.mjs +2 -2
  1294. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1295. package/tests/cutover_codemod.mjs +2 -4
  1296. package/tests/db_backup_nightly.mjs +1 -1
  1297. package/tests/db_backup_offsite.mjs +1 -1
  1298. package/tests/db_ownership_handover.mjs +2 -2
  1299. package/tests/dead_deps.mjs +3 -3
  1300. package/tests/dependency_advisory.mjs +1 -1
  1301. package/tests/deploy_audit_gate.mjs +4 -4
  1302. package/tests/deploy_divergence_line.mjs +36 -16
  1303. package/tests/deploy_page_projects.mjs +35 -4
  1304. package/tests/dev_lib.mjs +2 -2
  1305. package/tests/dev_windows.mjs +2 -2
  1306. package/tests/diagram_facts_offset.mjs +1 -1
  1307. package/tests/diagram_repo_slug.mjs +1 -1
  1308. package/tests/diff_derived_signals.mjs +2 -2
  1309. package/tests/dns_preflight.mjs +2 -2
  1310. package/tests/do_api.mjs +3 -3
  1311. package/tests/doc_cli_guard.mjs +28 -28
  1312. package/tests/doc_comment_coverage.mjs +1 -1
  1313. package/tests/doc_control_claims.mjs +11 -11
  1314. package/tests/docs_entropy.mjs +2 -2
  1315. package/tests/docs_openapi_route.mjs +8 -6
  1316. package/tests/doctor_hooks.mjs +1 -1
  1317. package/tests/edit_hints.mjs +3 -2
  1318. package/tests/effective_visibility_predicate.mjs +3 -3
  1319. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1320. package/tests/exec_path_guard.mjs +4 -4
  1321. package/tests/executed_closure.mjs +18 -12
  1322. package/tests/file_map.mjs +1 -1
  1323. package/tests/find_untested.mjs +13 -13
  1324. package/tests/first_admin_bootstrap.mjs +1 -1
  1325. package/tests/fitness.mjs +16 -16
  1326. package/tests/fitness_gds_ratchet.mjs +2 -2
  1327. package/tests/fitness_installed_core.mjs +3 -3
  1328. package/tests/fitness_no_raw_nul.mjs +1 -1
  1329. package/tests/fitness_ratchets.mjs +3 -3
  1330. package/tests/fitness_scope_roster.mjs +2 -2
  1331. package/tests/fitness_two_root.mjs +8 -8
  1332. package/tests/fixtures/accessibility-replay.json +5 -5
  1333. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1334. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1335. package/tests/fixtures/page-ledger.mjs +22 -0
  1336. package/tests/fixtures/session-506-digest.json +5 -5
  1337. package/tests/gate_approvals.mjs +50 -0
  1338. package/tests/gate_review.mjs +8 -8
  1339. package/tests/gating_review_retired.mjs +2 -2
  1340. package/tests/gen_freshness.mjs +3 -3
  1341. package/tests/git_guard.mjs +3 -3
  1342. package/tests/git_merge_regen.mjs +41 -65
  1343. package/tests/github_one_trip.mjs +4 -4
  1344. package/tests/github_pick_up.mjs +2 -2
  1345. package/tests/github_push_merge_driver.mjs +1 -1
  1346. package/tests/go_live.mjs +3 -2
  1347. package/tests/goal_category.mjs +1 -1
  1348. package/tests/goal_cli.mjs +2 -2
  1349. package/tests/goal_create_spec_entry.mjs +1 -1
  1350. package/tests/goal_invite_consent.mjs +3 -1
  1351. package/tests/goal_move.mjs +1 -1
  1352. package/tests/goal_names.mjs +2 -2
  1353. package/tests/goal_working_area.mjs +1 -1
  1354. package/tests/government_agent_asks.mjs +7 -7
  1355. package/tests/government_board_room_copy.mjs +6 -1
  1356. package/tests/government_board_view.mjs +39 -0
  1357. package/tests/government_board_vote_ui.mjs +39 -1
  1358. package/tests/government_config.mjs +2 -2
  1359. package/tests/government_live_proof_shape.mjs +1 -1
  1360. package/tests/government_protected_surfaces.mjs +54 -53
  1361. package/tests/government_require_permission.mjs +9 -1
  1362. package/tests/government_vanilla_boot.mjs +1 -1
  1363. package/tests/government_vocabulary.mjs +2 -2
  1364. package/tests/government_walk.mjs +2 -2
  1365. package/tests/grade_body_limit.mjs +6 -4
  1366. package/tests/grade_correlation_audit.mjs +3 -3
  1367. package/tests/grade_diff_hash.mjs +1 -1
  1368. package/tests/grade_engine_replay.mjs +2 -2
  1369. package/tests/grade_server_authoritative.mjs +1 -1
  1370. package/tests/grade_unavailable_display.mjs +1 -1
  1371. package/tests/grader.mjs +8 -24
  1372. package/tests/grader_generated_provenance.mjs +14 -14
  1373. package/tests/grader_no_artifact.mjs +1 -1
  1374. package/tests/grader_prompt_fencing.mjs +1 -1
  1375. package/tests/grader_quality_window_overflow.mjs +1 -1
  1376. package/tests/grader_reader_lens.mjs +3 -3
  1377. package/tests/grader_regrade_delta.mjs +1 -1
  1378. package/tests/grader_unbacked_score.mjs +2 -2
  1379. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1380. package/tests/hall_asset_cache.mjs +127 -0
  1381. package/tests/hall_audit.mjs +63 -0
  1382. package/tests/hall_board_world.mjs +20 -0
  1383. package/tests/hall_city_card_words.mjs +61 -0
  1384. package/tests/hall_client_request_shape.mjs +5 -1
  1385. package/tests/hall_home_ships_bounded.mjs +160 -0
  1386. package/tests/hall_landing_boot.mjs +15 -2
  1387. package/tests/hall_nav.mjs +33 -0
  1388. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1389. package/tests/hall_oversight_world.mjs +44 -4
  1390. package/tests/hall_palette.mjs +12 -9
  1391. package/tests/hall_preview_security.mjs +1 -1
  1392. package/tests/hall_profile_world.mjs +17 -0
  1393. package/tests/hall_reading_world.mjs +16 -1
  1394. package/tests/hall_roster_world.mjs +2 -1
  1395. package/tests/hall_studio_world.mjs +4 -1
  1396. package/tests/hall_work_history_id.mjs +39 -0
  1397. package/tests/held_tweak_reporting.mjs +4 -4
  1398. package/tests/helpers.mjs +3 -3
  1399. package/tests/home_attention_cards.mjs +2 -0
  1400. package/tests/home_bounded_reads.mjs +1 -1
  1401. package/tests/home_isolation_guard.mjs +1 -1
  1402. package/tests/hook_core_resolve.mjs +7 -7
  1403. package/tests/hook_user_agents.mjs +1 -1
  1404. package/tests/hooks_drain.mjs +2 -2
  1405. package/tests/host_topology_skips.mjs +1 -1
  1406. package/tests/howto_guide.mjs +1 -1
  1407. package/tests/howto_moments.mjs +3 -3
  1408. package/tests/hub_account_page.mjs +1 -1
  1409. package/tests/idea_capture_grades.mjs +2 -2
  1410. package/tests/idea_develop_spark.mjs +1 -1
  1411. package/tests/idea_filed_via.mjs +2 -2
  1412. package/tests/idea_ideate_full.mjs +1 -1
  1413. package/tests/idea_spark_mark.mjs +1 -1
  1414. package/tests/idea_spark_queue.mjs +1 -1
  1415. package/tests/idea_triage.mjs +1 -1
  1416. package/tests/idea_triage_grade.mjs +3 -3
  1417. package/tests/idea_vote_permission.mjs +113 -0
  1418. package/tests/idea_votes_fold_db.mjs +123 -0
  1419. package/tests/infra_exec_paths.mjs +12 -12
  1420. package/tests/init.mjs +2 -2
  1421. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1422. package/tests/instance_feedback.mjs +9 -9
  1423. package/tests/instance_mismatch_guard.mjs +2 -2
  1424. package/tests/integration_parked_ratchet.mjs +24 -2
  1425. package/tests/intent_retry.mjs +1 -1
  1426. package/tests/interaction_posture.mjs +3 -3
  1427. package/tests/invite_expiry_db.mjs +1 -1
  1428. package/tests/joinability_invite_only.mjs +1 -1
  1429. package/tests/karma_vote_lists.mjs +270 -0
  1430. package/tests/key-card.mjs +2 -2
  1431. package/tests/key-status.mjs +2 -2
  1432. package/tests/knip_ratchet_ambient.mjs +2 -2
  1433. package/tests/known_failing_ratchet.mjs +1 -1
  1434. package/tests/land_watch.mjs +2 -2
  1435. package/tests/landing_legal_pages.mjs +1 -1
  1436. package/tests/landing_page.mjs +2 -2
  1437. package/tests/leaderboard_roles.mjs +4 -1
  1438. package/tests/leak_scan_allowlist.mjs +8 -8
  1439. package/tests/leak_scan_fail_closed.mjs +1 -1
  1440. package/tests/lib_sh_resolution.mjs +9 -9
  1441. package/tests/lifecycle-card.mjs +7 -7
  1442. package/tests/linkify_check.mjs +2 -2
  1443. package/tests/linkify_refs.mjs +1 -1
  1444. package/tests/llm-cache-route.mjs +1 -1
  1445. package/tests/local_preview.mjs +2 -2
  1446. package/tests/main_audit.mjs +3 -3
  1447. package/tests/main_audit_attestation.mjs +1 -1
  1448. package/tests/main_audit_db_roster.mjs +2 -2
  1449. package/tests/main_worktree_busy_reason.mjs +3 -3
  1450. package/tests/markdown_line_endings.mjs +2 -2
  1451. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1452. package/tests/membership_kind_lockstep.mjs +1 -1
  1453. package/tests/memory_isolation.mjs +16 -8
  1454. package/tests/memory_map.mjs +2 -2
  1455. package/tests/memory_pull.mjs +33 -25
  1456. package/tests/merge_driver_register.mjs +3 -3
  1457. package/tests/migration_allocation.mjs +2 -2
  1458. package/tests/migration_namespace.mjs +1 -1
  1459. package/tests/migrations_forward_safe.mjs +1 -1
  1460. package/tests/mingle.mjs +1 -1
  1461. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1462. package/tests/mirror_lineage_proof.mjs +2 -2
  1463. package/tests/mirror_redact.mjs +4 -4
  1464. package/tests/missing_dep_classify.mjs +3 -3
  1465. package/tests/module-scope-map.mjs +22 -22
  1466. package/tests/module_api_lazy.mjs +1 -1
  1467. package/tests/module_assess_docs.mjs +2 -2
  1468. package/tests/module_assess_installs.mjs +3 -3
  1469. package/tests/module_assess_price_parity.mjs +5 -5
  1470. package/tests/module_assess_score.mjs +5 -5
  1471. package/tests/module_assess_security.mjs +4 -4
  1472. package/tests/module_assess_tests.mjs +3 -3
  1473. package/tests/module_assessments_migration.mjs +1 -1
  1474. package/tests/module_catalog.mjs +2 -2
  1475. package/tests/module_cli.mjs +3 -3
  1476. package/tests/module_entitlements.mjs +1 -1
  1477. package/tests/module_error_counts.mjs +1 -1
  1478. package/tests/module_install.mjs +4 -4
  1479. package/tests/module_loader.mjs +3 -1
  1480. package/tests/module_owned_tests.mjs +1 -1
  1481. package/tests/module_release_channels.mjs +1 -1
  1482. package/tests/module_store_howto.mjs +3 -3
  1483. package/tests/module_store_listing.mjs +139 -2
  1484. package/tests/module_store_publish.mjs +4 -4
  1485. package/tests/module_store_publish_route.mjs +1 -1
  1486. package/tests/module_store_reassess.mjs +1 -1
  1487. package/tests/module_store_registry_migration.mjs +1 -1
  1488. package/tests/module_test_runner.mjs +3 -3
  1489. package/tests/module_update.mjs +4 -4
  1490. package/tests/module_upgrade_updates.mjs +1 -1
  1491. package/tests/move_escalation.mjs +2 -2
  1492. package/tests/nav_permission_atoms.mjs +3 -2
  1493. package/tests/needs_rebase.mjs +7 -3
  1494. package/tests/newcomer_floor.mjs +1 -1
  1495. package/tests/newcomer_generator.mjs +48 -0
  1496. package/tests/next_number.mjs +1 -1
  1497. package/tests/no_artifact_escalation.mjs +3 -3
  1498. package/tests/npm_release_where.mjs +1 -1
  1499. package/tests/oauth_secret.mjs +2 -2
  1500. package/tests/onboard.mjs +6 -6
  1501. package/tests/onboarding_gate.mjs +2 -2
  1502. package/tests/opt_in_skill_modules.mjs +3 -3
  1503. package/tests/own_scope_guard.mjs +1 -1
  1504. package/tests/own_session_revoke.mjs +4 -1
  1505. package/tests/package_core.mjs +10 -11
  1506. package/tests/page_inventory.mjs +5 -5
  1507. package/tests/page_reader.mjs +7 -7
  1508. package/tests/page_tweak_hold.mjs +6 -6
  1509. package/tests/parallel-load.mjs +1 -1
  1510. package/tests/paste_token_api_base.mjs +1 -1
  1511. package/tests/paste_token_session_store.mjs +2 -2
  1512. package/tests/pending_invite_purge_db.mjs +1 -1
  1513. package/tests/permission_path.mjs +1 -1
  1514. package/tests/pin_replay.mjs +1 -1
  1515. package/tests/pin_write_key.mjs +7 -7
  1516. package/tests/plain_cards.mjs +15 -15
  1517. package/tests/pr_assign.mjs +1 -1
  1518. package/tests/pre_push_hook.mjs +3 -3
  1519. package/tests/preflight_checks.mjs +2 -2
  1520. package/tests/prelaunch_gate.mjs +1 -1
  1521. package/tests/privacy_matrix.mjs +1 -1
  1522. package/tests/probe_cache.mjs +6 -6
  1523. package/tests/profile_connections_ui.mjs +4 -3
  1524. package/tests/profile_fields.mjs +11 -1
  1525. package/tests/profile_privacy_owner_view.mjs +1 -1
  1526. package/tests/profile_role_headline.mjs +10 -9
  1527. package/tests/project_admin_console_model.mjs +1 -1
  1528. package/tests/projects_hub.mjs +1 -1
  1529. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1530. package/tests/promote_goal_id.mjs +6 -6
  1531. package/tests/promotion_sweep.mjs +1 -1
  1532. package/tests/provision.mjs +24 -24
  1533. package/tests/provision_account_identity.mjs +2 -2
  1534. package/tests/provision_byo_host.mjs +1 -1
  1535. package/tests/provision_caddy_wiring.mjs +2 -2
  1536. package/tests/provision_disconnect.mjs +2 -2
  1537. package/tests/provision_dns_first.mjs +1 -1
  1538. package/tests/provision_render.mjs +9 -9
  1539. package/tests/provision_repo_private.mjs +3 -3
  1540. package/tests/provision_resource_caps.mjs +5 -5
  1541. package/tests/provision_restart.mjs +3 -3
  1542. package/tests/provision_settings_apply.mjs +7 -7
  1543. package/tests/provision_teardown_address.mjs +2 -2
  1544. package/tests/provisioning_capacity.mjs +5 -5
  1545. package/tests/provisioning_credential_preflight.mjs +1 -1
  1546. package/tests/provisioning_disconnect.mjs +1 -1
  1547. package/tests/provisioning_error_note_scope.mjs +4 -4
  1548. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1549. package/tests/provisioning_planet_physics.mjs +16 -0
  1550. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1551. package/tests/provisioning_settings_env.mjs +1 -1
  1552. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1553. package/tests/public_mirror_export.mjs +1 -1
  1554. package/tests/publish_integration_gate.mjs +2 -2
  1555. package/tests/publish_manifest.mjs +6 -6
  1556. package/tests/publish_watch.mjs +1 -1
  1557. package/tests/push_path_brief.mjs +2 -2
  1558. package/tests/raise.mjs +248 -0
  1559. package/tests/rank_roles_audit.mjs +1 -1
  1560. package/tests/rank_tier_single_source.mjs +2 -2
  1561. package/tests/rate_limit_public.mjs +1 -1
  1562. package/tests/read_default_meter.mjs +2 -2
  1563. package/tests/read_session_export.mjs +1 -1
  1564. package/tests/rebase_gate_set_aside.mjs +1 -1
  1565. package/tests/recall_cli.mjs +1 -1
  1566. package/tests/recall_corpus_health.mjs +3 -2
  1567. package/tests/recall_hints.mjs +1 -1
  1568. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1569. package/tests/redteam_patrol.mjs +2 -2
  1570. package/tests/regrade_actual_minutes.mjs +2 -2
  1571. package/tests/regrade_eligibility.mjs +2 -2
  1572. package/tests/release_core.mjs +2 -2
  1573. package/tests/release_notes.mjs +4 -4
  1574. package/tests/rename_history_restraint.mjs +3 -3
  1575. package/tests/rename_ledger_prose.mjs +6 -6
  1576. package/tests/render_api.mjs +1 -1
  1577. package/tests/render_check.mjs +4 -4
  1578. package/tests/render_deploy.mjs +1 -1
  1579. package/tests/repo_info_binding.mjs +1 -1
  1580. package/tests/repo_map.mjs +5 -5
  1581. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1582. package/tests/reward_mode_surfacing.mjs +1 -1
  1583. package/tests/role_responsibilities.mjs +1 -1
  1584. package/tests/rot_inbox.mjs +10 -7
  1585. package/tests/route_permission_check.mjs +1 -1
  1586. package/tests/route_shadow_guard.mjs +1 -1
  1587. package/tests/route_validation.mjs +1 -1
  1588. package/tests/routine_capture_kind.mjs +6 -6
  1589. package/tests/routine_schedule.mjs +9 -9
  1590. package/tests/run_routine.mjs +5 -5
  1591. package/tests/run_routine_two_root.mjs +5 -5
  1592. package/tests/runner_drift.mjs +17 -17
  1593. package/tests/sandbox_stage.mjs +5 -5
  1594. package/tests/scope_map_guard.mjs +7 -7
  1595. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1596. package/tests/scripts_gds_forwarders.mjs +224 -0
  1597. package/tests/scrubber_corpus.mjs +2 -2
  1598. package/tests/seam_wiring_guard.mjs +1 -1
  1599. package/tests/search_ingest.mjs +2 -2
  1600. package/tests/search_ingest_db.mjs +1 -1
  1601. package/tests/search_ingest_nul.mjs +6 -6
  1602. package/tests/seed_verify_criteria.mjs +3 -3
  1603. package/tests/sequence.mjs +3 -3
  1604. package/tests/served_paths_shipped.mjs +3 -3
  1605. package/tests/session_506_regression.mjs +1 -1
  1606. package/tests/session_accessibility.mjs +1 -1
  1607. package/tests/session_caps.mjs +1 -1
  1608. package/tests/session_cost.mjs +1 -1
  1609. package/tests/session_digest.mjs +2 -2
  1610. package/tests/session_eval.mjs +6 -6
  1611. package/tests/session_index.mjs +1 -1
  1612. package/tests/session_records.mjs +4 -4
  1613. package/tests/session_rename_fallback.mjs +2 -2
  1614. package/tests/session_reward_on_land.mjs +7 -149
  1615. package/tests/session_reward_on_land_db.mjs +191 -0
  1616. package/tests/session_reward_reconcile.mjs +6 -88
  1617. package/tests/session_reward_reconcile_db.mjs +132 -0
  1618. package/tests/session_transcript.mjs +1 -1
  1619. package/tests/sessions_kit_pager.mjs +2 -1
  1620. package/tests/setup_device_flow_fallback.mjs +2 -2
  1621. package/tests/setup_smoke.mjs +12 -5
  1622. package/tests/setup_status_facts.mjs +54 -12
  1623. package/tests/ship_autolinkify.mjs +2 -2
  1624. package/tests/ship_automerge_injection.mjs +1 -1
  1625. package/tests/ship_base_flag.mjs +1 -1
  1626. package/tests/ship_broadcast_routing.mjs +1 -1
  1627. package/tests/ship_broadcast_server.mjs +2 -2
  1628. package/tests/ship_builder_model.mjs +1 -1
  1629. package/tests/ship_cannot_lie.mjs +9 -9
  1630. package/tests/ship_card.mjs +2 -2
  1631. package/tests/ship_ci_deploy.mjs +7 -7
  1632. package/tests/ship_error_shape.mjs +1 -1
  1633. package/tests/ship_land_ci_not_started.mjs +3 -3
  1634. package/tests/ship_land_conflict.mjs +3 -3
  1635. package/tests/ship_land_proof.mjs +3 -3
  1636. package/tests/ship_land_red_pr.mjs +5 -5
  1637. package/tests/ship_merge_gate.mjs +14 -14
  1638. package/tests/ship_mode.mjs +1 -1
  1639. package/tests/ship_mode_first_ship.mjs +4 -4
  1640. package/tests/ship_mode_hands_off.mjs +8 -8
  1641. package/tests/ship_post_land_verify.mjs +1 -1
  1642. package/tests/ship_preflight.mjs +19 -19
  1643. package/tests/ship_premerge.mjs +1 -1
  1644. package/tests/ship_publish_error.mjs +2 -2
  1645. package/tests/ship_push_diagnosis.mjs +1 -1
  1646. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1647. package/tests/ship_resume.mjs +4 -4
  1648. package/tests/ship_smoke_gate.mjs +1 -1
  1649. package/tests/ship_upload_skip.mjs +1 -1
  1650. package/tests/ship_upstream_deletion.mjs +1 -1
  1651. package/tests/ship_vendored_instance.mjs +8 -8
  1652. package/tests/ship_visual_regrade.mjs +3 -3
  1653. package/tests/ship_zero_commit.mjs +1 -1
  1654. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1655. package/tests/skill_friction_kind.mjs +1 -1
  1656. package/tests/skill_grade_recover.mjs +1 -1
  1657. package/tests/skill_grader_health.mjs +1 -1
  1658. package/tests/skill_lint.mjs +1 -1
  1659. package/tests/skill_menu_ruling.mjs +1 -1
  1660. package/tests/skill_preflight.mjs +7 -7
  1661. package/tests/skip_is_not_pass.mjs +22 -1
  1662. package/tests/smoke_dependencies_witness.mjs +2 -2
  1663. package/tests/smoke_preflight.mjs +1 -1
  1664. package/tests/smoke_target.mjs +2 -2
  1665. package/tests/smoke_write_contract.mjs +2 -2
  1666. package/tests/sound_player.mjs +8 -8
  1667. package/tests/source_text_test_ratchet.mjs +97 -0
  1668. package/tests/speciality_corpus_scope.mjs +1 -1
  1669. package/tests/speciality_session_skills.mjs +1 -1
  1670. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1671. package/tests/stale_timer.mjs +3 -3
  1672. package/tests/stale_worktrees.mjs +1 -1
  1673. package/tests/start_env_guard.mjs +1 -1
  1674. package/tests/start_goal_first.mjs +3 -3
  1675. package/tests/start_inbox_count.mjs +1 -1
  1676. package/tests/start_rebase_warning.mjs +1 -1
  1677. package/tests/status_default_version.mjs +3 -3
  1678. package/tests/status_mirror_sync.mjs +1 -1
  1679. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1680. package/tests/stop_refcheck.mjs +1 -1
  1681. package/tests/strand_watch.mjs +1 -1
  1682. package/tests/stranded_rows.mjs +1 -1
  1683. package/tests/stuck_detector.mjs +14 -14
  1684. package/tests/sweep_app_account.mjs +3 -3
  1685. package/tests/task_cli.mjs +2 -2
  1686. package/tests/task_detail_ui.mjs +11 -1
  1687. package/tests/task_discipline_required.mjs +2 -2
  1688. package/tests/task_list_paging.mjs +1 -1
  1689. package/tests/task_visual_slots.mjs +2 -2
  1690. package/tests/terms_acceptance.mjs +1 -1
  1691. package/tests/terms_grandfather_db.mjs +1 -1
  1692. package/tests/test_path_guard.mjs +1 -1
  1693. package/tests/triage_development.mjs +1 -1
  1694. package/tests/tweak_batch_apply.mjs +2 -2
  1695. package/tests/tweak_land_heal.mjs +3 -3
  1696. package/tests/tweak_unattended.mjs +3 -3
  1697. package/tests/ui_design_skills.mjs +2 -2
  1698. package/tests/unit_report_status.mjs +2 -2
  1699. package/tests/unit_runner_serial.mjs +2 -2
  1700. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1701. package/tests/update_channel.mjs +2 -2
  1702. package/tests/update_channel_db.mjs +4 -4
  1703. package/tests/update_subscription_engine.mjs +26 -26
  1704. package/tests/update_sweep_home.mjs +14 -14
  1705. package/tests/upgrade.mjs +11 -11
  1706. package/tests/upgrade_artist_gate.mjs +4 -4
  1707. package/tests/upgrade_commit_identity.mjs +2 -2
  1708. package/tests/upgrade_migrate.mjs +7 -7
  1709. package/tests/upgrade_operator.mjs +2 -2
  1710. package/tests/upgrade_outcome.mjs +2 -2
  1711. package/tests/upgrade_persist_pin.mjs +5 -5
  1712. package/tests/upkeep_home.mjs +1 -1
  1713. package/tests/version_close.mjs +2 -2
  1714. package/tests/version_close_cli.mjs +2 -2
  1715. package/tests/version_close_route.mjs +1 -1
  1716. package/tests/version_literals.mjs +23 -23
  1717. package/tests/visual_review.mjs +5 -5
  1718. package/tests/wedge_remedy.mjs +5 -5
  1719. package/tests/welcome_boot.mjs +116 -0
  1720. package/tests/welcome_boot_browser.mjs +271 -0
  1721. package/tests/wizard_born_first_board.mjs +3 -3
  1722. package/tests/wizard_demo.mjs +1 -1
  1723. package/tests/wizard_one_page.mjs +4 -3
  1724. package/tests/wizard_physics.mjs +3 -1
  1725. package/tests/wizard_physics_more.mjs +42 -3
  1726. package/tests/work_title_wrap.mjs +1 -1
  1727. package/tests/workflow_exec_paths.mjs +6 -6
  1728. package/tests/worktree_claim_guard.mjs +1 -1
  1729. package/tests/worktree_helper.mjs +2 -2
  1730. package/tests/write_validation_gaps.mjs +3 -3
  1731. package/scripts/gds/api.sh +0 -6
  1732. package/scripts/gds/audit-exports.js +0 -128
  1733. package/scripts/gds/resolve-skill-model.js +0 -57
  1734. package/scripts/gds/security-baseline-check.sh +0 -180
  1735. package/scripts/gds/spike-task-map.js +0 -899
  1736. package/scripts/status-probe.mjs +0 -213
  1737. package/src/bongos/uptime-poller.js +0 -93
  1738. package/tests/government_fold_bench.mjs +0 -50
  1739. package/tests/spike_task_map.mjs +0 -422
  1740. package/tests/status-probe.mjs +0 -89
  1741. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1742. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1743. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1744. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -1,1090 +1,7 @@
1
1
  #!/usr/bin/env node
2
- // Builder start — what can I claim right now?
3
- //
4
- // Usage:
5
- // node scripts/gds/start.js [--version V1|PMS-V1] [--discipline engineer|artist|ideator|unclassified] [--all-disciplines] [--fit autonomous|parallel] [--limit N] [--full] [--widget] [--json]
6
- //
7
- // --fit narrows the claimable list to what the autonomous overnight
8
- // session-runner (#358) may pick up:
9
- // autonomous — overnight-safe + manual_degree<=2 + unblocked (canonical
10
- // tasks_session_fit 'autonomous' mode). The runner takes
11
- // claimable[0] as the next task by priority.
12
- // parallel — autonomous AND tasks.parallel_safe = true (safe to run
13
- // alongside other tasks). The runner fills its parallel slots
14
- // from the top of this list.
15
- //
16
- // Output is a deterministic "card" (task 1273): one quiet status line, the
17
- // builder's identity, their holdings, a clean claimable table (# / Version /
18
- // Type / Reward / Est. / What it is), and a next-step line — identical every session.
19
- // --widget : emit the card as self-contained HTML on stdout (private warnings
20
- // to stderr) for the app's widget renderer (show_widget). This is
21
- // the surface the /builder-start skill renders — BUT it honours the
22
- // builder's per-builder "render widgets" knob (task 1279): if that
23
- // builder has widgets off, --widget degrades to the markdown card so
24
- // no HTML is ever emitted/relayed. Default ON. The skill detects
25
- // which form it got (HTML starts with '<') and renders accordingly.
26
- // (default): the markdown form of the same card — the fallback when the
27
- // client can't draw widgets (raw terminal, cron, other tools).
28
- // --full : add the detailed ambient widgets + context pack (markdown).
29
- // --json : unchanged machine interface the autonomous runner reads.
30
- //
31
- // --discipline filters the claimable list by builder interest area
32
- // (orthogonal to kind). engineer = code/infra/gameplay/bugs; artist =
33
- // pixel art / sprites / the art pipeline; ideator = scoping/research/
34
- // docs/narrative/lore.
35
- //
36
- // DISCIPLINE ROUTING (V3.R81 / #299): by default — when no explicit
37
- // --discipline is passed — the claimable list is narrowed to the builder's
38
- // preferred_disciplines (builders.preferred_disciplines, set via
39
- // /me/disciplines per migrations 027 + 086). An artist shouldn't be shown
40
- // only engineer tasks. Two escape hatches:
41
- // --all-disciplines — ignore preferences, show every lane.
42
- // --discipline X — explicit single-lane filter (overrides preferences).
43
- // A builder with no stated preference (empty preferred_disciplines) sees
44
- // everything by default — there is no lane to narrow to.
45
- //
46
- // Below the main list, a "You might enjoy" section surfaces up to 3 claimable
47
- // tasks OUTSIDE the builder's disciplines, ranked by relevance. The ranking
48
- // mirrors 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/gds/claim.js <task-id> [--worktree NAME]');
1022
- console.log(' ship: node scripts/gds/ship.js <task-id> --notes "..." --summary "..."');
1023
- console.log(' release: node scripts/gds/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
- };
2
+ // scripts/gds/start.js — @bongos-forwarder (task 1004848). Generated by
3
+ // scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
+ // The real script is scripts/bongos/start.js. This forwarder keeps callers that still name
5
+ // the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
+ 'use strict';
7
+ require('../bongos/forwarder.js').forward(module, 'start.js');