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