@bongos/core 1.21.175 → 1.21.177

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1719) hide show
  1. package/.bongos-core.json +3371 -1636
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +15 -15
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/config/scheduled-routines.json +3 -8
  58. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  59. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +1 -1
  60. package/docs/adr/0093-tranche-2-core-carve-sequence.md +1 -1
  61. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  62. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  63. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  64. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  65. package/docs/adr/README.md +2 -0
  66. package/docs/api/openapi.json +606 -44
  67. package/docs/api-reference.md +25 -12
  68. package/docs/architecture.md +8 -7
  69. package/docs/canonical-permissions.md +4 -4
  70. package/docs/copy-inventory.md +1370 -1411
  71. package/docs/copy-registry.json +2136 -2536
  72. package/docs/design/demonolith-plan.md +6 -6
  73. package/docs/design/modular-architecture/00-research-report.md +1 -1
  74. package/docs/design/project-startup-direction.md +2 -2
  75. package/docs/design/projects-hub-direction-v2.md +1 -1
  76. package/docs/design/reviews/hall-v2/README.md +2 -2
  77. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  78. package/docs/file-map.md +92 -96
  79. package/docs/handoff-template.md +5 -5
  80. package/docs/module-api-changelog.md +7 -3
  81. package/docs/modules-contract.md +8 -7
  82. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  83. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  84. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  85. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  86. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  87. package/docs/onboarding/diagrams/README.md +5 -9
  88. package/docs/onboarding/diagrams/assertions.json +3 -3
  89. package/docs/onboarding/slash-commands.md +2 -2
  90. package/docs/packs/artist.md +4 -4
  91. package/docs/packs/engineer.md +11 -10
  92. package/docs/packs/ideator.md +7 -7
  93. package/docs/page-inventory.json +20 -1
  94. package/docs/page-readings.json +4387 -4603
  95. package/docs/recipes/README.md +1 -1
  96. package/docs/recipes/audit-replay.md +4 -4
  97. package/docs/recipes/autobongos-windows-host.md +6 -6
  98. package/docs/recipes/bongos-cli-release.md +2 -2
  99. package/docs/recipes/claude-design-loop.md +7 -7
  100. package/docs/recipes/core-release-pipeline.md +19 -19
  101. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  102. package/docs/recipes/figma-design-loop.md +6 -6
  103. package/docs/recipes/gds-db-backup.md +9 -9
  104. package/docs/recipes/instance-deploy.md +3 -3
  105. package/docs/recipes/instance-first-run.md +1 -1
  106. package/docs/recipes/multi-builder-merge.md +2 -2
  107. package/docs/recipes/ops-gotchas.md +13 -10
  108. package/docs/recipes/packaging-the-core.md +6 -6
  109. package/docs/recipes/parallel-goal-waves.md +4 -4
  110. package/docs/recipes/private-npm-distribution.md +9 -9
  111. package/docs/recipes/redteam-patrol.md +5 -5
  112. package/docs/recipes/render-pilot.md +2 -2
  113. package/docs/recipes/reranking-a-goals-board.md +2 -2
  114. package/docs/recipes/search-index-ingestion.md +5 -5
  115. package/docs/recipes/self-host.md +1 -1
  116. package/docs/recipes/ship-and-regrade.md +4 -4
  117. package/docs/recipes/staging-environment.md +1 -1
  118. package/docs/recipes/standalone-live-docs.md +1 -1
  119. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  120. package/docs/recipes/upgrading-the-core.md +11 -11
  121. package/docs/recipes/windows-builders.md +18 -18
  122. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  123. package/docs/research/task-network-map-readability.md +3 -3
  124. package/migrations/core_278_builder_tester_tag.sql +18 -0
  125. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  126. package/modules/agents/lib/answer-hold.js +1 -1
  127. package/modules/agents/lib/gate.js +1 -1
  128. package/modules/agents/lib/validate.js +1 -1
  129. package/modules/autonomy/db.js +9 -0
  130. package/modules/autonomy/gauge.js +1 -1
  131. package/modules/autonomy/governor-docket.js +2 -2
  132. package/modules/autonomy/module.json +2 -2
  133. package/modules/autonomy/pollers/daily-checks.js +262 -0
  134. package/modules/autonomy/pollers/routine-timers.js +9 -7
  135. package/modules/autonomy/rank-roles.js +64 -0
  136. package/modules/autonomy/routes/autonomy.js +3 -3
  137. package/modules/autonomy/server-schedule.js +37 -0
  138. package/modules/builder-settings/interaction-prefs.js +1 -1
  139. package/modules/builder-settings/render-prefs.js +1 -1
  140. package/modules/builder-settings/routes/settings.js +1 -1
  141. package/modules/builder-settings/skill-prefs.js +2 -2
  142. package/modules/builder-settings/wandering-prefs.js +2 -2
  143. package/modules/copy-desk/module.json +2 -2
  144. package/modules/copy-desk/page-data.js +5 -5
  145. package/modules/copy-desk/page-decisions.js +13 -1
  146. package/modules/copy-desk/proposals.js +4 -4
  147. package/modules/copy-desk/registry.js +2 -2
  148. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  149. package/modules/copy-desk/routes/copy-desk.js +3 -12
  150. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  151. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  152. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  153. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  154. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  155. package/modules/design-styles/skills/README.md +4 -4
  156. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  157. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  158. package/modules/discord/bug-attachments.js +1 -1
  159. package/modules/discord/ship-broadcast.js +1 -1
  160. package/modules/economy/achievements.js +49 -7
  161. package/modules/economy/cost-classify.js +6 -6
  162. package/modules/economy/cost-report.js +1 -1
  163. package/modules/economy/cost.js +1 -1
  164. package/modules/economy/credits.js +2 -1
  165. package/modules/economy/idea-size.js +2 -2
  166. package/modules/economy/reward.js +2 -0
  167. package/modules/economy/routes/cost.js +1 -1
  168. package/modules/economy/streak.js +43 -4
  169. package/modules/government/asks.js +1 -1
  170. package/modules/government/board.js +19 -2
  171. package/modules/government/catalog.js +3 -0
  172. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  173. package/modules/government/protected-surfaces.json +48 -47
  174. package/modules/government/recommendations.js +6 -2
  175. package/modules/government/routes/government.js +1 -1
  176. package/modules/grading/generated-provenance.js +13 -5
  177. package/modules/grading/grade-engine.js +1 -1
  178. package/modules/grading/grader-rubric.json +1 -1
  179. package/modules/grading/grader-score.js +1 -1
  180. package/modules/grading/grader-workers/index.js +1 -1
  181. package/modules/grading/grader.js +1 -1
  182. package/modules/grading/routes/grade.js +1 -1
  183. package/modules/hall-ui/public/atlas.html +5 -7
  184. package/modules/hall-ui/public/atlas.js +1 -1
  185. package/modules/hall-ui/public/atlas.states.json +1 -1
  186. package/modules/hall-ui/public/blockers.css +9 -0
  187. package/modules/hall-ui/public/blockers.html +4 -4
  188. package/modules/hall-ui/public/blockers.js +29 -30
  189. package/modules/hall-ui/public/board-room.css +5 -17
  190. package/modules/hall-ui/public/board-room.html +5 -6
  191. package/modules/hall-ui/public/board-room.js +41 -23
  192. package/modules/hall-ui/public/board-room.states.json +1 -1
  193. package/modules/hall-ui/public/brand-apply.js +1 -1
  194. package/modules/hall-ui/public/brand-holes.js +1 -1
  195. package/modules/hall-ui/public/builders.js +40 -86
  196. package/modules/hall-ui/public/city-decide.js +18 -4
  197. package/modules/hall-ui/public/city.html +1 -1
  198. package/modules/hall-ui/public/collab.html +1 -1
  199. package/modules/hall-ui/public/commands.html +6 -9
  200. package/modules/hall-ui/public/copy-desk.html +1 -1
  201. package/modules/hall-ui/public/copy-desk.js +2 -2
  202. package/modules/hall-ui/public/craft-mode.js +4 -0
  203. package/modules/hall-ui/public/deploy.html +6 -2
  204. package/modules/hall-ui/public/deploy.js +21 -13
  205. package/modules/hall-ui/public/diagrams.css +1 -1
  206. package/modules/hall-ui/public/diagrams.html +5 -8
  207. package/modules/hall-ui/public/diagrams.states.json +1 -1
  208. package/modules/hall-ui/public/drachmae.html +3 -7
  209. package/modules/hall-ui/public/fleet.html +3 -2
  210. package/modules/hall-ui/public/fleet.js +0 -4
  211. package/modules/hall-ui/public/gate.html +7 -7
  212. package/modules/hall-ui/public/gate.js +58 -77
  213. package/modules/hall-ui/public/goal-map.html +1 -1
  214. package/modules/hall-ui/public/goals-page.js +5 -5
  215. package/modules/hall-ui/public/goals-render.js +10 -11
  216. package/modules/hall-ui/public/goals.css +10 -0
  217. package/modules/hall-ui/public/goals.html +14 -7
  218. package/modules/hall-ui/public/government.html +3 -5
  219. package/modules/hall-ui/public/government.js +1 -5
  220. package/modules/hall-ui/public/hall-render.js +117 -57
  221. package/modules/hall-ui/public/hall-widgets.js +11 -11
  222. package/modules/hall-ui/public/idea.html +1 -1
  223. package/modules/hall-ui/public/ideas.html +3 -1
  224. package/modules/hall-ui/public/ideas.js +1 -0
  225. package/modules/hall-ui/public/index.html +12 -6
  226. package/modules/hall-ui/public/index.states.json +1 -1
  227. package/modules/hall-ui/public/mine-lens.js +1 -1
  228. package/modules/hall-ui/public/modules.html +7 -10
  229. package/modules/hall-ui/public/modules.js +0 -2
  230. package/modules/hall-ui/public/my-agents.html +1 -1
  231. package/modules/hall-ui/public/palette.js +5 -5
  232. package/modules/hall-ui/public/primer.html +4 -9
  233. package/modules/hall-ui/public/profile-connections.js +10 -2
  234. package/modules/hall-ui/public/profile-roles.js +3 -10
  235. package/modules/hall-ui/public/profile.html +12 -10
  236. package/modules/hall-ui/public/profile.js +13 -17
  237. package/modules/hall-ui/public/project-settings.html +3 -4
  238. package/modules/hall-ui/public/project-settings.js +0 -3
  239. package/modules/hall-ui/public/ranks.html +5 -11
  240. package/modules/hall-ui/public/ranks.js +6 -8
  241. package/modules/hall-ui/public/roadmap.css +0 -2
  242. package/modules/hall-ui/public/roadmap.html +1 -1
  243. package/modules/hall-ui/public/roadmap.js +16 -51
  244. package/modules/hall-ui/public/roster.html +1 -1
  245. package/modules/hall-ui/public/sessions.html +6 -8
  246. package/modules/hall-ui/public/sessions.js +7 -7
  247. package/modules/hall-ui/public/settings.html +1 -1
  248. package/modules/hall-ui/public/shell-trail.js +1 -1
  249. package/modules/hall-ui/public/shell.js +17 -17
  250. package/modules/hall-ui/public/street-deck.css +2 -1
  251. package/modules/hall-ui/public/street-deck.js +10 -2
  252. package/modules/hall-ui/public/street-desk.js +16 -5
  253. package/modules/hall-ui/public/street.html +1 -1
  254. package/modules/hall-ui/public/studio-lib.js +4 -0
  255. package/modules/hall-ui/public/studio.css +2 -0
  256. package/modules/hall-ui/public/studio.html +1 -1
  257. package/modules/hall-ui/public/studio.js +27 -1
  258. package/modules/hall-ui/public/style.css +43 -26
  259. package/modules/hall-ui/public/task-detail.js +10 -7
  260. package/modules/hall-ui/public/task.css +2 -0
  261. package/modules/hall-ui/public/task.html +3 -1
  262. package/modules/hall-ui/public/task.js +23 -7
  263. package/modules/hall-ui/public/thinking.html +1 -1
  264. package/modules/hall-ui/public/tweak-editor.html +1 -1
  265. package/modules/hall-ui/public/vote-control.js +208 -0
  266. package/modules/hall-ui/public/watch.html +3 -5
  267. package/modules/hall-ui/public/watch.js +5 -4
  268. package/modules/hall-ui/public/welcome-boot.css +130 -0
  269. package/modules/hall-ui/public/welcome-boot.js +334 -0
  270. package/modules/hall-ui/public/welcome-day.webp +0 -0
  271. package/modules/hall-ui/public/welcome-night.webp +0 -0
  272. package/modules/hall-ui/public/work-summary.js +1 -1
  273. package/modules/hall-ui/public/work.css +1 -0
  274. package/modules/hall-ui/public/work.html +3 -1
  275. package/modules/hall-ui/public/work.js +2 -1
  276. package/modules/hall-ui/records/accomplishments.md +16 -0
  277. package/modules/hall-ui/records/hall-ask-card.md +9 -0
  278. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  279. package/modules/hall-ui/records/oversight-family.md +1 -1
  280. package/modules/hall-ui/records/profile-connections.md +2 -0
  281. package/modules/hall-ui/records/profile-roles.md +1 -1
  282. package/modules/hall-ui/records/reading-rooms.md +1 -1
  283. package/modules/hall-ui/records/welcome-tower.md +50 -0
  284. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  285. package/modules/ideas/projection.js +1 -1
  286. package/modules/ideas/routes/blockers.js +3 -3
  287. package/modules/ideas/routes/inbox.js +29 -1
  288. package/modules/ideas/routes/ratify-goal.js +1 -1
  289. package/modules/ideas/routing.js +1 -1
  290. package/modules/ideas/templates.js +1 -1
  291. package/modules/ideas/trail-descent.js +1 -1
  292. package/modules/ideas/trail-size.js +1 -1
  293. package/modules/ideas/votes.js +93 -0
  294. package/modules/lifecycle/abandon-leftovers.js +1 -1
  295. package/modules/lifecycle/cascade.js +1 -1
  296. package/modules/lifecycle/conflict-resolve.js +13 -21
  297. package/modules/lifecycle/criterion-ref.js +1 -1
  298. package/modules/lifecycle/db-analytics.js +57 -4
  299. package/modules/lifecycle/db-deps-criteria.js +1 -1
  300. package/modules/lifecycle/db-ship.js +2 -2
  301. package/modules/lifecycle/db-tasks.js +2 -2
  302. package/modules/lifecycle/db-versions.js +1 -1
  303. package/modules/lifecycle/db.js +2 -0
  304. package/modules/lifecycle/dead-deps.js +3 -3
  305. package/modules/lifecycle/dependency-advisory.js +3 -3
  306. package/modules/lifecycle/goal-category.js +1 -1
  307. package/modules/lifecycle/goal-forest.js +1 -1
  308. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  309. package/modules/lifecycle/kickoff-checklist.js +1 -1
  310. package/modules/lifecycle/kickoff-seed.js +1 -1
  311. package/modules/lifecycle/lifecycle.js +2 -0
  312. package/modules/lifecycle/merge-reach.js +29 -15
  313. package/modules/lifecycle/missing-dep-classify.js +3 -3
  314. package/modules/lifecycle/module.json +2 -1
  315. package/modules/lifecycle/page-tweak-approve.js +85 -1
  316. package/modules/lifecycle/page-tweak-hold.js +1 -1
  317. package/modules/lifecycle/publish-reconciler.js +1 -2
  318. package/modules/lifecycle/rot.js +1 -1
  319. package/modules/lifecycle/routes/artist-gate.js +1 -1
  320. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  321. package/modules/lifecycle/routes/goals.js +1 -1
  322. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  323. package/modules/lifecycle/routes/task-votes.js +54 -0
  324. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  325. package/modules/lifecycle/routes/tasks.js +2 -2
  326. package/modules/lifecycle/routes/versions.js +2 -2
  327. package/modules/lifecycle/ship-card.js +4 -4
  328. package/modules/lifecycle/ship-preflight.js +1 -1
  329. package/modules/lifecycle/task-classifier.js +1 -1
  330. package/modules/lifecycle/task-status.js +1 -1
  331. package/modules/lifecycle/task-visual-db.js +1 -1
  332. package/modules/memory/learnings.js +1 -1
  333. package/modules/memory/pollers/search-index.js +2 -2
  334. package/modules/memory/routes/learnings.js +1 -1
  335. package/modules/memory/routes/memory.js +1 -1
  336. package/modules/memory/search.js +2 -2
  337. package/modules/npm-release/release.js +1 -1
  338. package/modules/onboarding/howto-moments.js +1 -1
  339. package/modules/onboarding/newcomer-restock.js +3 -3
  340. package/modules/onboarding/onboarding.js +1 -1
  341. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  342. package/modules/platform-identity/origin-containment.js +1 -1
  343. package/modules/platform-identity/publish-gate.js +1 -1
  344. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  345. package/modules/provisioning/capacity.js +1 -1
  346. package/modules/provisioning/core-upgrade.js +15 -9
  347. package/modules/provisioning/credential-preflight.js +3 -3
  348. package/modules/provisioning/disconnect.js +1 -1
  349. package/modules/provisioning/dns-resolves.js +1 -1
  350. package/modules/provisioning/module.json +1 -1
  351. package/modules/provisioning/onboard-plan.js +1 -1
  352. package/modules/provisioning/paid-shape-gate.js +2 -2
  353. package/modules/provisioning/planet-physics.js +11 -2
  354. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  355. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  356. package/modules/provisioning/provisioning.js +2 -2
  357. package/modules/provisioning/render-lookup.js +1 -1
  358. package/modules/provisioning/render-standup.js +3 -3
  359. package/modules/provisioning/repo-private.js +1 -1
  360. package/modules/provisioning/routes/callback-page.js +1 -1
  361. package/modules/provisioning/routes/core-upgrade.js +23 -3
  362. package/modules/provisioning/routes/provisioning.js +2 -2
  363. package/modules/provisioning/routes/render-standup.js +1 -1
  364. package/modules/provisioning/routes/repo-private.js +1 -1
  365. package/modules/provisioning/soft-limits.js +1 -1
  366. package/modules/provisioning/starter-bundles.js +4 -2
  367. package/modules/provisioning/tests/provisioning.mjs +1 -1
  368. package/modules/public-landing/public/account.html +4 -6
  369. package/modules/public-landing/public/assets/cosmos.css +13 -6
  370. package/modules/public-landing/public/connections.html +4 -6
  371. package/modules/public-landing/public/contact.html +4 -6
  372. package/modules/public-landing/public/guild.html +4 -6
  373. package/modules/public-landing/public/index.html +11 -9
  374. package/modules/public-landing/public/invitations.html +4 -6
  375. package/modules/public-landing/public/privacy.html +4 -6
  376. package/modules/public-landing/public/projects.html +168 -46
  377. package/modules/public-landing/public/terms.html +4 -6
  378. package/modules/raise/content/copy.json +40 -0
  379. package/modules/raise/content/nda.html +39 -0
  380. package/modules/raise/content/settings.json +49 -0
  381. package/modules/raise/db.js +95 -0
  382. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  383. package/modules/raise/module.json +28 -0
  384. package/modules/raise/page.js +194 -0
  385. package/modules/raise/public/edit.js +152 -0
  386. package/modules/raise/public/favicon.svg +1 -0
  387. package/modules/raise/public/logo-ink.svg +1 -0
  388. package/modules/raise/public/logo-night.svg +1 -0
  389. package/modules/raise/public/mode.js +8 -0
  390. package/modules/raise/public/raise.css +234 -0
  391. package/modules/raise/public/raise.js +91 -0
  392. package/modules/raise/raise.js +174 -0
  393. package/modules/raise/routes/raise.js +152 -0
  394. package/modules/raise/views/gate.html +39 -0
  395. package/modules/raise/views/nda.html +21 -0
  396. package/modules/raise/views/page.html +133 -0
  397. package/modules/raise/web.js +72 -0
  398. package/modules/render-deploy/deploys.js +1 -1
  399. package/modules/render-deploy/render.js +2 -2
  400. package/modules/security/secret-scrub.js +3 -3
  401. package/modules/security/security.js +1 -1
  402. package/modules/security/tests/artifact_scan.mjs +1 -1
  403. package/modules/security/tests/mirror.mjs +1 -1
  404. package/modules/security/tests/scan_store.mjs +1 -1
  405. package/modules/sessions/db.js +2 -2
  406. package/modules/sessions/pulse.js +2 -2
  407. package/modules/sessions/routes/sessions.js +1 -1
  408. package/modules/specialities/specialities.js +1 -1
  409. package/modules/status-ui/public/README.md +3 -4
  410. package/modules/status-ui/public/index.html +5 -31
  411. package/modules/status-ui/public/status.js +6 -174
  412. package/modules/status-ui/public/style.css +4 -133
  413. package/modules/ui-design/docs/design-contract.md +3 -3
  414. package/modules/ui-design/kit/README.md +1 -1
  415. package/modules/ui-design/kit/serve.js +13 -4
  416. package/modules/ui-design/scripts/design-sync.js +1 -1
  417. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  418. package/modules/ui-design/scripts/validate-design.js +1 -1
  419. package/package-lock.json +27 -11
  420. package/package.json +2 -3
  421. package/release-notes.json +186 -0
  422. package/scripts/bongos/CLAUDE.md +15 -0
  423. package/scripts/bongos/abandon.js +137 -0
  424. package/scripts/bongos/accessibility-replay.js +195 -0
  425. package/scripts/bongos/address-park-sweep.sh +91 -0
  426. package/scripts/bongos/adopt-detect.js +123 -0
  427. package/scripts/bongos/adopt-import.js +111 -0
  428. package/scripts/bongos/adopt-preflight.js +187 -0
  429. package/scripts/bongos/adr-namespace.js +273 -0
  430. package/scripts/bongos/agent-invoke.js +689 -0
  431. package/scripts/bongos/agents-sync.js +502 -0
  432. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  433. package/scripts/bongos/api-artifacts.js +91 -0
  434. package/scripts/bongos/api.js +86 -0
  435. package/scripts/bongos/api.ps1 +26 -0
  436. package/scripts/bongos/architect-audit.js +294 -0
  437. package/scripts/bongos/artifact-audit.js +326 -0
  438. package/scripts/bongos/artifact-format.js +203 -0
  439. package/scripts/bongos/ask.js +231 -0
  440. package/scripts/bongos/audit-authorship.sh +324 -0
  441. package/scripts/bongos/audit-deps.js +189 -0
  442. package/scripts/bongos/audit-gate.js +121 -0
  443. package/scripts/bongos/audit-rank-roles.js +131 -0
  444. package/scripts/bongos/audit-replay.sh +205 -0
  445. package/scripts/bongos/autobongos-digest.js +123 -0
  446. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  447. package/scripts/bongos/autobongos-loop.js +210 -0
  448. package/scripts/bongos/autobongos-run.js +1361 -0
  449. package/scripts/bongos/autobongos-service.cmd +50 -0
  450. package/scripts/bongos/autobongos-service.ps1 +270 -0
  451. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  452. package/scripts/bongos/autobongos-verify.js +618 -0
  453. package/scripts/bongos/autonomy-gate.js +135 -0
  454. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  455. package/scripts/bongos/autonomy-gauge.js +84 -0
  456. package/scripts/bongos/backfill-cost.js +176 -0
  457. package/scripts/bongos/backfill-disciplines.js +144 -0
  458. package/scripts/bongos/backfill-session-earnings.js +123 -0
  459. package/scripts/bongos/backfill-session-types.js +87 -0
  460. package/scripts/bongos/backfill-sessions.js +411 -0
  461. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  462. package/scripts/bongos/backfill-task-rewards.js +413 -0
  463. package/scripts/bongos/backlog-review.js +399 -0
  464. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  465. package/scripts/bongos/backup.js +116 -0
  466. package/scripts/bongos/baseline-staleness.js +217 -0
  467. package/scripts/bongos/bfg-principal-token.js +65 -0
  468. package/scripts/bongos/bug-attachment-audit.js +149 -0
  469. package/scripts/bongos/bug-attachment-recover.js +198 -0
  470. package/scripts/bongos/bug-triage.js +292 -0
  471. package/scripts/bongos/build-bongos.js +94 -0
  472. package/scripts/bongos/bump-version.js +221 -0
  473. package/scripts/bongos/capture.js +481 -0
  474. package/scripts/bongos/category-advisory-guard.js +206 -0
  475. package/scripts/bongos/ci-grade.js +82 -0
  476. package/scripts/bongos/claim-recall.js +112 -0
  477. package/scripts/bongos/claim.js +789 -0
  478. package/scripts/bongos/claude-materialize.js +1200 -0
  479. package/scripts/bongos/claude-md-template.js +142 -0
  480. package/scripts/bongos/cleanup-orphans.js +74 -0
  481. package/scripts/bongos/cli-lib.js +1226 -0
  482. package/scripts/bongos/client-baseurl-guard.js +116 -0
  483. package/scripts/bongos/codemod-rename-scripts-gds.js +380 -0
  484. package/scripts/bongos/conductor-dispatch.js +535 -0
  485. package/scripts/bongos/context-pack.js +326 -0
  486. package/scripts/bongos/control-manifest.js +199 -0
  487. package/scripts/bongos/copy-apply.js +758 -0
  488. package/scripts/bongos/copy-inventory.js +571 -0
  489. package/scripts/bongos/core-origin-follow.js +185 -0
  490. package/scripts/bongos/core-pin-sync.js +260 -0
  491. package/scripts/bongos/cost-report.js +63 -0
  492. package/scripts/bongos/cost.js +47 -0
  493. package/scripts/bongos/credential-presence.js +296 -0
  494. package/scripts/bongos/cutover-codemod.js +240 -0
  495. package/scripts/bongos/db-backup-nightly.sh +232 -0
  496. package/scripts/bongos/db-backup-offsite.sh +267 -0
  497. package/scripts/bongos/demote.js +45 -0
  498. package/scripts/bongos/deploy-divergence.js +454 -0
  499. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  500. package/scripts/bongos/design-sync.js +12 -0
  501. package/scripts/bongos/dev-box-guard.js +166 -0
  502. package/scripts/bongos/dev-lib.js +722 -0
  503. package/scripts/bongos/dev.js +645 -0
  504. package/scripts/bongos/device-flow-help.js +72 -0
  505. package/scripts/bongos/diagnose-achievements.js +118 -0
  506. package/scripts/bongos/diagram-facts.js +355 -0
  507. package/scripts/bongos/discord-channels.js +77 -0
  508. package/scripts/bongos/do-api.js +109 -0
  509. package/scripts/bongos/doc-cli-guard.js +274 -0
  510. package/scripts/bongos/doc-comment-coverage.js +139 -0
  511. package/scripts/bongos/doc-control-claims.js +170 -0
  512. package/scripts/bongos/docs-entropy.js +453 -0
  513. package/scripts/bongos/doctor.js +493 -0
  514. package/scripts/bongos/enroll-control-plane.js +101 -0
  515. package/scripts/bongos/exec-path-guard.js +564 -0
  516. package/scripts/bongos/feedback-send.js +249 -0
  517. package/scripts/bongos/fetch-art-key.js +106 -0
  518. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  519. package/scripts/bongos/figma-design-sync.js +11 -0
  520. package/scripts/bongos/find-untested.js +371 -0
  521. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  522. package/scripts/bongos/fitness-checks-identity.js +332 -0
  523. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  524. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  525. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  526. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  527. package/scripts/bongos/fitness-lib.js +127 -0
  528. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  529. package/scripts/bongos/fitness-ratchets.js +594 -0
  530. package/scripts/bongos/fitness.js +1498 -0
  531. package/scripts/bongos/forwarder.js +80 -0
  532. package/scripts/bongos/gate-review.js +330 -0
  533. package/scripts/bongos/gating.js +348 -0
  534. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  535. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  537. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  538. package/scripts/bongos/gds-literal-scan.js +196 -0
  539. package/scripts/bongos/gen-api-client.js +576 -0
  540. package/scripts/bongos/gen-api-docs.js +1111 -0
  541. package/scripts/bongos/gen-atlas.js +366 -0
  542. package/scripts/bongos/gen-diagrams.js +608 -0
  543. package/scripts/bongos/gen-file-map.js +337 -0
  544. package/scripts/bongos/gen-freshness.js +32 -0
  545. package/scripts/bongos/gen-interaction-posture.js +122 -0
  546. package/scripts/bongos/gen-repo-map.js +540 -0
  547. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  548. package/scripts/bongos/gen-session-index.js +243 -0
  549. package/scripts/bongos/gen-sounds.js +176 -0
  550. package/scripts/bongos/git-merge-regen.js +254 -0
  551. package/scripts/bongos/go-live.js +1071 -0
  552. package/scripts/bongos/goal.js +272 -0
  553. package/scripts/bongos/government-walk.js +1477 -0
  554. package/scripts/bongos/grade-correlation-audit.js +310 -0
  555. package/scripts/bongos/grade-replay.js +237 -0
  556. package/scripts/bongos/grade-smoke.js +205 -0
  557. package/scripts/bongos/home-isolation-guard.js +126 -0
  558. package/scripts/bongos/hooks/pre-push.js +211 -0
  559. package/scripts/bongos/howto.js +145 -0
  560. package/scripts/bongos/http-api-client.js +81 -0
  561. package/scripts/bongos/identity-strip.js +75 -0
  562. package/scripts/bongos/init.js +1159 -0
  563. package/scripts/bongos/install-git-hooks.js +200 -0
  564. package/scripts/bongos/instance-apex.js +38 -0
  565. package/scripts/bongos/intent-retry.js +52 -0
  566. package/scripts/bongos/key-card.js +222 -0
  567. package/scripts/bongos/key-status.js +126 -0
  568. package/scripts/bongos/land-watch.js +201 -0
  569. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  570. package/scripts/bongos/learning-capture.js +145 -0
  571. package/scripts/bongos/lib.sh +74 -0
  572. package/scripts/bongos/linkify-refs.js +655 -0
  573. package/scripts/bongos/lint-infra-exec.js +70 -0
  574. package/scripts/bongos/lint-migrations.js +102 -0
  575. package/scripts/bongos/lint-workflow-exec.js +63 -0
  576. package/scripts/bongos/local-preview-lib.js +128 -0
  577. package/scripts/bongos/local-preview.js +82 -0
  578. package/scripts/bongos/login.js +360 -0
  579. package/scripts/bongos/main-audit.js +625 -0
  580. package/scripts/bongos/me.js +97 -0
  581. package/scripts/bongos/memory-map.js +176 -0
  582. package/scripts/bongos/merge-lock.js +71 -0
  583. package/scripts/bongos/migration-namespace.js +313 -0
  584. package/scripts/bongos/mirror-lineage-check.js +343 -0
  585. package/scripts/bongos/mirror-redact.js +350 -0
  586. package/scripts/bongos/module-artifact.js +289 -0
  587. package/scripts/bongos/module-assess-docs.js +238 -0
  588. package/scripts/bongos/module-assess-installs.js +228 -0
  589. package/scripts/bongos/module-assess-score.js +111 -0
  590. package/scripts/bongos/module-assess-security.js +252 -0
  591. package/scripts/bongos/module-assess-tests.js +278 -0
  592. package/scripts/bongos/module-assess-version.js +92 -0
  593. package/scripts/bongos/module-error-report.js +148 -0
  594. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  595. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  596. package/scripts/bongos/module-test-runner.js +414 -0
  597. package/scripts/bongos/module.js +1376 -0
  598. package/scripts/bongos/move-escalation.js +141 -0
  599. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  600. package/scripts/bongos/newcomer-floor.js +421 -0
  601. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  602. package/scripts/bongos/newcomer-floor.test.js +235 -0
  603. package/scripts/bongos/next-number.js +163 -0
  604. package/scripts/bongos/oauth-secret.js +202 -0
  605. package/scripts/bongos/onboard.js +267 -0
  606. package/scripts/bongos/onboarding-analyze.js +226 -0
  607. package/scripts/bongos/onboarding-config.js +179 -0
  608. package/scripts/bongos/onboarding-ship.js +92 -0
  609. package/scripts/bongos/pack-env-prefix.js +73 -0
  610. package/scripts/bongos/package-core.js +1200 -0
  611. package/scripts/bongos/page-inventory.js +348 -0
  612. package/scripts/bongos/page-reader.js +722 -0
  613. package/scripts/bongos/paste-token.js +212 -0
  614. package/scripts/bongos/plain-cards.js +351 -0
  615. package/scripts/bongos/portability-smoke-art.sh +85 -0
  616. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  617. package/scripts/bongos/preflight.js +214 -0
  618. package/scripts/bongos/probe-cache.js +246 -0
  619. package/scripts/bongos/prove-strict-versioning.js +284 -0
  620. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  621. package/scripts/bongos/provision-byo-host.js +68 -0
  622. package/scripts/bongos/provision-capacity.js +79 -0
  623. package/scripts/bongos/provision-caps.js +63 -0
  624. package/scripts/bongos/provision-config.js +233 -0
  625. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  626. package/scripts/bongos/provision-disconnect.js +88 -0
  627. package/scripts/bongos/provision-github-setup.js +168 -0
  628. package/scripts/bongos/provision-net.js +357 -0
  629. package/scripts/bongos/provision-pin-key.js +176 -0
  630. package/scripts/bongos/provision-pin-replay.js +126 -0
  631. package/scripts/bongos/provision-process.js +170 -0
  632. package/scripts/bongos/provision-render.js +201 -0
  633. package/scripts/bongos/provision-repo-auth.js +164 -0
  634. package/scripts/bongos/provision-repo-private.js +98 -0
  635. package/scripts/bongos/provision-repo.js +1337 -0
  636. package/scripts/bongos/provision-teardown.js +106 -0
  637. package/scripts/bongos/provision-units.js +469 -0
  638. package/scripts/bongos/provision.js +1479 -0
  639. package/scripts/bongos/publish-credential-check.js +66 -0
  640. package/scripts/bongos/publish-integration-gate.js +142 -0
  641. package/scripts/bongos/publish-manifest.js +440 -0
  642. package/scripts/bongos/publish-watch.js +268 -0
  643. package/scripts/bongos/pulse.js +338 -0
  644. package/scripts/bongos/push-main.js +56 -0
  645. package/scripts/bongos/push-path-brief.js +100 -0
  646. package/scripts/bongos/read-session-export.js +359 -0
  647. package/scripts/bongos/reauth.js +155 -0
  648. package/scripts/bongos/recall.js +183 -0
  649. package/scripts/bongos/redteam-patrol.js +437 -0
  650. package/scripts/bongos/regen-instance-docs.js +47 -0
  651. package/scripts/bongos/release-core.js +80 -0
  652. package/scripts/bongos/release-notes.js +271 -0
  653. package/scripts/bongos/release.js +139 -0
  654. package/scripts/bongos/rename-history-check.js +369 -0
  655. package/scripts/bongos/rename-ledger-prose.js +482 -0
  656. package/scripts/bongos/render-api.js +197 -0
  657. package/scripts/bongos/render-check.js +206 -0
  658. package/scripts/bongos/render-ideas.js +226 -0
  659. package/scripts/bongos/render-payload.js +85 -0
  660. package/scripts/bongos/repo-metrics.js +363 -0
  661. package/scripts/bongos/review-sheet.js +108 -0
  662. package/scripts/bongos/role-pack-guard.js +142 -0
  663. package/scripts/bongos/route-shadow-guard.js +175 -0
  664. package/scripts/bongos/routine-schedule.js +318 -0
  665. package/scripts/bongos/run-routine.js +257 -0
  666. package/scripts/bongos/run-unit-tests.js +654 -0
  667. package/scripts/bongos/runner-drift.js +151 -0
  668. package/scripts/bongos/sandbox-stage.js +459 -0
  669. package/scripts/bongos/scope-map-guard.js +300 -0
  670. package/scripts/bongos/scope-roster-guard.js +118 -0
  671. package/scripts/bongos/seam-wiring-guard.js +275 -0
  672. package/scripts/bongos/search-ingest-db.js +288 -0
  673. package/scripts/bongos/search-ingest-md.js +269 -0
  674. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  675. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  676. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  677. package/scripts/bongos/seed-staging.sh +117 -0
  678. package/scripts/bongos/seed-verify-criteria.js +124 -0
  679. package/scripts/bongos/sequence.js +597 -0
  680. package/scripts/bongos/session-cost.js +430 -0
  681. package/scripts/bongos/session-digest-build.js +293 -0
  682. package/scripts/bongos/session-digest.js +200 -0
  683. package/scripts/bongos/session-eval.js +631 -0
  684. package/scripts/bongos/session-transcript-build.js +155 -0
  685. package/scripts/bongos/session-transcript-upload.js +29 -0
  686. package/scripts/bongos/session.js +404 -0
  687. package/scripts/bongos/setup.js +646 -0
  688. package/scripts/bongos/ship-check.js +89 -0
  689. package/scripts/bongos/ship-deploy-target.js +393 -0
  690. package/scripts/bongos/ship-escalation.js +167 -0
  691. package/scripts/bongos/ship-finish.js +420 -0
  692. package/scripts/bongos/ship-flow.js +1217 -0
  693. package/scripts/bongos/ship-git.js +100 -0
  694. package/scripts/bongos/ship-grade-steps.js +547 -0
  695. package/scripts/bongos/ship-grade.js +426 -0
  696. package/scripts/bongos/ship-honesty.js +314 -0
  697. package/scripts/bongos/ship-io.js +139 -0
  698. package/scripts/bongos/ship-land.js +1130 -0
  699. package/scripts/bongos/ship-memory-sync.js +249 -0
  700. package/scripts/bongos/ship-merge-gate.js +225 -0
  701. package/scripts/bongos/ship-merge.js +466 -0
  702. package/scripts/bongos/ship-mode-ask.js +138 -0
  703. package/scripts/bongos/ship-mode-manual.js +54 -0
  704. package/scripts/bongos/ship-preflight-steps.js +399 -0
  705. package/scripts/bongos/ship-regen.js +291 -0
  706. package/scripts/bongos/ship-resume.js +201 -0
  707. package/scripts/bongos/ship-session-upload.js +313 -0
  708. package/scripts/bongos/ship-state.js +110 -0
  709. package/scripts/bongos/ship-surprise.js +84 -0
  710. package/scripts/bongos/ship-visual.js +75 -0
  711. package/scripts/bongos/ship.js +382 -0
  712. package/scripts/bongos/shipping-mode.js +71 -0
  713. package/scripts/bongos/skill-lint.js +250 -0
  714. package/scripts/bongos/skill-preflight.js +361 -0
  715. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  716. package/scripts/bongos/smoke-batch-release.sh +316 -0
  717. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  718. package/scripts/bongos/smoke-dependencies.sh +143 -0
  719. package/scripts/bongos/smoke-gds.js +256 -0
  720. package/scripts/bongos/smoke-write.sh +275 -0
  721. package/scripts/bongos/source-text-test-scan.js +106 -0
  722. package/scripts/bongos/spark.js +294 -0
  723. package/scripts/bongos/stale-worktrees.js +212 -0
  724. package/scripts/bongos/start-goals.js +102 -0
  725. package/scripts/bongos/start.js +1090 -0
  726. package/scripts/bongos/status.js +545 -0
  727. package/scripts/bongos/strand-watch.js +315 -0
  728. package/scripts/bongos/stranded-rows.js +200 -0
  729. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  730. package/scripts/bongos/surface.js +101 -0
  731. package/scripts/bongos/task.js +273 -0
  732. package/scripts/bongos/test-path-guard.js +99 -0
  733. package/scripts/bongos/triage.js +742 -0
  734. package/scripts/bongos/turn-end-sound.js +74 -0
  735. package/scripts/bongos/tweak-halt.js +70 -0
  736. package/scripts/bongos/tweak-renders.js +200 -0
  737. package/scripts/bongos/uat.js +120 -0
  738. package/scripts/bongos/ui-kit-transform.js +43 -0
  739. package/scripts/bongos/update-channel.js +512 -0
  740. package/scripts/bongos/update-sweep.js +829 -0
  741. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  742. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  743. package/scripts/bongos/upgrade-migrate.js +224 -0
  744. package/scripts/bongos/upgrade-operator.js +73 -0
  745. package/scripts/bongos/upgrade-outcome.js +174 -0
  746. package/scripts/bongos/upgrade.js +1499 -0
  747. package/scripts/bongos/validate-design.js +12 -0
  748. package/scripts/bongos/version-close.js +621 -0
  749. package/scripts/bongos/version-literal-guard.js +140 -0
  750. package/scripts/bongos/version-select.js +79 -0
  751. package/scripts/bongos/visual-review-nudge.js +39 -0
  752. package/scripts/bongos/wedge-remedy.js +174 -0
  753. package/scripts/bongos/worktree-claim-guard.js +130 -0
  754. package/scripts/bongos/worktree.js +449 -0
  755. package/scripts/discord/post.js +1 -1
  756. package/scripts/gds/README.md +9 -0
  757. package/scripts/gds/abandon.js +6 -136
  758. package/scripts/gds/accessibility-replay.js +5 -194
  759. package/scripts/gds/address-park-sweep.sh +7 -90
  760. package/scripts/gds/adopt-detect.js +5 -121
  761. package/scripts/gds/adopt-import.js +5 -109
  762. package/scripts/gds/adopt-preflight.js +5 -185
  763. package/scripts/gds/adr-namespace.js +5 -271
  764. package/scripts/gds/agent-invoke.js +5 -687
  765. package/scripts/gds/agents-sync.js +5 -500
  766. package/scripts/gds/api-alias-caller-scan.js +5 -255
  767. package/scripts/gds/api-artifacts.js +6 -0
  768. package/scripts/gds/api.js +6 -85
  769. package/scripts/gds/api.ps1 +8 -26
  770. package/scripts/gds/architect-audit.js +6 -293
  771. package/scripts/gds/artifact-audit.js +5 -324
  772. package/scripts/gds/artifact-format.js +6 -203
  773. package/scripts/gds/ask.js +5 -229
  774. package/scripts/gds/audit-authorship.sh +7 -328
  775. package/scripts/gds/audit-deps.js +6 -188
  776. package/scripts/gds/audit-gate.js +5 -119
  777. package/scripts/gds/audit-rank-roles.js +6 -171
  778. package/scripts/gds/audit-replay.sh +7 -204
  779. package/scripts/gds/autobongos-digest.js +5 -121
  780. package/scripts/gds/autobongos-grade-cap.js +5 -186
  781. package/scripts/gds/autobongos-loop.js +5 -208
  782. package/scripts/gds/autobongos-run.js +5 -1359
  783. package/scripts/gds/autobongos-service.cmd +8 -49
  784. package/scripts/gds/autobongos-service.ps1 +8 -270
  785. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  786. package/scripts/gds/autobongos-verify.js +5 -616
  787. package/scripts/gds/autonomy-gate.js +5 -133
  788. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  789. package/scripts/gds/autonomy-gauge.js +5 -82
  790. package/scripts/gds/backfill-cost.js +6 -175
  791. package/scripts/gds/backfill-disciplines.js +5 -142
  792. package/scripts/gds/backfill-session-earnings.js +5 -121
  793. package/scripts/gds/backfill-session-types.js +5 -85
  794. package/scripts/gds/backfill-sessions.js +5 -409
  795. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  796. package/scripts/gds/backfill-task-rewards.js +5 -411
  797. package/scripts/gds/backlog-review.js +6 -398
  798. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  799. package/scripts/gds/backup.js +6 -115
  800. package/scripts/gds/baseline-staleness.js +5 -215
  801. package/scripts/gds/bfg-principal-token.js +6 -64
  802. package/scripts/gds/bug-attachment-audit.js +5 -147
  803. package/scripts/gds/bug-attachment-recover.js +5 -196
  804. package/scripts/gds/bug-triage.js +6 -291
  805. package/scripts/gds/build-bongos.js +5 -92
  806. package/scripts/gds/bump-version.js +5 -219
  807. package/scripts/gds/capture.js +6 -480
  808. package/scripts/gds/category-advisory-guard.js +5 -205
  809. package/scripts/gds/ci-grade.js +6 -81
  810. package/scripts/gds/claim-recall.js +6 -111
  811. package/scripts/gds/claim.js +6 -788
  812. package/scripts/gds/claude-materialize.js +5 -1198
  813. package/scripts/gds/claude-md-template.js +5 -140
  814. package/scripts/gds/cleanup-orphans.js +6 -73
  815. package/scripts/gds/cli-lib.js +6 -1204
  816. package/scripts/gds/client-baseurl-guard.js +5 -114
  817. package/scripts/gds/conductor-dispatch.js +6 -534
  818. package/scripts/gds/context-pack.js +6 -325
  819. package/scripts/gds/control-manifest.js +5 -197
  820. package/scripts/gds/copy-apply.js +5 -756
  821. package/scripts/gds/copy-inventory.js +5 -569
  822. package/scripts/gds/core-origin-follow.js +5 -184
  823. package/scripts/gds/core-pin-sync.js +5 -258
  824. package/scripts/gds/cost-report.js +6 -62
  825. package/scripts/gds/cost.js +6 -46
  826. package/scripts/gds/credential-presence.js +5 -294
  827. package/scripts/gds/cutover-codemod.js +5 -239
  828. package/scripts/gds/db-backup-nightly.sh +7 -231
  829. package/scripts/gds/db-backup-offsite.sh +7 -266
  830. package/scripts/gds/demote.js +6 -44
  831. package/scripts/gds/deploy-divergence.js +6 -445
  832. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  833. package/scripts/gds/design-sync.js +5 -10
  834. package/scripts/gds/dev-box-guard.js +5 -164
  835. package/scripts/gds/dev-lib.js +5 -721
  836. package/scripts/gds/dev.js +5 -643
  837. package/scripts/gds/device-flow-help.js +5 -70
  838. package/scripts/gds/diagnose-achievements.js +5 -116
  839. package/scripts/gds/diagram-facts.js +6 -355
  840. package/scripts/gds/discord-channels.js +5 -75
  841. package/scripts/gds/do-api.js +6 -109
  842. package/scripts/gds/doc-cli-guard.js +5 -266
  843. package/scripts/gds/doc-comment-coverage.js +5 -137
  844. package/scripts/gds/doc-control-claims.js +5 -166
  845. package/scripts/gds/docs-entropy.js +5 -443
  846. package/scripts/gds/doctor.js +6 -492
  847. package/scripts/gds/enroll-control-plane.js +5 -99
  848. package/scripts/gds/exec-path-guard.js +5 -562
  849. package/scripts/gds/feedback-send.js +5 -247
  850. package/scripts/gds/fetch-art-key.js +5 -104
  851. package/scripts/gds/fetch-sound-prefs.js +5 -124
  852. package/scripts/gds/figma-design-sync.js +5 -9
  853. package/scripts/gds/find-untested.js +5 -369
  854. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  855. package/scripts/gds/fitness-checks-identity.js +5 -342
  856. package/scripts/gds/fitness-checks-packaging.js +5 -131
  857. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  858. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  859. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  860. package/scripts/gds/fitness-lib.js +5 -126
  861. package/scripts/gds/fitness-migration-contraction.js +5 -49
  862. package/scripts/gds/fitness-ratchets.js +5 -563
  863. package/scripts/gds/fitness.js +5 -1493
  864. package/scripts/gds/gate-review.js +5 -328
  865. package/scripts/gds/gating.js +5 -346
  866. package/scripts/gds/gds-literal-scan.js +5 -194
  867. package/scripts/gds/gen-api-client.js +5 -555
  868. package/scripts/gds/gen-api-docs.js +5 -1100
  869. package/scripts/gds/gen-atlas.js +5 -364
  870. package/scripts/gds/gen-diagrams.js +6 -607
  871. package/scripts/gds/gen-file-map.js +5 -335
  872. package/scripts/gds/gen-freshness.js +5 -31
  873. package/scripts/gds/gen-interaction-posture.js +5 -120
  874. package/scripts/gds/gen-repo-map.js +5 -538
  875. package/scripts/gds/gen-role-responsibilities.js +5 -133
  876. package/scripts/gds/gen-session-index.js +5 -241
  877. package/scripts/gds/gen-sounds.js +5 -174
  878. package/scripts/gds/git-merge-regen.js +6 -291
  879. package/scripts/gds/go-live.js +5 -1069
  880. package/scripts/gds/goal.js +6 -271
  881. package/scripts/gds/government-walk.js +5 -1475
  882. package/scripts/gds/grade-correlation-audit.js +5 -308
  883. package/scripts/gds/grade-replay.js +5 -235
  884. package/scripts/gds/grade-smoke.js +6 -204
  885. package/scripts/gds/home-isolation-guard.js +5 -125
  886. package/scripts/gds/hooks/pre-push.js +5 -209
  887. package/scripts/gds/howto.js +5 -143
  888. package/scripts/gds/http-api-client.js +6 -81
  889. package/scripts/gds/identity-strip.js +5 -74
  890. package/scripts/gds/init.js +5 -1157
  891. package/scripts/gds/install-git-hooks.js +5 -198
  892. package/scripts/gds/instance-apex.js +5 -37
  893. package/scripts/gds/intent-retry.js +5 -51
  894. package/scripts/gds/key-card.js +6 -221
  895. package/scripts/gds/key-status.js +5 -124
  896. package/scripts/gds/land-watch.js +5 -199
  897. package/scripts/gds/leak-scan-allowlist.js +5 -291
  898. package/scripts/gds/learning-capture.js +6 -144
  899. package/scripts/gds/lib.sh +7 -73
  900. package/scripts/gds/linkify-refs.js +6 -654
  901. package/scripts/gds/lint-infra-exec.js +5 -68
  902. package/scripts/gds/lint-migrations.js +5 -100
  903. package/scripts/gds/lint-workflow-exec.js +5 -61
  904. package/scripts/gds/local-preview-lib.js +6 -128
  905. package/scripts/gds/local-preview.js +6 -81
  906. package/scripts/gds/login.js +5 -358
  907. package/scripts/gds/main-audit.js +5 -623
  908. package/scripts/gds/me.js +6 -96
  909. package/scripts/gds/memory-map.js +5 -174
  910. package/scripts/gds/merge-lock.js +6 -70
  911. package/scripts/gds/migration-namespace.js +5 -311
  912. package/scripts/gds/mirror-lineage-check.js +5 -341
  913. package/scripts/gds/mirror-redact.js +5 -348
  914. package/scripts/gds/module-artifact.js +6 -289
  915. package/scripts/gds/module-assess-docs.js +6 -237
  916. package/scripts/gds/module-assess-installs.js +6 -227
  917. package/scripts/gds/module-assess-score.js +6 -110
  918. package/scripts/gds/module-assess-security.js +6 -251
  919. package/scripts/gds/module-assess-tests.js +6 -277
  920. package/scripts/gds/module-assess-version.js +6 -91
  921. package/scripts/gds/module-error-report.js +5 -146
  922. package/scripts/gds/module-test-runner.js +6 -413
  923. package/scripts/gds/module.js +5 -1374
  924. package/scripts/gds/move-escalation.js +5 -140
  925. package/scripts/gds/newcomer-floor.js +6 -420
  926. package/scripts/gds/newcomer-floor.test.js +6 -234
  927. package/scripts/gds/next-number.js +6 -162
  928. package/scripts/gds/oauth-secret.js +5 -200
  929. package/scripts/gds/onboard.js +5 -265
  930. package/scripts/gds/onboarding-analyze.js +6 -225
  931. package/scripts/gds/onboarding-config.js +6 -179
  932. package/scripts/gds/onboarding-ship.js +6 -91
  933. package/scripts/gds/pack-env-prefix.js +5 -72
  934. package/scripts/gds/package-core.js +5 -1102
  935. package/scripts/gds/page-inventory.js +5 -346
  936. package/scripts/gds/page-reader.js +5 -720
  937. package/scripts/gds/paste-token.js +6 -211
  938. package/scripts/gds/plain-cards.js +5 -350
  939. package/scripts/gds/portability-smoke-art.sh +7 -84
  940. package/scripts/gds/portability-smoke-memory.sh +7 -175
  941. package/scripts/gds/preflight.js +5 -212
  942. package/scripts/gds/probe-cache.js +5 -244
  943. package/scripts/gds/prove-strict-versioning.js +6 -283
  944. package/scripts/gds/provision-auto-upgrade.js +5 -161
  945. package/scripts/gds/provision-byo-host.js +5 -67
  946. package/scripts/gds/provision-capacity.js +5 -78
  947. package/scripts/gds/provision-caps.js +5 -62
  948. package/scripts/gds/provision-config.js +5 -232
  949. package/scripts/gds/provision-core-upgrade.js +5 -1165
  950. package/scripts/gds/provision-disconnect.js +5 -87
  951. package/scripts/gds/provision-github-setup.js +5 -167
  952. package/scripts/gds/provision-net.js +5 -356
  953. package/scripts/gds/provision-pin-key.js +5 -175
  954. package/scripts/gds/provision-pin-replay.js +5 -125
  955. package/scripts/gds/provision-process.js +5 -169
  956. package/scripts/gds/provision-render.js +5 -200
  957. package/scripts/gds/provision-repo-auth.js +5 -163
  958. package/scripts/gds/provision-repo-private.js +5 -97
  959. package/scripts/gds/provision-repo.js +5 -1336
  960. package/scripts/gds/provision-teardown.js +5 -105
  961. package/scripts/gds/provision-units.js +5 -468
  962. package/scripts/gds/provision.js +5 -1477
  963. package/scripts/gds/publish-credential-check.js +6 -65
  964. package/scripts/gds/publish-integration-gate.js +5 -140
  965. package/scripts/gds/publish-manifest.js +5 -437
  966. package/scripts/gds/publish-watch.js +5 -266
  967. package/scripts/gds/pulse.js +6 -335
  968. package/scripts/gds/push-main.js +5 -54
  969. package/scripts/gds/push-path-brief.js +5 -98
  970. package/scripts/gds/read-session-export.js +5 -357
  971. package/scripts/gds/reauth.js +6 -154
  972. package/scripts/gds/recall.js +6 -182
  973. package/scripts/gds/redteam-patrol.js +5 -435
  974. package/scripts/gds/regen-instance-docs.js +5 -45
  975. package/scripts/gds/release-core.js +5 -78
  976. package/scripts/gds/release-notes.js +5 -270
  977. package/scripts/gds/release.js +6 -138
  978. package/scripts/gds/rename-history-check.js +5 -367
  979. package/scripts/gds/rename-ledger-prose.js +5 -480
  980. package/scripts/gds/render-api.js +5 -196
  981. package/scripts/gds/render-check.js +5 -204
  982. package/scripts/gds/render-ideas.js +6 -225
  983. package/scripts/gds/render-payload.js +5 -84
  984. package/scripts/gds/repo-metrics.js +6 -362
  985. package/scripts/gds/review-sheet.js +5 -106
  986. package/scripts/gds/role-pack-guard.js +5 -141
  987. package/scripts/gds/route-shadow-guard.js +5 -173
  988. package/scripts/gds/routine-schedule.js +5 -281
  989. package/scripts/gds/run-routine.js +5 -255
  990. package/scripts/gds/run-unit-tests.js +6 -659
  991. package/scripts/gds/runner-drift.js +5 -149
  992. package/scripts/gds/sandbox-stage.js +6 -458
  993. package/scripts/gds/scope-map-guard.js +5 -299
  994. package/scripts/gds/scope-roster-guard.js +5 -117
  995. package/scripts/gds/seam-wiring-guard.js +5 -274
  996. package/scripts/gds/search-ingest-db.js +6 -287
  997. package/scripts/gds/search-ingest-md.js +6 -268
  998. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  999. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1000. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1001. package/scripts/gds/seed-staging.sh +7 -116
  1002. package/scripts/gds/seed-verify-criteria.js +6 -124
  1003. package/scripts/gds/sequence.js +6 -596
  1004. package/scripts/gds/session-cost.js +6 -429
  1005. package/scripts/gds/session-digest-build.js +6 -293
  1006. package/scripts/gds/session-digest.js +6 -199
  1007. package/scripts/gds/session-eval.js +6 -630
  1008. package/scripts/gds/session-transcript-build.js +6 -155
  1009. package/scripts/gds/session-transcript-upload.js +6 -29
  1010. package/scripts/gds/session.js +6 -403
  1011. package/scripts/gds/setup.js +6 -645
  1012. package/scripts/gds/ship-check.js +5 -85
  1013. package/scripts/gds/ship-deploy-target.js +5 -392
  1014. package/scripts/gds/ship-escalation.js +5 -166
  1015. package/scripts/gds/ship-finish.js +5 -419
  1016. package/scripts/gds/ship-flow.js +5 -1216
  1017. package/scripts/gds/ship-git.js +5 -99
  1018. package/scripts/gds/ship-grade-steps.js +5 -546
  1019. package/scripts/gds/ship-grade.js +5 -425
  1020. package/scripts/gds/ship-honesty.js +5 -312
  1021. package/scripts/gds/ship-io.js +5 -138
  1022. package/scripts/gds/ship-land.js +5 -1129
  1023. package/scripts/gds/ship-memory-sync.js +5 -248
  1024. package/scripts/gds/ship-merge-gate.js +5 -224
  1025. package/scripts/gds/ship-merge.js +5 -465
  1026. package/scripts/gds/ship-mode-ask.js +5 -137
  1027. package/scripts/gds/ship-mode-manual.js +5 -53
  1028. package/scripts/gds/ship-preflight-steps.js +5 -398
  1029. package/scripts/gds/ship-regen.js +5 -313
  1030. package/scripts/gds/ship-resume.js +5 -200
  1031. package/scripts/gds/ship-session-upload.js +5 -312
  1032. package/scripts/gds/ship-state.js +5 -109
  1033. package/scripts/gds/ship-surprise.js +5 -83
  1034. package/scripts/gds/ship-visual.js +5 -74
  1035. package/scripts/gds/ship.js +5 -380
  1036. package/scripts/gds/shipping-mode.js +5 -69
  1037. package/scripts/gds/skill-lint.js +5 -248
  1038. package/scripts/gds/skill-preflight.js +5 -359
  1039. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1040. package/scripts/gds/smoke-batch-release.sh +7 -315
  1041. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1042. package/scripts/gds/smoke-dependencies.sh +7 -142
  1043. package/scripts/gds/smoke-gds.js +6 -255
  1044. package/scripts/gds/smoke-write.sh +7 -274
  1045. package/scripts/gds/source-text-test-scan.js +7 -0
  1046. package/scripts/gds/spark.js +6 -293
  1047. package/scripts/gds/stale-worktrees.js +5 -210
  1048. package/scripts/gds/start-goals.js +5 -101
  1049. package/scripts/gds/start.js +6 -1089
  1050. package/scripts/gds/status.js +6 -544
  1051. package/scripts/gds/strand-watch.js +5 -313
  1052. package/scripts/gds/stranded-rows.js +5 -198
  1053. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1054. package/scripts/gds/surface.js +5 -100
  1055. package/scripts/gds/task.js +6 -272
  1056. package/scripts/gds/test-path-guard.js +5 -97
  1057. package/scripts/gds/triage.js +6 -741
  1058. package/scripts/gds/turn-end-sound.js +5 -72
  1059. package/scripts/gds/tweak-halt.js +5 -68
  1060. package/scripts/gds/tweak-renders.js +5 -198
  1061. package/scripts/gds/uat.js +6 -119
  1062. package/scripts/gds/ui-kit-transform.js +5 -41
  1063. package/scripts/gds/update-channel.js +5 -510
  1064. package/scripts/gds/update-sweep.js +5 -827
  1065. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1066. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1067. package/scripts/gds/upgrade-migrate.js +5 -223
  1068. package/scripts/gds/upgrade-operator.js +6 -73
  1069. package/scripts/gds/upgrade-outcome.js +5 -173
  1070. package/scripts/gds/upgrade.js +5 -1497
  1071. package/scripts/gds/validate-design.js +5 -10
  1072. package/scripts/gds/version-close.js +6 -620
  1073. package/scripts/gds/version-literal-guard.js +5 -138
  1074. package/scripts/gds/version-select.js +5 -77
  1075. package/scripts/gds/visual-review-nudge.js +5 -38
  1076. package/scripts/gds/wedge-remedy.js +5 -173
  1077. package/scripts/gds/worktree-claim-guard.js +5 -129
  1078. package/scripts/gds/worktree.js +6 -448
  1079. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1080. package/scripts/hall-preview/server.js +2 -2
  1081. package/scripts/migrate.sh +3 -3
  1082. package/scripts/public-mirror-export.js +3 -3
  1083. package/scripts/security/dep-audit.js +50 -124
  1084. package/scripts/setup-builder.js +7 -7
  1085. package/src/bongos/api-errors.js +1 -0
  1086. package/src/bongos/api-prefix.js +1 -1
  1087. package/src/bongos/auth-github.js +19 -3
  1088. package/src/bongos/auth-idp.js +7 -0
  1089. package/src/bongos/claim-attribution.js +2 -2
  1090. package/src/bongos/core-moves.js +1 -1
  1091. package/src/bongos/core-update.js +3 -3
  1092. package/src/bongos/craft-mode.js +2 -2
  1093. package/src/bongos/db-kernel.js +15 -3
  1094. package/src/bongos/db.js +30 -4
  1095. package/src/bongos/github-repos.js +1 -1
  1096. package/src/bongos/llm-cache.js +1 -1
  1097. package/src/bongos/llm-pricing.js +1 -1
  1098. package/src/bongos/metrics.js +1 -1
  1099. package/src/bongos/middleware/rate-limit.js +2 -2
  1100. package/src/bongos/module-listing.js +93 -1
  1101. package/src/bongos/module-scope-map.js +90 -85
  1102. package/src/bongos/module-store.js +1 -1
  1103. package/src/bongos/module-submissions.js +1 -1
  1104. package/src/bongos/optimizer.js +1 -1
  1105. package/src/bongos/package-registry.js +1 -1
  1106. package/src/bongos/path-match.js +1 -1
  1107. package/src/bongos/permission-path-check.js +3 -3
  1108. package/src/bongos/platform-visibility-gate.js +3 -5
  1109. package/src/bongos/prelaunch-gate.js +7 -6
  1110. package/src/bongos/route-rank-check.js +2 -2
  1111. package/src/bongos/routes/auth.js +15 -2
  1112. package/src/bongos/routes/backup.js +1 -1
  1113. package/src/bongos/routes/builders.js +29 -1
  1114. package/src/bongos/routes/me.js +49 -18
  1115. package/src/bongos/routes/modules.js +29 -9
  1116. package/src/bongos/routes/public.js +3 -72
  1117. package/src/bongos/schema-lag.js +1 -1
  1118. package/src/bongos/sensitive-surfaces.js +1 -1
  1119. package/src/bongos/serve-internal.js +65 -16
  1120. package/src/bongos/software-update.js +2 -2
  1121. package/src/bongos/upgrade-hold.js +3 -3
  1122. package/src/hall-look.js +6 -5
  1123. package/src/module-api.js +3 -3
  1124. package/src/module-loader/catalog.js +1 -1
  1125. package/src/module-loader/error-tally.js +3 -3
  1126. package/src/module-loader/manifest-schema.js +3 -3
  1127. package/src/platform-server.js +10 -0
  1128. package/src/role-responsibilities.js +1 -1
  1129. package/src/stale-timer.js +2 -2
  1130. package/tests/accessibility_replay.mjs +1 -1
  1131. package/tests/activity_rollup_order_db.mjs +1 -1
  1132. package/tests/activity_snapshots_db.mjs +1 -1
  1133. package/tests/adopt_detect.mjs +1 -1
  1134. package/tests/adopt_import.mjs +1 -1
  1135. package/tests/adopt_preflight.mjs +1 -1
  1136. package/tests/adr_0089_scope.mjs +10 -7
  1137. package/tests/adr_0162_citation.mjs +1 -1
  1138. package/tests/adr_0162_gate_citation.mjs +1 -1
  1139. package/tests/agent_invoke.mjs +1 -1
  1140. package/tests/agent_invoke_live.mjs +3 -3
  1141. package/tests/agents_cron_trigger.mjs +2 -2
  1142. package/tests/agents_roster.mjs +1 -1
  1143. package/tests/agents_sync.mjs +4 -4
  1144. package/tests/allow_rule_guard.mjs +20 -20
  1145. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1146. package/tests/api_alias_exceptions.mjs +7 -6
  1147. package/tests/api_artifacts.mjs +214 -0
  1148. package/tests/api_cli_flags.mjs +3 -3
  1149. package/tests/api_client.mjs +56 -54
  1150. package/tests/api_docs.mjs +30 -9
  1151. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1152. package/tests/api_msys_path_repair.mjs +2 -2
  1153. package/tests/architect.mjs +1 -1
  1154. package/tests/art_stage.mjs +2 -2
  1155. package/tests/artifact_audit.mjs +2 -2
  1156. package/tests/atlas.mjs +1 -1
  1157. package/tests/audit_deps.mjs +1 -1
  1158. package/tests/audit_gate.mjs +1 -1
  1159. package/tests/auth_flow_slice1.mjs +3 -3
  1160. package/tests/auth_inactive_builder.mjs +43 -5
  1161. package/tests/auth_session_expiry_db.mjs +16 -4
  1162. package/tests/auth_session_ttl.mjs +23 -0
  1163. package/tests/authorship_audit.mjs +2 -2
  1164. package/tests/autobongos_cadence.mjs +1 -1
  1165. package/tests/autobongos_fence.mjs +1 -1
  1166. package/tests/autobongos_grade_cap.mjs +2 -2
  1167. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1168. package/tests/autobongos_host_access.mjs +3 -3
  1169. package/tests/autobongos_loop.mjs +17 -17
  1170. package/tests/autobongos_service_ps1.mjs +3 -3
  1171. package/tests/autobongos_tweak_lane.mjs +2 -2
  1172. package/tests/autobongos_verify.mjs +2 -2
  1173. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1174. package/tests/autonomy_config_idle.mjs +1 -1
  1175. package/tests/autonomy_daily_checks.mjs +201 -0
  1176. package/tests/autonomy_digest.mjs +1 -1
  1177. package/tests/autonomy_gate.mjs +1 -1
  1178. package/tests/autonomy_gauge.mjs +2 -2
  1179. package/tests/autonomy_runner_identity.mjs +1 -1
  1180. package/tests/backfill_sessions.mjs +8 -8
  1181. package/tests/backfill_subagent_rewards.mjs +1 -1
  1182. package/tests/backfill_task_rewards.mjs +2 -2
  1183. package/tests/backlog_review.mjs +3 -3
  1184. package/tests/baseline_staleness.mjs +2 -2
  1185. package/tests/bfg.mjs +11 -5
  1186. package/tests/bfg_write.mjs +20 -11
  1187. package/tests/blockers_hall.mjs +14 -4
  1188. package/tests/blockers_page_ui.mjs +56 -12
  1189. package/tests/bongos_dispatch.mjs +5 -5
  1190. package/tests/bongos_login.mjs +2 -2
  1191. package/tests/bug_attachment_audit.mjs +1 -1
  1192. package/tests/bug_attachment_recover.mjs +2 -2
  1193. package/tests/bug_triage.mjs +3 -3
  1194. package/tests/build_info.mjs +1 -1
  1195. package/tests/builder_tester_tag.mjs +184 -0
  1196. package/tests/bump_version.mjs +3 -3
  1197. package/tests/canonical_profile_url.mjs +1 -1
  1198. package/tests/capture_error_format.mjs +1 -1
  1199. package/tests/capture_goal_routing.mjs +2 -2
  1200. package/tests/category_advisory_guard.mjs +3 -3
  1201. package/tests/claim_error_surface.mjs +2 -2
  1202. package/tests/claim_from_task_and_home.mjs +1 -1
  1203. package/tests/claim_gate_open_blocker.mjs +7 -4
  1204. package/tests/claim_gate_rebase.mjs +12 -8
  1205. package/tests/claim_recall.mjs +4 -4
  1206. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1207. package/tests/claude_materialize.mjs +68 -68
  1208. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1209. package/tests/cli_allowlist_permissions.mjs +11 -11
  1210. package/tests/cli_dispatcher.mjs +2 -2
  1211. package/tests/cli_err_code.mjs +6 -6
  1212. package/tests/cli_exit_no_abort.mjs +7 -7
  1213. package/tests/cli_lib_formatters.mjs +2 -2
  1214. package/tests/cli_sessions.mjs +5 -5
  1215. package/tests/cli_surface.mjs +15 -15
  1216. package/tests/cli_token_reissue.mjs +2 -2
  1217. package/tests/client_baseurl_guard.mjs +1 -1
  1218. package/tests/client_bundle_route.mjs +35 -4
  1219. package/tests/cloud_bongos_pack.mjs +1 -1
  1220. package/tests/community_leaderboard_db.mjs +1 -1
  1221. package/tests/conductor.mjs +18 -18
  1222. package/tests/conflict_resolve.mjs +14 -16
  1223. package/tests/consumer_layout_boot.mjs +12 -12
  1224. package/tests/context_pack.mjs +6 -6
  1225. package/tests/control_manifest.mjs +4 -4
  1226. package/tests/copy_desk_page_reads.mjs +1 -1
  1227. package/tests/copy_desk_page_release.mjs +192 -0
  1228. package/tests/copy_inventory.mjs +2 -2
  1229. package/tests/core_auto_upgrade.mjs +1 -1
  1230. package/tests/core_move_notice.mjs +2 -2
  1231. package/tests/core_origin_follow.mjs +7 -7
  1232. package/tests/core_pin_sync.mjs +3 -3
  1233. package/tests/core_upgrade_door.mjs +2 -2
  1234. package/tests/core_upgrade_owner_door.mjs +34 -1
  1235. package/tests/core_upgrade_runner.mjs +19 -19
  1236. package/tests/credential_presence.mjs +2 -2
  1237. package/tests/credit_grant.mjs +3 -3
  1238. package/tests/credit_log_single_writer.mjs +5 -5
  1239. package/tests/criterion_ref_status.mjs +2 -2
  1240. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1241. package/tests/cutover_codemod.mjs +2 -4
  1242. package/tests/db_backup_nightly.mjs +1 -1
  1243. package/tests/db_backup_offsite.mjs +1 -1
  1244. package/tests/db_ownership_handover.mjs +2 -2
  1245. package/tests/dead_deps.mjs +3 -3
  1246. package/tests/dependency_advisory.mjs +1 -1
  1247. package/tests/deploy_audit_gate.mjs +4 -4
  1248. package/tests/deploy_divergence_line.mjs +36 -16
  1249. package/tests/deploy_page_projects.mjs +35 -4
  1250. package/tests/dev_lib.mjs +2 -2
  1251. package/tests/dev_windows.mjs +2 -2
  1252. package/tests/diagram_facts_offset.mjs +1 -1
  1253. package/tests/diagram_repo_slug.mjs +1 -1
  1254. package/tests/diff_derived_signals.mjs +2 -2
  1255. package/tests/dns_preflight.mjs +2 -2
  1256. package/tests/do_api.mjs +3 -3
  1257. package/tests/doc_cli_guard.mjs +28 -28
  1258. package/tests/doc_comment_coverage.mjs +1 -1
  1259. package/tests/doc_control_claims.mjs +11 -11
  1260. package/tests/docs_entropy.mjs +2 -2
  1261. package/tests/docs_openapi_route.mjs +8 -6
  1262. package/tests/doctor_hooks.mjs +1 -1
  1263. package/tests/edit_hints.mjs +3 -2
  1264. package/tests/effective_visibility_predicate.mjs +1 -19
  1265. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1266. package/tests/exec_path_guard.mjs +4 -4
  1267. package/tests/executed_closure.mjs +18 -12
  1268. package/tests/file_map.mjs +1 -1
  1269. package/tests/find_untested.mjs +13 -13
  1270. package/tests/first_admin_bootstrap.mjs +1 -1
  1271. package/tests/fitness.mjs +16 -16
  1272. package/tests/fitness_gds_ratchet.mjs +2 -2
  1273. package/tests/fitness_installed_core.mjs +3 -3
  1274. package/tests/fitness_no_raw_nul.mjs +1 -1
  1275. package/tests/fitness_ratchets.mjs +3 -3
  1276. package/tests/fitness_scope_roster.mjs +2 -2
  1277. package/tests/fitness_two_root.mjs +8 -8
  1278. package/tests/fixtures/accessibility-replay.json +5 -5
  1279. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1280. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1281. package/tests/fixtures/page-ledger.mjs +22 -0
  1282. package/tests/fixtures/session-506-digest.json +5 -5
  1283. package/tests/gate_approvals.mjs +50 -0
  1284. package/tests/gate_review.mjs +8 -8
  1285. package/tests/gating_review_retired.mjs +2 -2
  1286. package/tests/gen_freshness.mjs +3 -3
  1287. package/tests/git_guard.mjs +3 -3
  1288. package/tests/git_merge_regen.mjs +41 -65
  1289. package/tests/github_one_trip.mjs +4 -4
  1290. package/tests/github_pick_up.mjs +2 -2
  1291. package/tests/github_push_merge_driver.mjs +1 -1
  1292. package/tests/go_live.mjs +3 -2
  1293. package/tests/goal_category.mjs +1 -1
  1294. package/tests/goal_cli.mjs +2 -2
  1295. package/tests/goal_create_spec_entry.mjs +1 -1
  1296. package/tests/goal_invite_consent.mjs +3 -1
  1297. package/tests/goal_move.mjs +1 -1
  1298. package/tests/goal_working_area.mjs +1 -1
  1299. package/tests/government_agent_asks.mjs +7 -7
  1300. package/tests/government_board_room_copy.mjs +6 -1
  1301. package/tests/government_board_view.mjs +39 -0
  1302. package/tests/government_board_vote_ui.mjs +39 -1
  1303. package/tests/government_config.mjs +2 -2
  1304. package/tests/government_live_proof_shape.mjs +1 -1
  1305. package/tests/government_protected_surfaces.mjs +54 -53
  1306. package/tests/government_require_permission.mjs +9 -1
  1307. package/tests/government_vanilla_boot.mjs +1 -1
  1308. package/tests/government_vocabulary.mjs +2 -2
  1309. package/tests/government_walk.mjs +2 -2
  1310. package/tests/grade_body_limit.mjs +6 -4
  1311. package/tests/grade_correlation_audit.mjs +3 -3
  1312. package/tests/grade_diff_hash.mjs +1 -1
  1313. package/tests/grade_engine_replay.mjs +2 -2
  1314. package/tests/grade_server_authoritative.mjs +1 -1
  1315. package/tests/grade_unavailable_display.mjs +1 -1
  1316. package/tests/grader.mjs +8 -24
  1317. package/tests/grader_generated_provenance.mjs +14 -14
  1318. package/tests/grader_no_artifact.mjs +1 -1
  1319. package/tests/grader_prompt_fencing.mjs +1 -1
  1320. package/tests/grader_quality_window_overflow.mjs +1 -1
  1321. package/tests/grader_reader_lens.mjs +3 -3
  1322. package/tests/grader_regrade_delta.mjs +1 -1
  1323. package/tests/grader_unbacked_score.mjs +2 -2
  1324. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1325. package/tests/hall_asset_cache.mjs +127 -0
  1326. package/tests/hall_audit.mjs +63 -0
  1327. package/tests/hall_board_world.mjs +20 -0
  1328. package/tests/hall_city_card_words.mjs +61 -0
  1329. package/tests/hall_client_request_shape.mjs +5 -1
  1330. package/tests/hall_home_ships_bounded.mjs +160 -0
  1331. package/tests/hall_landing_boot.mjs +15 -2
  1332. package/tests/hall_nav.mjs +33 -0
  1333. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1334. package/tests/hall_oversight_world.mjs +44 -4
  1335. package/tests/hall_palette.mjs +12 -9
  1336. package/tests/hall_preview_security.mjs +1 -1
  1337. package/tests/hall_profile_world.mjs +17 -0
  1338. package/tests/hall_reading_world.mjs +16 -1
  1339. package/tests/hall_roster_world.mjs +2 -1
  1340. package/tests/hall_studio_world.mjs +4 -1
  1341. package/tests/hall_work_history_id.mjs +39 -0
  1342. package/tests/held_tweak_reporting.mjs +4 -4
  1343. package/tests/helpers.mjs +3 -3
  1344. package/tests/home_bounded_reads.mjs +1 -1
  1345. package/tests/home_isolation_guard.mjs +1 -1
  1346. package/tests/hook_core_resolve.mjs +7 -7
  1347. package/tests/hook_user_agents.mjs +1 -1
  1348. package/tests/hooks_drain.mjs +2 -2
  1349. package/tests/host_topology_skips.mjs +1 -1
  1350. package/tests/howto_guide.mjs +1 -1
  1351. package/tests/howto_moments.mjs +3 -3
  1352. package/tests/hub_account_page.mjs +1 -1
  1353. package/tests/idea_capture_grades.mjs +2 -2
  1354. package/tests/idea_develop_spark.mjs +1 -1
  1355. package/tests/idea_filed_via.mjs +2 -2
  1356. package/tests/idea_ideate_full.mjs +1 -1
  1357. package/tests/idea_spark_mark.mjs +1 -1
  1358. package/tests/idea_spark_queue.mjs +1 -1
  1359. package/tests/idea_triage.mjs +1 -1
  1360. package/tests/idea_triage_grade.mjs +3 -3
  1361. package/tests/idea_vote_permission.mjs +113 -0
  1362. package/tests/idea_votes_fold_db.mjs +123 -0
  1363. package/tests/infra_exec_paths.mjs +12 -12
  1364. package/tests/init.mjs +2 -2
  1365. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1366. package/tests/instance_feedback.mjs +9 -9
  1367. package/tests/instance_mismatch_guard.mjs +2 -2
  1368. package/tests/integration_parked_ratchet.mjs +24 -2
  1369. package/tests/intent_retry.mjs +1 -1
  1370. package/tests/interaction_posture.mjs +3 -3
  1371. package/tests/invite_expiry_db.mjs +1 -1
  1372. package/tests/joinability_invite_only.mjs +1 -1
  1373. package/tests/karma_vote_lists.mjs +270 -0
  1374. package/tests/key-card.mjs +2 -2
  1375. package/tests/key-status.mjs +2 -2
  1376. package/tests/knip_ratchet_ambient.mjs +2 -2
  1377. package/tests/known_failing_ratchet.mjs +1 -1
  1378. package/tests/land_watch.mjs +2 -2
  1379. package/tests/landing_legal_pages.mjs +1 -1
  1380. package/tests/landing_page.mjs +2 -2
  1381. package/tests/leaderboard_roles.mjs +4 -1
  1382. package/tests/leak_scan_allowlist.mjs +8 -8
  1383. package/tests/leak_scan_fail_closed.mjs +1 -1
  1384. package/tests/lib_sh_resolution.mjs +9 -9
  1385. package/tests/lifecycle-card.mjs +7 -7
  1386. package/tests/linkify_check.mjs +2 -2
  1387. package/tests/linkify_refs.mjs +1 -1
  1388. package/tests/llm-cache-route.mjs +1 -1
  1389. package/tests/local_preview.mjs +2 -2
  1390. package/tests/main_audit.mjs +3 -3
  1391. package/tests/main_audit_attestation.mjs +1 -1
  1392. package/tests/main_audit_db_roster.mjs +2 -2
  1393. package/tests/main_worktree_busy_reason.mjs +3 -3
  1394. package/tests/markdown_line_endings.mjs +2 -2
  1395. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1396. package/tests/membership_kind_lockstep.mjs +1 -1
  1397. package/tests/memory_isolation.mjs +16 -8
  1398. package/tests/memory_map.mjs +2 -2
  1399. package/tests/memory_pull.mjs +33 -25
  1400. package/tests/merge_driver_register.mjs +3 -3
  1401. package/tests/migration_allocation.mjs +2 -2
  1402. package/tests/migration_namespace.mjs +1 -1
  1403. package/tests/migrations_forward_safe.mjs +1 -1
  1404. package/tests/mingle.mjs +1 -1
  1405. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1406. package/tests/mirror_lineage_proof.mjs +2 -2
  1407. package/tests/mirror_redact.mjs +4 -4
  1408. package/tests/missing_dep_classify.mjs +3 -3
  1409. package/tests/module-scope-map.mjs +22 -22
  1410. package/tests/module_api_lazy.mjs +1 -1
  1411. package/tests/module_assess_docs.mjs +2 -2
  1412. package/tests/module_assess_installs.mjs +3 -3
  1413. package/tests/module_assess_price_parity.mjs +5 -5
  1414. package/tests/module_assess_score.mjs +5 -5
  1415. package/tests/module_assess_security.mjs +4 -4
  1416. package/tests/module_assess_tests.mjs +3 -3
  1417. package/tests/module_assessments_migration.mjs +1 -1
  1418. package/tests/module_catalog.mjs +2 -2
  1419. package/tests/module_cli.mjs +3 -3
  1420. package/tests/module_entitlements.mjs +1 -1
  1421. package/tests/module_error_counts.mjs +1 -1
  1422. package/tests/module_install.mjs +4 -4
  1423. package/tests/module_loader.mjs +3 -1
  1424. package/tests/module_owned_tests.mjs +1 -1
  1425. package/tests/module_release_channels.mjs +1 -1
  1426. package/tests/module_store_howto.mjs +3 -3
  1427. package/tests/module_store_listing.mjs +139 -2
  1428. package/tests/module_store_publish.mjs +4 -4
  1429. package/tests/module_store_publish_route.mjs +1 -1
  1430. package/tests/module_store_reassess.mjs +1 -1
  1431. package/tests/module_store_registry_migration.mjs +1 -1
  1432. package/tests/module_test_runner.mjs +3 -3
  1433. package/tests/module_update.mjs +4 -4
  1434. package/tests/module_upgrade_updates.mjs +1 -1
  1435. package/tests/move_escalation.mjs +2 -2
  1436. package/tests/nav_permission_atoms.mjs +3 -2
  1437. package/tests/needs_rebase.mjs +7 -3
  1438. package/tests/newcomer_floor.mjs +1 -1
  1439. package/tests/next_number.mjs +1 -1
  1440. package/tests/no_artifact_escalation.mjs +3 -3
  1441. package/tests/npm_release_where.mjs +1 -1
  1442. package/tests/oauth_secret.mjs +2 -2
  1443. package/tests/onboard.mjs +6 -6
  1444. package/tests/onboarding_gate.mjs +2 -2
  1445. package/tests/opt_in_skill_modules.mjs +3 -3
  1446. package/tests/own_scope_guard.mjs +1 -1
  1447. package/tests/own_session_revoke.mjs +4 -1
  1448. package/tests/package_core.mjs +10 -11
  1449. package/tests/page_inventory.mjs +5 -5
  1450. package/tests/page_reader.mjs +7 -7
  1451. package/tests/page_tweak_hold.mjs +6 -6
  1452. package/tests/parallel-load.mjs +1 -1
  1453. package/tests/paste_token_api_base.mjs +1 -1
  1454. package/tests/paste_token_session_store.mjs +2 -2
  1455. package/tests/pending_invite_purge_db.mjs +1 -1
  1456. package/tests/permission_path.mjs +1 -1
  1457. package/tests/pin_replay.mjs +1 -1
  1458. package/tests/pin_write_key.mjs +7 -7
  1459. package/tests/plain_cards.mjs +15 -15
  1460. package/tests/pr_assign.mjs +1 -1
  1461. package/tests/pre_push_hook.mjs +3 -3
  1462. package/tests/preflight_checks.mjs +2 -2
  1463. package/tests/prelaunch_gate.mjs +1 -1
  1464. package/tests/privacy_matrix.mjs +1 -1
  1465. package/tests/probe_cache.mjs +6 -6
  1466. package/tests/profile_connections_ui.mjs +4 -3
  1467. package/tests/profile_fields.mjs +11 -1
  1468. package/tests/profile_privacy_owner_view.mjs +1 -1
  1469. package/tests/profile_role_headline.mjs +10 -9
  1470. package/tests/project_admin_console_model.mjs +1 -1
  1471. package/tests/projects_hub.mjs +1 -1
  1472. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1473. package/tests/promote_goal_id.mjs +6 -6
  1474. package/tests/promotion_sweep.mjs +1 -1
  1475. package/tests/provision.mjs +24 -24
  1476. package/tests/provision_account_identity.mjs +2 -2
  1477. package/tests/provision_byo_host.mjs +1 -1
  1478. package/tests/provision_caddy_wiring.mjs +2 -2
  1479. package/tests/provision_disconnect.mjs +2 -2
  1480. package/tests/provision_dns_first.mjs +1 -1
  1481. package/tests/provision_render.mjs +9 -9
  1482. package/tests/provision_repo_private.mjs +3 -3
  1483. package/tests/provision_resource_caps.mjs +5 -5
  1484. package/tests/provision_restart.mjs +3 -3
  1485. package/tests/provision_settings_apply.mjs +7 -7
  1486. package/tests/provision_teardown_address.mjs +2 -2
  1487. package/tests/provisioning_capacity.mjs +5 -5
  1488. package/tests/provisioning_credential_preflight.mjs +1 -1
  1489. package/tests/provisioning_disconnect.mjs +1 -1
  1490. package/tests/provisioning_error_note_scope.mjs +4 -4
  1491. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1492. package/tests/provisioning_planet_physics.mjs +16 -0
  1493. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1494. package/tests/provisioning_settings_env.mjs +1 -1
  1495. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1496. package/tests/public_mirror_export.mjs +1 -1
  1497. package/tests/publish_integration_gate.mjs +2 -2
  1498. package/tests/publish_manifest.mjs +6 -6
  1499. package/tests/publish_watch.mjs +1 -1
  1500. package/tests/push_path_brief.mjs +2 -2
  1501. package/tests/raise.mjs +248 -0
  1502. package/tests/rank_roles_audit.mjs +1 -1
  1503. package/tests/rank_tier_single_source.mjs +2 -2
  1504. package/tests/rate_limit_public.mjs +1 -1
  1505. package/tests/read_default_meter.mjs +2 -2
  1506. package/tests/read_session_export.mjs +1 -1
  1507. package/tests/rebase_gate_set_aside.mjs +1 -1
  1508. package/tests/recall_cli.mjs +1 -1
  1509. package/tests/recall_corpus_health.mjs +3 -2
  1510. package/tests/recall_hints.mjs +1 -1
  1511. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1512. package/tests/redteam_patrol.mjs +2 -2
  1513. package/tests/regrade_actual_minutes.mjs +2 -2
  1514. package/tests/regrade_eligibility.mjs +2 -2
  1515. package/tests/release_core.mjs +2 -2
  1516. package/tests/release_notes.mjs +4 -4
  1517. package/tests/rename_history_restraint.mjs +3 -3
  1518. package/tests/rename_ledger_prose.mjs +6 -6
  1519. package/tests/render_api.mjs +1 -1
  1520. package/tests/render_check.mjs +4 -4
  1521. package/tests/render_deploy.mjs +1 -1
  1522. package/tests/repo_info_binding.mjs +1 -1
  1523. package/tests/repo_map.mjs +5 -5
  1524. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1525. package/tests/reward_mode_surfacing.mjs +1 -1
  1526. package/tests/role_responsibilities.mjs +1 -1
  1527. package/tests/route_permission_check.mjs +1 -1
  1528. package/tests/route_shadow_guard.mjs +1 -1
  1529. package/tests/route_validation.mjs +1 -1
  1530. package/tests/routine_capture_kind.mjs +24 -13
  1531. package/tests/routine_schedule.mjs +51 -9
  1532. package/tests/run_routine.mjs +5 -5
  1533. package/tests/run_routine_two_root.mjs +5 -5
  1534. package/tests/runner_drift.mjs +17 -17
  1535. package/tests/sandbox_stage.mjs +5 -5
  1536. package/tests/scope_map_guard.mjs +7 -7
  1537. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1538. package/tests/scripts_gds_forwarders.mjs +224 -0
  1539. package/tests/scrubber_corpus.mjs +2 -2
  1540. package/tests/seam_wiring_guard.mjs +1 -1
  1541. package/tests/search_ingest.mjs +2 -2
  1542. package/tests/search_ingest_db.mjs +1 -1
  1543. package/tests/search_ingest_nul.mjs +6 -6
  1544. package/tests/seed_verify_criteria.mjs +3 -3
  1545. package/tests/sequence.mjs +3 -3
  1546. package/tests/served_paths_shipped.mjs +3 -3
  1547. package/tests/session_506_regression.mjs +1 -1
  1548. package/tests/session_accessibility.mjs +1 -1
  1549. package/tests/session_caps.mjs +1 -1
  1550. package/tests/session_cost.mjs +1 -1
  1551. package/tests/session_digest.mjs +2 -2
  1552. package/tests/session_eval.mjs +6 -6
  1553. package/tests/session_index.mjs +1 -1
  1554. package/tests/session_records.mjs +4 -4
  1555. package/tests/session_rename_fallback.mjs +2 -2
  1556. package/tests/session_reward_on_land.mjs +7 -149
  1557. package/tests/session_reward_on_land_db.mjs +191 -0
  1558. package/tests/session_reward_reconcile.mjs +6 -88
  1559. package/tests/session_reward_reconcile_db.mjs +132 -0
  1560. package/tests/session_transcript.mjs +1 -1
  1561. package/tests/sessions_kit_pager.mjs +2 -1
  1562. package/tests/setup_device_flow_fallback.mjs +2 -2
  1563. package/tests/setup_smoke.mjs +12 -5
  1564. package/tests/setup_status_facts.mjs +54 -12
  1565. package/tests/ship_autolinkify.mjs +2 -2
  1566. package/tests/ship_automerge_injection.mjs +1 -1
  1567. package/tests/ship_base_flag.mjs +1 -1
  1568. package/tests/ship_broadcast_routing.mjs +1 -1
  1569. package/tests/ship_broadcast_server.mjs +2 -2
  1570. package/tests/ship_builder_model.mjs +1 -1
  1571. package/tests/ship_cannot_lie.mjs +9 -9
  1572. package/tests/ship_card.mjs +2 -2
  1573. package/tests/ship_ci_deploy.mjs +7 -7
  1574. package/tests/ship_error_shape.mjs +1 -1
  1575. package/tests/ship_land_ci_not_started.mjs +3 -3
  1576. package/tests/ship_land_conflict.mjs +3 -3
  1577. package/tests/ship_land_proof.mjs +3 -3
  1578. package/tests/ship_land_red_pr.mjs +5 -5
  1579. package/tests/ship_merge_gate.mjs +14 -14
  1580. package/tests/ship_mode.mjs +1 -1
  1581. package/tests/ship_mode_first_ship.mjs +4 -4
  1582. package/tests/ship_mode_hands_off.mjs +8 -8
  1583. package/tests/ship_post_land_verify.mjs +1 -1
  1584. package/tests/ship_preflight.mjs +19 -19
  1585. package/tests/ship_premerge.mjs +1 -1
  1586. package/tests/ship_publish_error.mjs +2 -2
  1587. package/tests/ship_push_diagnosis.mjs +1 -1
  1588. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1589. package/tests/ship_resume.mjs +4 -4
  1590. package/tests/ship_smoke_gate.mjs +1 -1
  1591. package/tests/ship_upload_skip.mjs +1 -1
  1592. package/tests/ship_upstream_deletion.mjs +1 -1
  1593. package/tests/ship_vendored_instance.mjs +8 -8
  1594. package/tests/ship_visual_regrade.mjs +3 -3
  1595. package/tests/ship_zero_commit.mjs +1 -1
  1596. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1597. package/tests/skill_friction_kind.mjs +1 -1
  1598. package/tests/skill_grade_recover.mjs +1 -1
  1599. package/tests/skill_grader_health.mjs +1 -1
  1600. package/tests/skill_lint.mjs +1 -1
  1601. package/tests/skill_menu_ruling.mjs +1 -1
  1602. package/tests/skill_preflight.mjs +7 -7
  1603. package/tests/skip_is_not_pass.mjs +22 -1
  1604. package/tests/smoke_dependencies_witness.mjs +2 -2
  1605. package/tests/smoke_preflight.mjs +1 -1
  1606. package/tests/smoke_target.mjs +2 -2
  1607. package/tests/smoke_write_contract.mjs +2 -2
  1608. package/tests/sound_player.mjs +8 -8
  1609. package/tests/source_text_test_ratchet.mjs +97 -0
  1610. package/tests/speciality_corpus_scope.mjs +1 -1
  1611. package/tests/speciality_session_skills.mjs +1 -1
  1612. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1613. package/tests/stale_timer.mjs +3 -3
  1614. package/tests/stale_worktrees.mjs +1 -1
  1615. package/tests/start_env_guard.mjs +1 -1
  1616. package/tests/start_goal_first.mjs +3 -3
  1617. package/tests/start_inbox_count.mjs +1 -1
  1618. package/tests/start_rebase_warning.mjs +1 -1
  1619. package/tests/status_default_version.mjs +3 -3
  1620. package/tests/status_mirror_sync.mjs +1 -1
  1621. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1622. package/tests/stop_refcheck.mjs +1 -1
  1623. package/tests/strand_watch.mjs +1 -1
  1624. package/tests/stranded_rows.mjs +1 -1
  1625. package/tests/stuck_detector.mjs +14 -14
  1626. package/tests/sweep_app_account.mjs +3 -3
  1627. package/tests/task_cli.mjs +2 -2
  1628. package/tests/task_detail_ui.mjs +11 -1
  1629. package/tests/task_discipline_required.mjs +2 -2
  1630. package/tests/task_list_paging.mjs +1 -1
  1631. package/tests/task_visual_slots.mjs +2 -2
  1632. package/tests/terms_acceptance.mjs +1 -1
  1633. package/tests/terms_grandfather_db.mjs +1 -1
  1634. package/tests/test_path_guard.mjs +1 -1
  1635. package/tests/triage_development.mjs +1 -1
  1636. package/tests/tweak_batch_apply.mjs +2 -2
  1637. package/tests/tweak_land_heal.mjs +3 -3
  1638. package/tests/tweak_unattended.mjs +3 -3
  1639. package/tests/ui_design_skills.mjs +2 -2
  1640. package/tests/unit_report_status.mjs +2 -2
  1641. package/tests/unit_runner_serial.mjs +2 -2
  1642. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1643. package/tests/update_channel.mjs +2 -2
  1644. package/tests/update_channel_db.mjs +4 -4
  1645. package/tests/update_subscription_engine.mjs +26 -26
  1646. package/tests/update_sweep_home.mjs +14 -14
  1647. package/tests/upgrade.mjs +11 -11
  1648. package/tests/upgrade_artist_gate.mjs +4 -4
  1649. package/tests/upgrade_commit_identity.mjs +2 -2
  1650. package/tests/upgrade_migrate.mjs +7 -7
  1651. package/tests/upgrade_operator.mjs +2 -2
  1652. package/tests/upgrade_outcome.mjs +2 -2
  1653. package/tests/upgrade_persist_pin.mjs +5 -5
  1654. package/tests/upkeep_home.mjs +1 -1
  1655. package/tests/version_close.mjs +2 -2
  1656. package/tests/version_close_cli.mjs +2 -2
  1657. package/tests/version_close_route.mjs +1 -1
  1658. package/tests/version_literals.mjs +23 -23
  1659. package/tests/visual_review.mjs +5 -5
  1660. package/tests/wedge_remedy.mjs +5 -5
  1661. package/tests/welcome_boot.mjs +116 -0
  1662. package/tests/welcome_boot_browser.mjs +271 -0
  1663. package/tests/wizard_born_first_board.mjs +3 -3
  1664. package/tests/wizard_demo.mjs +1 -1
  1665. package/tests/wizard_one_page.mjs +4 -3
  1666. package/tests/wizard_physics.mjs +3 -1
  1667. package/tests/wizard_physics_more.mjs +42 -3
  1668. package/tests/work_title_wrap.mjs +1 -1
  1669. package/tests/workflow_exec_paths.mjs +6 -6
  1670. package/tests/worktree_claim_guard.mjs +1 -1
  1671. package/tests/worktree_helper.mjs +2 -2
  1672. package/tests/write_validation_gaps.mjs +3 -3
  1673. package/scripts/gds/api.sh +0 -6
  1674. package/scripts/gds/artifact-staleness.js +0 -267
  1675. package/scripts/gds/audit-exports.js +0 -128
  1676. package/scripts/gds/classify-discipline.js +0 -153
  1677. package/scripts/gds/codemod-rename-src-gds.js +0 -145
  1678. package/scripts/gds/coreB-carve-proof.sh +0 -725
  1679. package/scripts/gds/goal-names.js +0 -102
  1680. package/scripts/gds/rename-goals.js +0 -109
  1681. package/scripts/gds/resolve-skill-model.js +0 -57
  1682. package/scripts/gds/security-baseline-check.sh +0 -180
  1683. package/scripts/gds/seed-adopt-tasks.js +0 -75
  1684. package/scripts/gds/seed-api-contract-goal-tasks.js +0 -141
  1685. package/scripts/gds/seed-board-room-tasks.js +0 -196
  1686. package/scripts/gds/seed-bongos-app-tasks.js +0 -294
  1687. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +0 -81
  1688. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +0 -100
  1689. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +0 -307
  1690. package/scripts/gds/seed-bongos-module-system-tasks.js +0 -346
  1691. package/scripts/gds/seed-bongos-tasks.js +0 -214
  1692. package/scripts/gds/seed-bongos-v1-seo-tasks.js +0 -104
  1693. package/scripts/gds/seed-bv1-community-tasks.js +0 -131
  1694. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +0 -133
  1695. package/scripts/gds/seed-bv1-profile-page-tasks.js +0 -161
  1696. package/scripts/gds/seed-bv1-r01-delta-tasks.js +0 -154
  1697. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +0 -277
  1698. package/scripts/gds/seed-gds-v4-tasks.js +0 -624
  1699. package/scripts/gds/seed-governance-tasks.js +0 -340
  1700. package/scripts/gds/seed-medusa-tasks.js +0 -440
  1701. package/scripts/gds/seed-module-upstreaming.js +0 -219
  1702. package/scripts/gds/seed-productization-tasks.js +0 -235
  1703. package/scripts/gds/seed-project-admin-console-tasks.js +0 -88
  1704. package/scripts/gds/seed-provisioning-tasks.js +0 -83
  1705. package/scripts/gds/seed-strict-versioning-tasks.js +0 -275
  1706. package/scripts/gds/seed-v2-world-tasks.js +0 -283
  1707. package/scripts/gds/spike-task-map.js +0 -899
  1708. package/scripts/migrate_cost_ledger.sh +0 -178
  1709. package/scripts/status-probe.mjs +0 -213
  1710. package/src/bongos/uptime-poller.js +0 -93
  1711. package/tests/artifact_staleness.mjs +0 -207
  1712. package/tests/goal_names.mjs +0 -120
  1713. package/tests/government_fold_bench.mjs +0 -50
  1714. package/tests/spike_task_map.mjs +0 -422
  1715. package/tests/status-probe.mjs +0 -89
  1716. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1717. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1718. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1719. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -0,0 +1,1217 @@
1
+ // scripts/bongos/ship-flow.js — the two entry flows — shipMain and regradeMain.
2
+ //
3
+ // Carved out of scripts/bongos/ship.js by task 1003205 (goal 1000079, the R03
4
+ // de-monolith plan) — a STRUCTURAL move, not a rewrite: the code below is the
5
+ // original ship.js lines 3478-4259 unchanged. ship.js remains the facade that
6
+ // re-exports every name and owns the CLI entry point, so the ship contract and
7
+ // every flag are untouched, and the other scripts that import from it are too.
8
+
9
+ 'use strict';
10
+
11
+ const { cliClient, requireSession, arg, detectWorktreeName, cardFlagsFromMe, apiCall, cliExit } = require('./cli-lib');
12
+ // task 1004630: the first ship asks for the ship mode once (ADR 0369).
13
+ const { runFirstShipAsk } = require('./ship-mode-ask.js');
14
+ const { resolveProse, markShipProgress, smokeGateMessages, proseFlagPresent, regradeNotesRefusal, staleSummaryNotice } = require('./ship-honesty.js');
15
+ const { plainCardLines } = require('./plain-cards.js');
16
+ const { classifyEmptyShip } = require('../../modules/lifecycle/ship-preflight');
17
+ const { isModuleKey, scopeForModule, moduleDriftFiles: computeModuleDrift } = require('../../src/bongos/module-scope-map');
18
+ const { runShipGate } = require('./sandbox-stage');
19
+ const { captureSurpriseLearning, promptSurprise } = require('./ship-surprise.js');
20
+ // task 1003109: the optional `--visual` leg of a ship (goal 1000072).
21
+ const shipVisual = require('./ship-visual.js');
22
+ const { gitOk } = require('./ship-git.js');
23
+ const { autoLinkifyChangedDocs, mergeMainIntoBranch, preflight, shipInputPaths } = require('./ship-preflight-steps.js');
24
+ const { applyBaseOverride, computeChangedFiles, computeGraderBaseline, runSmokeAsync } = require('./ship-grade.js');
25
+ const { buildPriorRoundContext, computeGradeResult, gradeAndRecord, printCreditsAndAchievements, printGradeOutcome } = require('./ship-grade-steps.js');
26
+ const { apiErrorLine, normalizeApiError, isUnknownFieldRejection } = require('./ship-io.js');
27
+ // task 1003205's carve left pushVia() used at regradeMain but never imported, so
28
+ // EVERY resume of a 'completed' task died with ReferenceError before resolving.
29
+ const { pushVia } = require('./ship-deploy-target.js');
30
+
31
+ const { diffstatFor, finishShip } = require('./ship-finish.js');
32
+ const tweakHold = require('../../modules/lifecycle/page-tweak-hold.js');
33
+ const { evaluateRegradeEligibility, evaluateResumeAction, resumeMerge, shouldConfirmWithoutGrade } = require('./ship-resume.js');
34
+ const { fileNoArtifactEscalation, noArtifactRefusalLines } = require('./ship-escalation.js');
35
+ const { noteServerReward } = require('./ship-state.js');
36
+ // task 1004536: each graded round lands in the autonomous run's ledger (inert
37
+ // without one), so ship.js can refuse a third grade at its entry point.
38
+ const { recordGradeOutcome } = require('./autobongos-grade-cap.js');
39
+ // task 1004631: on a Manual project an AI session asks before it ships (ADR 0369).
40
+ const manualShip = require('./ship-mode-manual.js');
41
+
42
+ // stopForManualApproval(args, taskId) — Manual ship mode (task 1004631, ADR 0369). Every path
43
+ // that can LAND work calls this first: a fresh ship, a resumed merge, and a re-grade (whose pass
44
+ // runs finishShip). When an AI session runs it on a Manual project without the person's yes, it
45
+ // prints the ask, exits 5 and returns true; the caller returns. A mode that cannot be read is
46
+ // Auto and never stops a ship. Who is stopped is ship-mode-manual.js's pure verdict.
47
+ async function stopForManualApproval(args, taskId) {
48
+ let shipMode = null;
49
+ try {
50
+ const r = await apiCall('GET', '/api/bongos/project-settings/ship-mode');
51
+ shipMode = r.ok ? r.data : null;
52
+ } catch (_) { shipMode = null; }
53
+ if (!manualShip.manualShipVerdict({ shipMode, args }).stop) return false;
54
+ for (const line of manualShip.manualAskLines(args, taskId)) console.log(line);
55
+ cliExit(manualShip.MANUAL_ASK_EXIT);
56
+ return true;
57
+ }
58
+
59
+ // ---------- Main flow ----------
60
+
61
+ async function shipMain() {
62
+ await requireSession();
63
+ const args = process.argv.slice(2);
64
+ const taskId = Number(args[0]);
65
+ if (!Number.isFinite(taskId)) {
66
+ console.error('usage: node scripts/bongos/ship.js <task-id> (--notes-file <path|-> | --notes "...") (--summary-file <path|-> | --summary "...") [--visual <image>] [--visual-alt "caption"] [--surprise "text" | --surprise none | --no-surprise] [--no-merge] [--db-only] [--verified] [--allow-empty] [--allow-smoke-fail] [--base <ref>] [--ship-mode auto|manual]');
67
+ console.error(' prefer the -file forms for prose: a shell command-substitutes backticks in an inline value before node sees it (learning 1000197).');
68
+ process.exit(2);
69
+ }
70
+ // G04: prose from a FILE or inline, never shell-mangled in silence.
71
+ const prose = resolveProse(args, ['notes', 'summary']);
72
+ const notes = prose.notes;
73
+ const summary = prose.summary;
74
+ const skipMerge = args.includes('--no-merge');
75
+ const force = args.includes('--force');
76
+ // task 391 (idea #37): a deliberate zero-commit / direct-SQL ship. Without it,
77
+ // a branch with no commits ahead of main is REFUSED (not silently shipped).
78
+ // task 1002422: --base <ref> also implies db-only — the work is already on main
79
+ // (that's the whole point of --base), so the merge leg has nothing to merge and
80
+ // advances straight to shipped. Unlike --allow-empty it does NOT skip the grade:
81
+ // the pinned baseline gives the grader a real diff (see resolveBaseRef / main).
82
+ const baseRefRaw = arg('--base', args);
83
+ const dbOnly = args.includes('--db-only') || args.includes('--allow-empty') || Boolean(baseRefRaw);
84
+ // task 1053 (F): explicit attestation that a verification task's verify
85
+ // actually passed. Required to confirm a kind='verify' task (the server
86
+ // enforces it too); a no-op for every other task.
87
+ const verified = args.includes('--verified');
88
+ // #853 (ADR 0041): `let` not `const` — when the server has the temporary
89
+ // global grader bypass ON (surfaced as me.grader_bypass below), we force the
90
+ // skip-grade/confirm path for everyone so no builder runs the subagent grader
91
+ // during a grader outage window.
92
+ let skipGrade = args.includes('--skip-grade');
93
+ // task 1365: explicit acknowledgement that this task legitimately has NO
94
+ // committed artifact (a pure DB-only / no-op task). Required for the
95
+ // empty-diff guard below to ALLOW an empty committed diff; without it, an
96
+ // empty diff is refused (it used to slip through under --skip-grade — the
97
+ // task-1363 phantom ship). Never overrides a dirty working tree.
98
+ const allowEmpty = args.includes('--allow-empty');
99
+ // task 1003950: set only when the empty-diff guard below classifies this ship as a
100
+ // deliberate no-artifact close. Gates the auto-escalation at the confirm wall.
101
+ let noArtifactClose = false;
102
+ // task 1004011: this ship has no committed diff, so the grade's subject is the
103
+ // builder's CLAIM (notes + value summary) rather than a diff. Distinct from
104
+ // noArtifactClose, which marks the older "reached the archon gate" case: a ship
105
+ // can now be no-artifact and still fully graded, which is the point.
106
+ let noArtifactGrade = false;
107
+ // task 1002605 (G-18): explicit opt-in to continue past a FAILED production
108
+ // smoke run. Without it a smoke FAIL now ABORTS before the claim resolves
109
+ // (claim intact); with it, the resolve proceeds and the task deliberately
110
+ // parks at 'completed' ungraded — and the ship says so instead of "Done."
111
+ const allowSmokeFail = args.includes('--allow-smoke-fail');
112
+ // Surprise flag handling — see captureSurpriseLearning(). Resolved below
113
+ // once we know which claim is being shipped (so touches[] can become tags).
114
+ const surpriseRaw = arg('--surprise', args);
115
+ const surpriseProvided = surpriseRaw !== null;
116
+ const noSurprise = args.includes('--no-surprise');
117
+
118
+ // task 1002422 (blocker 1000082): resolve + validate --base BEFORE any heavy
119
+ // work so a bad ref aborts with the claim STILL ACTIVE. On success it sets the
120
+ // module-level baseOverrideSha that computeGraderBaseline() reads, so the grader
121
+ // reads <base>...HEAD (a real diff) and the ship takes the rank-open graded path
122
+ // instead of the --allow-empty → skip-grade → Archon-only /confirm dead-end.
123
+ if (baseRefRaw) {
124
+ const res = applyBaseOverride(baseRefRaw);
125
+ if (!res.ok) {
126
+ console.error(`Ship aborted: ${res.reason}. No claim resolved, no credits awarded.`);
127
+ console.error('Omit --base and ship normally — the grader reviews ALL your commits and the merge lands them. Your claim is still active.');
128
+ process.exit(2);
129
+ }
130
+ console.log(`--base: grading ${res.sha.slice(0, 9)}...HEAD — the task's real committed diff (work already on main). Graded via the rank-open path; no --allow-empty needed.`);
131
+ }
132
+
133
+ // task 1003109: screen --visual BEFORE any heavy work, so bad input aborts with
134
+ // the claim STILL ACTIVE (the --base posture above). null when none was asked for.
135
+ const visual = shipVisual.fromArgs(args);
136
+
137
+ const me = noteServerReward(await (await cliClient()).me.getMe());
138
+ if (!me.ok) {
139
+ console.error('failed to load profile:', me.data);
140
+ process.exit(1);
141
+ }
142
+ // #853 (ADR 0041): honor the server-side global grader bypass. When ON, every
143
+ // builder lands work without the subagent grader (the /tasks/:id/confirm gate
144
+ // is relaxed to any-builder server-side to match). Default OFF.
145
+ if (me.data.grader_bypass && !skipGrade) {
146
+ skipGrade = true;
147
+ console.log('Note: GRADER_BYPASS_ENABLED is on server-side — skipping the subagent grader and confirming directly (temporary outage window).');
148
+ }
149
+ const claims = me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : []);
150
+ const ac = claims.find((c) => Number(c.task_id) === taskId);
151
+ if (!ac) {
152
+ // task 941 (V4.R03): no active claim in THIS session is NOT automatically a
153
+ // dead-end. The claim is consumed at resolve, so a ship that stalled AFTER it
154
+ // (grade fail → `completed`; merge/deploy fail → `confirmed`, the #1027 case)
155
+ // leaves no claim — but a plain re-run should RESUME the stalled leg, not
156
+ // strand the task. Route on the task's current status + ownership.
157
+ const tRes = await (await cliClient()).tasks.getTasksId({ id: taskId, query: { include: 'last_claim' } });
158
+ const task = tRes.ok ? tRes.data.task : null;
159
+ const lastClaim = tRes.ok ? (tRes.data.last_claim || null) : null;
160
+ const action = evaluateResumeAction({ task, lastClaim, builder: me.data.builder });
161
+ if (action.action === 'resume-grade') {
162
+ console.log(`Task #${taskId} is at 'completed' (grade stalled) and ${action.via === 'owner' ? 'you last held the claim' : 'you are an Archon'} — resuming the grade (no re-claim needed).`);
163
+ return regradeMain({ visual });
164
+ }
165
+ if (action.action === 'resume-merge') {
166
+ console.log(`Task #${taskId} is at 'confirmed' (merge/deploy stalled) and ${action.via === 'owner' ? 'you last held the claim' : 'you are an Archon'} — resuming the merge + deploy (no re-claim needed).`);
167
+ if (await stopForManualApproval(args, taskId)) return; // a resumed land is a ship too (task 1004631)
168
+ return resumeMerge(taskId, { summary, skipMerge, force, task, dbOnly });
169
+ }
170
+ if (action.action === 'done') {
171
+ console.log(action.reason);
172
+ return;
173
+ }
174
+ console.error(action.reason || `You don't have an active claim on task #${taskId}.`);
175
+ if (claims.length > 0) {
176
+ console.error(`Your active claims:`);
177
+ for (const c of claims) console.error(` #${c.task_id}: ${c.title}`);
178
+ }
179
+ process.exit(1);
180
+ }
181
+
182
+ // ---- First ship asks for the ship mode, once (task 1004630, ADR 0369) ----
183
+ // A project that never chose Auto or Manual stops HERE, before anything resolves,
184
+ // so the AI can ask the person; the re-run carries --ship-mode and saves it. Never
185
+ // blocks a ship nobody can answer for (see ship-mode-ask.js).
186
+ const firstShip = await runFirstShipAsk({
187
+ args,
188
+ getShipMode: async () => {
189
+ const r = await apiCall('GET', '/api/bongos/project-settings/ship-mode');
190
+ return r.ok ? r.data : null;
191
+ },
192
+ saveShipMode: (mode) => apiCall('PATCH', '/api/bongos/project-settings/ship-mode', { mode }),
193
+ });
194
+ if (firstShip.stop) {
195
+ for (const line of firstShip.lines) console.log(line);
196
+ cliExit(firstShip.exit);
197
+ return;
198
+ }
199
+
200
+ // ---- Hard cap: refuse to ship over the monthly budget (V3.R84 #302, C3) ----
201
+ // Shipping runs the subagent grader, which spends API $. If this builder is at
202
+ // or over their monthly budget, refuse here — BEFORE the grader runs and BEFORE
203
+ // the claim resolves, so the claim stays active and no cost is incurred. Any
204
+ // Metic+ builder lifts the block by raising the builder's budget
205
+ // (PATCH /builders/:id/budget — builder.budget.set, metic-floored since ADR 0157).
206
+ // Fail-open: a missing/unreadable cost status (e.g. an older server) never blocks a ship.
207
+ const costStatus = me.data.cost;
208
+ if (costStatus && costStatus.level === 'over') {
209
+ console.error('');
210
+ console.error(`Ship refused: monthly budget exceeded — $${costStatus.spend_mtd_usd} of $${costStatus.budget_mtd_usd} spent this month (${costStatus.pct_used}%).`);
211
+ console.error('Shipping runs the quality grader, which spends API budget. No claim resolved, no credits awarded.');
212
+ console.error('Ask any Metic or Archon to raise your monthly budget (PATCH /builders/:id/budget), then re-ship.');
213
+ process.exit(1);
214
+ }
215
+
216
+ // ---- Manual ship mode: an AI session asks the person first (task 1004631, ADR 0369) ----
217
+ // Before anything resolves, so a "not yet" leaves the claim exactly as it was.
218
+ if (await stopForManualApproval(args, taskId)) return;
219
+
220
+ // ---- Surprise gate: forced "anything surprise you?" prompt ----
221
+ //
222
+ // Resolve the user's intent into a single value: either a non-empty surprise
223
+ // string (capture a learning) or empty (no surprise, ship normally).
224
+ // --surprise "text" → capture
225
+ // --surprise none → no surprise
226
+ // --surprise "" → no surprise
227
+ // --no-surprise → no surprise
228
+ // neither + TTY → prompt
229
+ // neither + non-TTY → no surprise, with stderr warning
230
+ let surpriseText = '';
231
+ if (surpriseProvided) {
232
+ const v = (surpriseRaw || '').trim();
233
+ surpriseText = (v === '' || v.toLowerCase() === 'none') ? '' : v;
234
+ } else if (noSurprise) {
235
+ surpriseText = '';
236
+ } else if (process.stdout.isTTY && process.stdin.isTTY) {
237
+ surpriseText = await promptSurprise();
238
+ if (surpriseText.toLowerCase() === 'none') surpriseText = '';
239
+ } else {
240
+ console.error('warn: no --surprise or --no-surprise provided in non-interactive context; defaulting to no surprise.');
241
+ surpriseText = '';
242
+ }
243
+
244
+ // ---- Step 0: preflight (working tree + branch freshness) ----
245
+ console.log(`Verifying claim #${ac.claim_id} on task #${ac.task_id}: ${ac.title}`);
246
+ console.log('Preflight (working tree + branch freshness)...');
247
+ // task 1001436: inputFiles keeps --notes-file/--summary-file/--visual out of the
248
+ // preflight's untracked-file warning — they are this ship's input, not its artifact.
249
+ const pre = preflight(ac, { force, inputFiles: shipInputPaths(args) });
250
+ if (!pre.ok) {
251
+ console.error('');
252
+ console.error(`Ship aborted: ${pre.reason}. No claim resolved, no credits awarded.`);
253
+ process.exit(1);
254
+ }
255
+
256
+ // ---- Step 0b: pull origin/main into the branch up front (#1068, gap 2) ----
257
+ // So the tree reviewed on the sandbox == the tree we ship — no post-approval
258
+ // re-stage loop. Skipped under --no-merge (a deliberate "don't touch main"
259
+ // opt-out). Aborts only on a genuine conflict, claim left intact.
260
+ if (!skipMerge) {
261
+ const m = mergeMainIntoBranch();
262
+ if (!m.ok) {
263
+ console.error('');
264
+ console.error(`Ship aborted: ${m.reason}.`);
265
+ console.error('No claim resolved, no credits awarded — your claim is still active.');
266
+ process.exit(1);
267
+ }
268
+ }
269
+
270
+ // ---- Capture surprise learning (if any) ----
271
+ if (surpriseText) {
272
+ console.log('Capturing surprise as a learning...');
273
+ await captureSurpriseLearning(surpriseText, ac, taskId);
274
+ }
275
+
276
+ // ---- Pre-verify: auto-linkify this ship's own changed docs (#747) ----
277
+ // Fix bare "#NNN" task refs in the docs this ship changed BEFORE the merge,
278
+ // so they never red-X the doc-ref-linkify gate (tests/linkify_check.mjs in
279
+ // the `unit` check). Best-effort.
280
+ autoLinkifyChangedDocs(ac);
281
+
282
+ // ---- Empty-diff / phantom-ship guard (must run BEFORE the review gate + resolve) ----
283
+ // #513 added this check, but at step 2 — AFTER the resolve below already
284
+ // landed the task at `completed` and consumed the claim. A builder who ran
285
+ // /builder-ship before committing then burned the claim and couldn't re-ship
286
+ // ("You don't have an active claim" — the task-595-regrade-gap). Observed
287
+ // live on #662 (Windows). Moving it here means an empty committed diff aborts
288
+ // cleanly with the claim STILL ACTIVE, so the builder can commit and re-run.
289
+ // The grader reads committed history (baseline...HEAD), independent of
290
+ // touches[] (see computeGraderBaseline). The computed list is reused by the
291
+ // grader at step 2 so we don't diff twice.
292
+ //
293
+ // task 1365: this guard now runs REGARDLESS of --skip-grade. The old version
294
+ // was gated on `!skipGrade`, so --skip-grade (and the server-side
295
+ // grader_bypass that forces skipGrade) sailed an empty committed diff straight
296
+ // through to resolve → manual-confirm → the publish reconciler then shipped a
297
+ // task with NO artifact on main (task 1363: a new doc left UNTRACKED, never
298
+ // committed, HEAD never moved — the ledger lied, CLAUDE.md §8). classifyEmptyShip
299
+ // splits the three cases: a dirty/untracked working tree means the deliverable
300
+ // was never committed (refuse, even under --allow-empty); a clean tree with an
301
+ // explicit --allow-empty is a genuine no-artifact/DB-only ship (allow); a clean
302
+ // tree without the flag is nothing-to-ship (refuse). Refusing here leaves the
303
+ // claim ACTIVE so the builder can commit + re-run.
304
+ const graderBaseline = computeGraderBaseline(ac);
305
+ const committedFiles = computeChangedFiles(graderBaseline);
306
+ if (committedFiles.length === 0) {
307
+ const verdict = classifyEmptyShip(gitOk('git status --porcelain'), { allowEmpty });
308
+ if (verdict.reason === 'uncommitted-work') {
309
+ console.error('Ship refused: nothing is committed on this branch, but your working tree has uncommitted changes:');
310
+ for (const f of verdict.uncommitted) console.error(` - ${f}`);
311
+ console.error('');
312
+ console.error('Your work was never committed — shipping now would mark the task "shipped" with NO artifact on main (the ledger would lie).');
313
+ console.error('Stage + commit your work (e.g. `git add -A && git commit`), then re-run /builder-ship. Your claim is still active.');
314
+ for (const line of plainCardLines('uncommitted_work')) console.error(line);
315
+ process.exit(1);
316
+ }
317
+ if (verdict.reason === 'nothing-to-ship') {
318
+ console.error(`Nothing to ship: the committed diff vs ${graderBaseline || 'baseline'} is empty and the working tree is clean.`);
319
+ console.error('The grader reads committed history, not the working tree — commit your work on this branch, then re-run /builder-ship. Your claim is still active.');
320
+ console.error('If this task legitimately has no code/doc artifact (a pure DB-only or no-op task), re-run with --allow-empty.');
321
+ for (const line of plainCardLines('nothing_to_ship')) console.error(line);
322
+ process.exit(1);
323
+ }
324
+ // verdict.reason === 'allow-empty': a deliberate no-artifact / DB-only ship.
325
+ //
326
+ // task 1004011 (ADR 0320): this used to force `skipGrade = true` — no grade at
327
+ // all, then the Archon-only `task.confirm.grade_bypass` gate. Both halves were
328
+ // wrong. An empty diff is not an UNGRADED diff, it is a diff the grader has
329
+ // nothing to say about, so it should not need the key that ratifies past a
330
+ // FAILING grade. And something here does deserve adversarial scrutiny: not the
331
+ // absent diff, but the CLAIM that nothing was needed. "The premise was already
332
+ // fixed", "this was a pure ops verification" are assertions the ledger records
333
+ // and, until now, nothing checked.
334
+ //
335
+ // So the grader is no longer skipped — it is re-pointed at the notes. A pass is
336
+ // a REAL passing grade and confirms through the ordinary rank-open path; a fail
337
+ // is a real fail, and the builder fixes the evidence rather than reaching for a
338
+ // permission. skipGrade stays false; only an explicit --skip-grade still skips.
339
+ // Set only when a grade will actually run. With --skip-grade (or the server-side
340
+ // grader_bypass, which forces skipGrade above) the `if (!skipGrade)` gate below
341
+ // skips grading entirely and this flag would be inert — but an inert flag makes a
342
+ // reader trace two of them to see why nothing happened, and invites a later
343
+ // refactor to treat it as "this ship graded its notes" when it graded nothing.
344
+ noArtifactGrade = !skipGrade;
345
+ // task 1003950: mark WHY the grader is being skipped. A --skip-grade ship past a
346
+ // failing grade and a genuinely artifact-free close both reach the same archon
347
+ // gate below, but only the second one may be escalated automatically — the first
348
+ // has a diff the grader DID read and reject, and auto-filing a blocker for it
349
+ // would be a builder routing their own rejected work to an override queue.
350
+ //
351
+ // Still set, and still needed: since task 1004011 this close reaches the archon
352
+ // gate only when the builder ALSO passed --skip-grade, or the server bypassed
353
+ // the grader for them. Those are the cases where the escalation split still
354
+ // decides which refusal is printed.
355
+ noArtifactClose = true;
356
+ console.log('--allow-empty: no committed diff (no-artifact / DB-only ship).');
357
+ if (noArtifactGrade) {
358
+ console.log(' The grader is not skipped — it is re-pointed: your handoff notes and value summary are graded');
359
+ console.log(' against the task description, so the claim that nothing was needed is what gets checked (task 1004011).');
360
+ } else {
361
+ console.log(' The grader is skipped (--skip-grade / server bypass), so the claim is NOT checked — this close');
362
+ console.log(' routes to the archon confirm gate. Drop --skip-grade to have your notes graded instead.');
363
+ }
364
+ }
365
+
366
+ // ---- Module drift check (BV1.R53, task 1422) ----
367
+ // If the task carries a module_key, verify the committed diff doesn't stray
368
+ // into a DIFFERENT module's territory. "You said game, you touched provisioning" is
369
+ // the semantic violation this catches. Files no module owns are allowed —
370
+ // they're cross-cutting — as is the territory of a CROSS-CUTTING module, which
371
+ // every craft legitimately writes into. Only contact with a different OWNING
372
+ // module's glob set is flagged.
373
+ //
374
+ // The rule itself lives in module-scope-map.js (moduleDriftFiles) next to the
375
+ // map it reads, so it can be tested without running a ship (task 1003770). It
376
+ // used to be inline here, and read "files outside all module scopes (docs,
377
+ // session logs, general scripts) are allowed" — a premise task 1002989 ended by
378
+ // giving `methodology` the whole docs/ subtree. Since every ship writes a
379
+ // session log, the advisory then fired for 25 of the 26 module keys on that log
380
+ // alone. See CROSS_CUTTING_KEYS for why the glob was not shrunk instead.
381
+ //
382
+ // The check is ADVISORY (warns but does not refuse) on the first cut because
383
+ // the module_key column is new and existing tasks may carry a broader diff scope
384
+ // until all tasks are labelled. Enforced tasks can opt in with --enforce-module.
385
+ // ac.module_key comes from getActiveClaimsForBuilder (t.module_key in the join).
386
+ const enforceModule = args.includes('--enforce-module');
387
+ if (ac.module_key && isModuleKey(ac.module_key) && committedFiles.length > 0) {
388
+ const moduleDriftFiles = computeModuleDrift(ac.module_key, committedFiles);
389
+ if (moduleDriftFiles.length > 0) {
390
+ // Name the module's REAL territory rather than guessing 'modules/<key>/'.
391
+ // That guess is wrong for every module whose code has not been carved out
392
+ // yet (ADR 0083) — kernel lives in src/bongos/, methodology in docs/ — so
393
+ // the advisory used to tell those builders to move their work somewhere
394
+ // their module does not own. scopeForModule is the roster's own answer.
395
+ const declared = scopeForModule(ac.module_key);
396
+ const territory = declared && declared.globs.length
397
+ ? declared.globs.slice(0, 4).join(', ') + (declared.globs.length > 4 ? `, +${declared.globs.length - 4} more` : '')
398
+ : `modules/${ac.module_key}/`;
399
+ const msg = [
400
+ `\n⚠ Module drift detected: task is scoped to '${ac.module_key}' but ${moduleDriftFiles.length} file(s) touch a different module:`,
401
+ ...moduleDriftFiles.map((f) => ` - ${f}`),
402
+ '',
403
+ ` '${ac.module_key}' owns: ${territory}`,
404
+ '',
405
+ enforceModule
406
+ ? `Refused (--enforce-module). Confine your changes to that territory, or clear the module_key label.`
407
+ : 'Advisory — ship proceeds, but consider confining your changes to that territory.',
408
+ ].join('\n');
409
+ console.log(msg);
410
+ if (enforceModule) process.exit(1);
411
+ }
412
+ }
413
+
414
+ // ---- Sandbox-first review gate (#927, ADR 0046) ----
415
+ // On a clone that carries the game preview, a diff that touches game
416
+ // surfaces must be STAGED on the builder's own local preview (ADR 0044)
417
+ // and reviewed in a browser before the claim resolves — see it running,
418
+ // get the chance to iterate, THEN decide to ship to the main game. A
419
+ // checkout with no game preview, non-game diffs, and --skip-stage all pass
420
+ // through untouched. Interactive: stage + ask; declining aborts with the
421
+ // claim intact. Non-TTY (agent-driven sessions): stage, then abort with the
422
+ // review URL — the re-run after the human reviews passes on the fresh
423
+ // staged marker. Never hangs on stdin.
424
+ const sandboxGate = await runShipGate({
425
+ taskId,
426
+ files: committedFiles,
427
+ skipStage: args.includes('--skip-stage'),
428
+ // #1048: --approved records the builder's sign-off after they reviewed the
429
+ // staged change on their sandbox. Only honored on a re-run whose game state
430
+ // is already staged-fresh — it can't pre-approve an unstaged change.
431
+ approved: args.includes('--approved'),
432
+ tty: Boolean(process.stdout.isTTY && process.stdin.isTTY),
433
+ });
434
+ if (!sandboxGate.ok) {
435
+ if (sandboxGate.review) {
436
+ // task 1275: the in-review card — the SAME lifecycle card, amber, whose
437
+ // action is "Open in sandbox ↗" (the sandbox URL the owner asked to surface
438
+ // here). Best-effort, never blocks the pause.
439
+ try {
440
+ const shipCard = require('../../modules/lifecycle/ship-card');
441
+ const { added, removed } = diffstatFor(graderBaseline);
442
+ const model = shipCard.buildCardModel({
443
+ stage: 'review',
444
+ taskId,
445
+ title: ac.title,
446
+ valueSummary: summary,
447
+ fileCount: committedFiles.length || null,
448
+ added,
449
+ removed,
450
+ sandboxUrl: sandboxGate.url,
451
+ });
452
+ // task 1279 / 1002518: honour the builder's card-richness level (from the
453
+ // /me fetched at the top of shipMain; the standard rung if absent, and
454
+ // the boolean's old meaning against an older server).
455
+ shipCard.emitCard(model, taskId, { flags: cardFlagsFromMe(me) });
456
+ } catch (_) { /* the review pause stands with or without the card */ }
457
+ // #1061 polish: a sandbox review pause is a DELIBERATE, expected
458
+ // checkpoint — not a failed ship. printReviewBlock already showed the URL
459
+ // + the --approved next step, so don't follow it with red "Ship aborted /
460
+ // no credits awarded" text that makes the review moment read as broken.
461
+ // Calm note on stdout (not stderr); the claim is left fully intact.
462
+ console.log('');
463
+ console.log('⏸ Paused for your sandbox review — this is expected, not an error.');
464
+ console.log(' Your claim is still active; nothing was lost.');
465
+ console.log(' Walk the change at the link above, then approve with: /builder-ship --approved');
466
+ process.exit(1);
467
+ }
468
+ console.error('');
469
+ console.error(`Ship aborted: ${sandboxGate.reason}.`);
470
+ console.error('No claim resolved, no credits awarded — your claim is still active.');
471
+ process.exit(1);
472
+ }
473
+ // #1048: the recorded sandbox self-approval (when the builder approved a
474
+ // staged game change), threaded into the resolve call below so the server
475
+ // persists it on the task. null on a checkout with no game preview, non-game
476
+ // diffs, --skip-stage, and bare fresh-marker re-runs without --approved.
477
+ const sandboxReview = sandboxGate.sandboxReview || null;
478
+
479
+ // ---- Step 1+2: verify locally (smoke) — runs AFTER the review gate (#1061) ----
480
+ // touches[] cleanup [4/8] (task 879): the predictive drift scanner is gone;
481
+ // local verification is smoke-only. Smoke runs HERE (post-gate) so a review
482
+ // PAUSE doesn't bury the sandbox link under the smoke output — smoke only runs
483
+ // on the actual ship: the --approved re-run, or a laptop / non-game ship the
484
+ // gate waved straight through. (#1061 — the gate is a no-op for those, so this
485
+ // is the same single smoke run as before, just sequenced after it.)
486
+
487
+ // task 1002660: start the grade COMPUTATION now, so the multi-minute panel
488
+ // overlaps the smoke run + claim resolve instead of serializing behind them.
489
+ // computeGradeResult performs no server writes — the grade POST stays in the
490
+ // grade step below, after the resolve lands the task at 'completed'. On a
491
+ // smoke abort the in-flight panel is discarded (its partial spend is lost —
492
+ // rare, and cheaper than serializing every ship behind smoke).
493
+ let gradeCompute = null;
494
+ let fullTaskForGrade = null;
495
+ if (!skipGrade) {
496
+ const tFetch = await (await cliClient()).tasks.getTasksId({ id: taskId });
497
+ fullTaskForGrade = tFetch.ok ? tFetch.data.task : { id: taskId, title: ac.title };
498
+ console.log(noArtifactGrade
499
+ ? 'Starting the no-artifact grader over your notes (overlaps the smoke run — task 1002660)...'
500
+ : 'Starting the quality grader panel (overlaps the smoke run — task 1002660)...');
501
+ gradeCompute = computeGradeResult({
502
+ taskId, task: fullTaskForGrade, summary,
503
+ baseline: graderBaseline, committedFiles,
504
+ // task 1004011: present ⇒ grade the claim, not the (empty) diff. The notes
505
+ // are the evidence, so they have to travel with it.
506
+ noArtifact: noArtifactGrade ? { notes } : null,
507
+ });
508
+ gradeCompute.catch(() => {}); // an abort path must not die on an unhandled rejection
509
+ }
510
+
511
+ console.log('Running smoke tests against production...');
512
+ // task 1002660: the async twin — awaiting keeps the event loop free so the
513
+ // overlapped panel's subprocess callbacks progress while smoke runs.
514
+ const smoke = await runSmokeAsync();
515
+ const passed = smoke.clean;
516
+ console.log('');
517
+ console.log(`Verification: smoke=${smoke.clean ? 'clean' : 'FAIL'}, overall=${passed ? 'PASS' : 'FAIL'}`);
518
+ console.log('');
519
+
520
+ // task 1002605 (G-18): a smoke FAIL used to fall straight through into the
521
+ // claim resolve — claim consumed, grading silently skipped, task parked at
522
+ // 'completed', exit 0, and the builder read "Done." believing they shipped.
523
+ // Abort BEFORE the resolve instead — the same claim-preserving posture as the
524
+ // budget cap and the sandbox-review gate above. --allow-smoke-fail is the
525
+ // deliberate continuation; the parked message where the grader would have run
526
+ // says exactly where that leaves the task.
527
+ if (!passed && !allowSmokeFail) {
528
+ console.error('');
529
+ for (const line of smokeGateMessages(taskId).abort) console.error(line);
530
+ for (const line of plainCardLines('smoke_failed')) console.error(line);
531
+ process.exit(1);
532
+ }
533
+
534
+ // ---- Step 1: resolve the claim (lands at completed) ----
535
+ // V3.R18 (#209): resolveClaim no longer runs the v1 deterministic grader.
536
+ // It now lands the task at `completed` when verification (smoke) passes, and
537
+ // stops. The v2 subagent grader (step 2 below) is what gates the credits +
538
+ // the completed→confirmed transition.
539
+ const resolveBody = {
540
+ outcome: 'shipped',
541
+ notes_md: notes,
542
+ value_summary: summary,
543
+ verification: {
544
+ passed,
545
+ // touches[] cleanup [4/8] (task 879): the drift scanner is gone; with no
546
+ // scanner there is nothing to drift, so this audit-trail signal
547
+ // (read by the retired v1 grader, task 1002842) is vacuously clean.
548
+ scanner_clean: true,
549
+ smoke_clean: smoke.clean,
550
+ },
551
+ // touches[] cleanup [7/8] (task 882): the real committed changed-files, so
552
+ // the server backfills touches[] from reality (the planning prediction is
553
+ // now optional). Same list the grader already used.
554
+ committed_files: committedFiles,
555
+ // #1048: the sandbox self-approval { stamp, url, method } when the builder
556
+ // reviewed + approved a staged game change. The server stamps by/at and
557
+ // persists it to tasks.sandbox_review. null = nothing to record.
558
+ sandbox_review: sandboxReview,
559
+ // task 1003767: the working tree this ship is running in, so the server's
560
+ // resolve lock can key on the TREE instead of the auth session. Without it
561
+ // a /builder-reauth mid-claim re-issued the session and stranded the ship
562
+ // with `release --force` (forfeiting graded work) the only way out. Same
563
+ // detector claim.js uses, so the two names always agree.
564
+ resolver_worktree: detectWorktreeName(),
565
+ };
566
+ let r = await (await cliClient()).claims.postClaimsIdResolve({ id: ac.claim_id, body: resolveBody });
567
+
568
+ // FORWARD COMPATIBILITY (task 1003767). The resolve route validates STRICTLY:
569
+ // an unknown body field is a hard 400, not an ignored extra. @cloudbongos/cli
570
+ // is published separately from the core and instances pin their own core
571
+ // version, so a CLI carrying a field the server has not learned yet would
572
+ // otherwise be unable to ship AT ALL against that instance — the diff that
573
+ // added `resolver_worktree` hit exactly this on its own ship.
574
+ //
575
+ // So: if the server rejects specifically because it does not know
576
+ // `resolver_worktree`, drop it and retry ONCE. The lock then falls back to
577
+ // the session compare server-side, which is what an older core did anyway —
578
+ // no behaviour is lost that that server ever had.
579
+ //
580
+ // Deliberately narrow: it retries only when the details name THIS field as
581
+ // unknown. Any other validation failure — including an unknown field we did
582
+ // not send on purpose — still surfaces, so this cannot mask a real bug.
583
+ if (!r.ok && isUnknownFieldRejection(r.status, r.data, 'resolver_worktree')) {
584
+ console.error("note: this instance's core predates resolver_worktree — retrying without it.");
585
+ console.error(' (the resolve lock falls back to the session check on that server.)');
586
+ delete resolveBody.resolver_worktree;
587
+ r = await (await cliClient()).claims.postClaimsIdResolve({ id: ac.claim_id, body: resolveBody });
588
+ }
589
+ if (!r.ok) {
590
+ const resolveErr = normalizeApiError(r.data);
591
+ if (resolveErr.code === 'CLAIM_SESSION_MISMATCH') {
592
+ const wt = resolveErr.details.claimWorktree;
593
+ // task 1003767: name WHICH lock fired. 'worktree_mismatch' means the claim
594
+ // really was made in another working tree — the branch this ship would
595
+ // publish is not the branch that did the work, so shipping here would land
596
+ // the wrong commits. That is the guard doing its job, and the fix is to run
597
+ // the ship from the right tree, NOT to force-release. Only a fallback
598
+ // 'session_mismatch' (no tree named on one side — a plain clone, or an
599
+ // older CLI) is the historical session case.
600
+ if (resolveErr.details.reason === 'worktree_mismatch') {
601
+ console.error(`This claim belongs to a different working tree${wt ? ` (worktree: ${wt})` : ''}.`);
602
+ console.error(`Ship it from there — its branch holds the work: cd .claude/worktrees/${wt || '<name>'}`);
603
+ console.error('Shipping from this tree would publish the wrong branch, which is why it is refused.');
604
+ } else {
605
+ console.error(`This claim was created in a different session${wt ? ` (worktree: ${wt})` : ''}.`);
606
+ console.error('No working tree was named on one side, so the older session check applied.');
607
+ }
608
+ console.error(`If the work is genuinely gone, give the task back: node scripts/bongos/release.js ${taskId} --force`);
609
+ console.error('(--force abandons the claim and forfeits its credits — it is the give-up exit, not the fix.)');
610
+ } else {
611
+ console.error(`resolve failed: ${apiErrorLine(r.data, r.status)}`);
612
+ }
613
+ process.exit(1);
614
+ }
615
+
616
+ const taskStatus = r.data.taskStatus || 'shipped (legacy response)';
617
+ console.log(`Task #${r.data.taskId} is now: ${taskStatus}`);
618
+ // task 1003109: attach the optional visual now the claim has resolved (the upload
619
+ // gate is "the task's last claim holder" — still us). Best-effort: it prints its
620
+ // own warning, and a failed picture never fails a successful ship.
621
+ await shipVisual.upload({ taskId, visual, client: await cliClient(), errorLine: apiErrorLine });
622
+ // Claim CONSUMED, task at 'completed' — a crash from here needs fatalRecoveryLines.
623
+ markShipProgress('resolved', taskId);
624
+
625
+ // ---- Step 2: subagent quality grader ----
626
+ // Runs when local verification passed AND resolveClaim landed at completed.
627
+ // If verification did not pass we don't bother grading — the task stays at
628
+ // completed (or whatever resolveClaim returned) with no credits.
629
+ let credits = r.data.creditsAwarded ?? 0;
630
+ let postGradeStatus = taskStatus;
631
+ let postGradeJustUnlocked = r.data.just_unlocked || [];
632
+ let gradePassed = false;
633
+ let advanceToMerge = false;
634
+ let held = false; // task 1004322: a page tweak's pass, held for its artist (ADR 0341 D7)
635
+ let gradeObj = null; // task 1270: the grade result, hoisted for the completion card
636
+ // V3.R27 (#247): credit breakdown surfaced from the grade or confirm
637
+ // response. Kept separate from `credits` so we only print the multiplier
638
+ // line when the multiplier actually moved the payout.
639
+ let creditsRaw = null;
640
+ let creditsMultiplier = null;
641
+ let ideaBonusInfo = null;
642
+
643
+ if (passed && taskStatus === 'completed' && skipGrade) {
644
+ // Escape hatch: skip the subagent grader and manual-confirm. The
645
+ // task_grades row gets grader_kind='lars' so the audit trail captures
646
+ // that this ship bypassed the v2 grader.
647
+ console.log('');
648
+ console.log('--skip-grade: skipping subagent grader; manual-confirming via POST /tasks/:id/confirm.');
649
+ // task 1053 (F): pass the verify attestation. The server refuses to confirm a
650
+ // kind='verify' task without it (so a hardware-verify can't land before the
651
+ // verify ran). --verified is a no-op for every other kind.
652
+ const confirm = await (await cliClient()).tasks.postTasksIdConfirm({ id: taskId, body: { verified } });
653
+ if (!confirm.ok) {
654
+ if (confirm.status === 409 && normalizeApiError(confirm.data).code === 'verify_attestation_required') {
655
+ console.error('');
656
+ console.error(`This is a VERIFICATION task — it won't confirm until you attest the verify actually passed.`);
657
+ console.error(`Run the verification, then re-ship with --verified:`);
658
+ console.error(` node scripts/bongos/ship.js ${taskId} --verified`);
659
+ console.error(`(Your work is committed and the task is at 'completed' — re-running resumes, task 941.)`);
660
+ process.exit(1);
661
+ }
662
+ // task 1002613 (map P-1): the one genuine permission wall on the ship path
663
+ // used to surface as a raw envelope dump — an atom name is not a rank, and
664
+ // no remedy printed at the one station where self-service exists. Interpret
665
+ // it: name the wall, the floor (from the server's floors map — never
666
+ // hardcoded), and both ways forward.
667
+ const errObj = confirm.data && confirm.data.error;
668
+ const errCode = typeof errObj === 'string' ? errObj : (errObj && errObj.code);
669
+ if (confirm.status === 403 && errCode === 'permission_forbidden') {
670
+ const details = (errObj && typeof errObj === 'object' && errObj.details) || {};
671
+ const floor = details.floors && details.floors['task.confirm.grade_bypass'];
672
+ const floorNote = floor ? ` (floor: ${floor})` : '';
673
+ // task 1003950: these two cases used to print the same advice, and for a
674
+ // no-artifact close that advice was a LOOP — --regrade on an empty diff
675
+ // refuses and points back at --allow-empty, which lands here again. Split
676
+ // them: a rejected-grade bypass still has a real diff and a real remedy
677
+ // (fix the findings, re-grade); an artifact-free close has neither, so it
678
+ // gets the escalation filed for it and terminates.
679
+ if (noArtifactClose) {
680
+ const escalation = await fileNoArtifactEscalation({
681
+ taskId, title: ac.title, floor, summary, notes, builder: (me.data.builder || {}).github_login,
682
+ });
683
+ for (const line of noArtifactRefusalLines({ taskId, floor, escalation })) console.error(line);
684
+ process.exit(1);
685
+ }
686
+ console.error('');
687
+ console.error(`✖ Confirming without a passing grade is permission-gated: task.confirm.grade_bypass${floorNote}.`);
688
+ console.error(' This is an authorization wall, not a verdict on your work.');
689
+ console.error(' Self-service: re-run WITHOUT --skip-grade to use the subagent grader, and if a');
690
+ console.error(' grade fails, fix its findings and re-run (unlimited, no attempt cap):');
691
+ console.error(` node scripts/bongos/ship.js ${taskId} --regrade`);
692
+ console.error(` If the grade genuinely cannot pass, ask a builder whose role holds`);
693
+ console.error(` task.confirm.grade_bypass${floorNote} to POST /api/bongos/tasks/${taskId}/confirm.`);
694
+ process.exit(1);
695
+ }
696
+ console.error(`manual-confirm failed: ${apiErrorLine(confirm.data, confirm.status)}`);
697
+ process.exit(1);
698
+ }
699
+ postGradeStatus = confirm.data.taskStatus;
700
+ credits = confirm.data.creditsAwarded ?? 0;
701
+ ideaBonusInfo = confirm.data.ideaBonus ?? null;
702
+ advanceToMerge = postGradeStatus === 'confirmed';
703
+ gradePassed = true; // by builder fiat, not by grader
704
+ } else if (passed && taskStatus === 'completed') {
705
+ console.log('');
706
+ console.log(noArtifactGrade
707
+ ? 'Running the no-artifact grader (subject: your claim that nothing was needed)...'
708
+ : 'Running subagent quality grader...');
709
+
710
+ // #513 + #536: the grader reads COMMITTED history (baseline...HEAD), not
711
+ // the working tree. The empty-committed-diff guard now runs earlier — BEFORE
712
+ // the claim is resolved (see above) — so by the time we reach here the diff
713
+ // is guaranteed non-empty on the grader path, EXCEPT on the task 1004011
714
+ // no-artifact species, where it is guaranteed empty and the notes are the
715
+ // subject instead. Reuse the baseline + file list
716
+ // computed there so we don't diff twice. #678: gradeAndRecord POSTs the
717
+ // result and logs the panel cost — the same unit the --regrade path reuses.
718
+ // task 1002660: the panel computation was started BEFORE the smoke gate
719
+ // (gradeCompute above) — hand it in so this step only waits out whatever
720
+ // panel time smoke + resolve didn't already absorb.
721
+ const gradePost = await gradeAndRecord({
722
+ taskId,
723
+ task: fullTaskForGrade || { id: taskId, title: ac.title },
724
+ summary,
725
+ baseline: graderBaseline,
726
+ committedFiles,
727
+ precomputed: gradeCompute,
728
+ // No `noArtifact` here on purpose: `precomputed` is ALWAYS set on this path, and
729
+ // gradeAndRecord only falls back to computing inline when it is absent. Passing it would be
730
+ // unreachable by construction — defensive symmetry that reads like a live argument. The
731
+ // species reaches the grader through gradeCompute above, which was built with it.
732
+ });
733
+
734
+ if (!gradePost.ok) {
735
+ console.error(`grade POST failed (${gradePost.status}):`, gradePost.data);
736
+ console.error('Task stays at completed. Manual options:');
737
+ console.error(` - Re-run /builder-ship ${taskId} to try grading again, or`);
738
+ console.error(` - node scripts/bongos/ship.js ${taskId} --regrade after fixing findings, or`);
739
+ console.error(` - POST /api/bongos/tasks/${taskId}/confirm to manual-confirm (last resort —`);
740
+ console.error(' permission-gated on task.confirm.grade_bypass).');
741
+ process.exit(1);
742
+ }
743
+
744
+ const g = gradePost.data.grade;
745
+ recordGradeOutcome({ taskId, grade: g });
746
+ gradeObj = g;
747
+ gradePassed = g.passed;
748
+ advanceToMerge = gradePost.data.advanceToMerge;
749
+ held = gradePost.data.held === true;
750
+ postGradeStatus = gradePost.data.taskStatus;
751
+ credits = gradePost.data.creditsAwarded;
752
+ postGradeJustUnlocked = gradePost.data.just_unlocked || [];
753
+ // V3.R27 (#247): pull the multiplier breakdown + idea-bonus info forward.
754
+ creditsRaw = gradePost.data.creditsRaw ?? null;
755
+ creditsMultiplier = gradePost.data.creditsMultiplier ?? null;
756
+ ideaBonusInfo = gradePost.data.ideaBonus ?? null;
757
+
758
+ printGradeOutcome(g, taskId);
759
+ } else if (!passed && taskStatus === 'completed') {
760
+ // task 1002605 (G-18): the --allow-smoke-fail continuation. The resolve above
761
+ // consumed the claim with verification.passed=false, so the grader deliberately
762
+ // does not run. This used to be a silent fall-through; say where the task is.
763
+ console.log('');
764
+ for (const line of smokeGateMessages(taskId).parked) console.log(line);
765
+ }
766
+
767
+ printCreditsAndAchievements({
768
+ postGradeStatus, credits, creditsRaw, creditsMultiplier, ideaBonusInfo,
769
+ justUnlocked: postGradeJustUnlocked, held,
770
+ });
771
+
772
+ // ---- Step 3: confirmed→shipped tail (merge + deploy → memory/session sync →
773
+ // Done → onboarding nudge → completion card), shared with regradeMain via
774
+ // finishShip (#1093/C9). ----
775
+ // Graded. If it passed, only the merge remains — a different crash story.
776
+ if (postGradeStatus === 'confirmed' || postGradeStatus === 'shipped') {
777
+ markShipProgress(postGradeStatus === 'shipped' ? 'landed' : 'graded', taskId);
778
+ }
779
+ await finishShip({
780
+ taskId, summary, advanceToMerge, skipMerge, postGradeStatus, doneLine: 'Done.', dbOnly, held,
781
+ // task 1270: data for the deterministic completion card.
782
+ card: {
783
+ title: ac.title,
784
+ valueSummary: summary,
785
+ notes,
786
+ files: committedFiles,
787
+ baseline: graderBaseline,
788
+ creditsAwarded: credits,
789
+ // task 1275: a real grade ran → pass/fail + issues; otherwise (--skip-grade
790
+ // or server-side GRADER_BYPASS) it was confirmed without a grade → skipped,
791
+ // so the card reads "grade skipped" rather than implying a real pass.
792
+ grade: gradeObj
793
+ ? { passed: gradeObj.passed, issues: gradeObj.issues || [], panel: Array.isArray(gradeObj.workers) ? gradeObj.workers.length : null, skipped: false }
794
+ : { passed: gradePassed, skipped: true },
795
+ },
796
+ });
797
+ }
798
+
799
+ // persistRegradeSummary — store a re-grade's corrected --summary on the task row
800
+ // (task 1003817). A re-grade has no claim, so it cannot reach claim-resolve, the
801
+ // only writer of tasks.value_summary before this; PATCH /tasks/:id is the route
802
+ // it uses instead.
803
+ //
804
+ // WHY PATCH AND NOT publish-branch, which already RECEIVES value_summary and
805
+ // could have persisted it with a one-line change: publish-branch is only called
806
+ // when pushVia() === 'server'. A laptop land goes through ciLandLocal (gh), and
807
+ // --no-merge / --db-only / --allow-empty never land at all — so persisting there
808
+ // would have fixed one path of four and left the defect standing on the rest. It
809
+ // would also have made publish-branch a SECOND writer racing claim-resolve on
810
+ // the normal ship path, which sends the same field. Writing from here keeps one
811
+ // writer per ship: the claim on a first ship, this on a re-grade.
812
+ //
813
+ // Three deliberate postures:
814
+ // - OMITTED --summary writes NOTHING. The stored value is the fallback the
815
+ // grader was already handed, so a re-grade that omits the flag must leave
816
+ // the row exactly as it was — the COALESCE/NULLIF posture every other
817
+ // value_summary write in db-ship.js keeps. This is acceptance 2.
818
+ // - UNCHANGED text writes nothing either, so a no-op edit mints no audit_log row.
819
+ // - A FAILURE is LOUD BUT NON-BLOCKING. The grade is the expensive step and it
820
+ // has not run yet; discarding a re-grade over a summary that did not persist
821
+ // would trade the cheap problem for the costly one. The builder is told
822
+ // plainly that the row still holds the old sentence, so nothing is silent.
823
+ // An older pinned core that has not learned the field is named as exactly
824
+ // that rather than reported as a generic error — the same forward-compat
825
+ // posture the resolve call in shipMain documents at length (task 1003767),
826
+ // because @cloudbongos/cli ships separately from the core and an instance
827
+ // pins its own core version.
828
+ async function persistRegradeSummary({ taskId, summaryArg, task }) {
829
+ const next = (summaryArg || '').trim();
830
+ if (!next) return { written: false, reason: 'omitted' };
831
+ if (next === (task.value_summary || '').trim()) return { written: false, reason: 'unchanged' };
832
+ let r;
833
+ try {
834
+ r = await (await cliClient()).tasks.patchTasksId({ id: taskId, body: { value_summary: next } });
835
+ } catch (err) {
836
+ console.error(` ⚠ value_summary NOT stored (${err && err.message ? err.message : 'request failed'}) — task #${taskId} keeps its previous summary. The grade below is unaffected.`);
837
+ return { written: false, reason: 'error' };
838
+ }
839
+ if (!r.ok) {
840
+ if (isUnknownFieldRejection(r.status, r.data, 'value_summary')) {
841
+ console.error(` ⚠ value_summary NOT stored: this instance's core predates PATCH /tasks/:id accepting the field. Upgrade the core, or edit the summary in the hall. The grade below is unaffected.`);
842
+ } else {
843
+ console.error(` ⚠ value_summary NOT stored (${apiErrorLine(r.data, r.status)}) — task #${taskId} keeps its previous summary. The grade below is unaffected.`);
844
+ }
845
+ return { written: false, reason: 'refused' };
846
+ }
847
+ console.log(` value_summary updated on task #${taskId} — the hall, /status and the ship broadcast now read the corrected sentence.`);
848
+ return { written: true };
849
+ }
850
+
851
+ // ---------- Re-grade flow (#678) ----------
852
+ //
853
+ // `node scripts/bongos/ship.js <id> --regrade` closes the task-595-regrade-gap
854
+ // (re-hit on #600): when a ship lands at `completed` but the subagent grader
855
+ // fails, /builder-ship has already resolved+consumed the claim, leaving no CLI
856
+ // path back in (claim refuses "not ready", PATCH refuses, promote refuses, a
857
+ // fresh ship.js says "no active claim"). The only escapes were the Archon
858
+ // /confirm override (bypasses the grader — see feedback_prefer_regrade_over_override)
859
+ // or hand-building a grader harness (learning #43).
860
+ //
861
+ // This re-runs ONLY the grade step against the committed diff, with no claim:
862
+ // - eligibility: task at `completed` AND (you last held the claim OR Archon)
863
+ // - preflight: working tree committed + ship/grade tooling current
864
+ // - empty-diff guard: the grader reads committed history, so refuse if empty
865
+ // - grade: gradeAndRecord → POST /tasks/:id/grade (rank-open; applyGrade
866
+ // promotes completed→confirmed + awards credits on pass, idempotent)
867
+ // - on pass: the normal confirmed→shipped merge + sync tail runs.
868
+
869
+ async function regradeMain(opts = {}) {
870
+ await requireSession();
871
+ const args = process.argv.slice(2);
872
+ const taskId = Number(args[0]);
873
+ if (!Number.isFinite(taskId)) {
874
+ console.error('usage: node scripts/bongos/ship.js <task-id> --regrade [--summary-file <path|-> | --summary "..."] [--response-file <path|-> | --response "..."] [--visual <image>] [--visual-alt "caption"] [--no-merge] [--force] [--verified] [--base <ref>]');
875
+ process.exit(2);
876
+ }
877
+ // A passing re-grade runs finishShip, the same land as a fresh ship, so Manual mode asks
878
+ // here too — whether reached by --regrade or by shipMain's resume-grade dispatch (task 1004631).
879
+ if (await stopForManualApproval(args, taskId)) return;
880
+ // task 1003702: refuse --notes rather than swallowing it. The reasoning — why
881
+ // a refusal and not a persist — is in ship-honesty.js above regradeNotesRefusal
882
+ // and is not repeated here. What is load-bearing at THIS call site is the
883
+ // POSITION: before the preflight and before any grade spend, because a refusal
884
+ // that first costs a 4-worker panel run is barely better than the silence it
885
+ // replaces. tests/ship_cannot_lie.mjs pins that order.
886
+ if (proseFlagPresent(args, 'notes')) {
887
+ for (const line of regradeNotesRefusal(taskId)) console.error(line);
888
+ process.exit(2);
889
+ }
890
+ // task 1004665: --visual used to be screened by shipMain and then dropped here
891
+ // without a word — this path returned before shipMain's upload, so visual_url
892
+ // stayed null (task 1004351). Screen it at the same early position as the
893
+ // --notes refusal (bad input costs no grade spend), and attach it on every
894
+ // path below that goes on to grade or land. shipMain's resume-grade dispatch
895
+ // hands over the visual it already screened rather than reading the file twice.
896
+ const visual = opts.visual !== undefined ? opts.visual : shipVisual.fromArgs(args, { regrade: true });
897
+ const attachVisual = async () => (visual
898
+ ? shipVisual.upload({ taskId, visual, client: await cliClient(), errorLine: apiErrorLine })
899
+ : false);
900
+ const regradeProse = resolveProse(args, ['summary', 'response']);
901
+ const summaryArg = regradeProse.summary;
902
+ // task 1002662: the builder's response to the prior round's findings — how
903
+ // each was fixed, tracked (a task ref), or why it's out of scope. Rides to
904
+ // the panel fenced, under the delta re-grade policy.
905
+ const responseArg = regradeProse.response;
906
+ const skipMerge = args.includes('--no-merge');
907
+ const force = args.includes('--force');
908
+ // task 1002422: honor --base on regrade/resume too, so `--regrade --base <ref>`
909
+ // and shipMain's resume-grade dispatch grade the real <base>...HEAD diff and
910
+ // advance already-on-main work, instead of aborting "nothing to grade". Same
911
+ // 0-ahead security guard as shipMain (applyBaseOverride is the shared gate).
912
+ const baseRefRaw = arg('--base', args);
913
+ const dbOnly = args.includes('--db-only') || args.includes('--allow-empty') || Boolean(baseRefRaw); // task 391 — honor --db-only on a regrade too
914
+ const verified = args.includes('--verified'); // task 1053 (F) — see gate below
915
+
916
+ if (baseRefRaw) {
917
+ const res = applyBaseOverride(baseRefRaw);
918
+ if (!res.ok) {
919
+ console.error(`Regrade aborted: ${res.reason}. Omit --base and re-grade normally.`);
920
+ process.exit(2);
921
+ }
922
+ console.log(`--base: re-grading ${res.sha.slice(0, 9)}...HEAD (work already on main).`);
923
+ }
924
+
925
+ // ---- Eligibility: completed + (owner | archon) ----
926
+ const me = noteServerReward(await (await cliClient()).me.getMe());
927
+ if (!me.ok) {
928
+ console.error('failed to load profile:', me.data);
929
+ process.exit(1);
930
+ }
931
+ const builder = me.data.builder || {};
932
+ // ?include=grade,last_claim — the claim-holder lookup for eligibility (#678)
933
+ // + the stored grade row for the delta-aware prior-round payload (task 1002662).
934
+ const tRes = await (await cliClient()).tasks.getTasksId({ id: taskId, query: { include: 'grade,last_claim' } });
935
+ if (!tRes.ok) {
936
+ if (tRes.status === 404) {
937
+ console.error(`Task #${taskId} not found.`);
938
+ } else {
939
+ console.error(`failed to load task #${taskId} (${tRes.status}):`, tRes.data);
940
+ }
941
+ process.exit(1);
942
+ }
943
+ const task = tRes.data.task;
944
+ const lastClaim = tRes.data.last_claim || null;
945
+ // pushVia() decides whether /merge-mode is even runnable here (task 1003221).
946
+ const elig = evaluateRegradeEligibility({ task, lastClaim, builder, pushMode: pushVia() });
947
+ if (!elig.ok) {
948
+ console.error(elig.reason);
949
+ process.exit(1);
950
+ }
951
+ // task 1053 (F): the resume/regrade path promotes completed→confirmed via the
952
+ // grade (applyGrade), which the server-side /confirm verify guard does NOT
953
+ // cover. Gate it here so a verification task can't be confirmed by simply
954
+ // re-running without attesting the verify passed (closing the bypass).
955
+ if (task.kind === 'verify' && !verified) {
956
+ console.error('');
957
+ console.error(`Task #${taskId} is a VERIFICATION task — it won't confirm until you attest the verify actually passed.`);
958
+ console.error(`Run the verification, then re-run with --verified:`);
959
+ console.error(` node scripts/bongos/ship.js ${taskId} --verified`);
960
+ process.exit(1);
961
+ }
962
+ // task 1004322 (ADR 0341 D7): a page tweak already HELD for its artist has a
963
+ // passed grade. A plain re-run lands here (completed -> resume-grade), and
964
+ // re-grading would spend the panel again for the verdict it already has, so it
965
+ // only re-publishes the branch (the recovery for a publish that failed).
966
+ if (tweakHold.isHeldForArtist(task, tRes.data.grade ? tRes.data.grade.passed : null)) {
967
+ console.log(`Task #${taskId} already passed its grade and is waiting for the artist: re-publishing its branch, not re-grading.`);
968
+ await attachVisual();
969
+ await finishShip({
970
+ taskId, summary: summaryArg || task.value_summary || '', held: true, postGradeStatus: 'completed', doneLine: 'Done.',
971
+ card: { title: task.title, valueSummary: summaryArg || task.value_summary || '', notes: '' },
972
+ });
973
+ return;
974
+ }
975
+ console.log(`Re-grading task #${taskId}: ${task.title}`);
976
+ console.log(` eligibility: ${elig.reason} (${elig.via})`);
977
+
978
+ // A grade-failed ship never reached the merge/broadcast step, so a passing
979
+ // re-grade is the FIRST time this task actually ships. Fall back to the
980
+ // task's stored value_summary so the merge commit + Discord #ship-news post
981
+ // carry meaningful text even when --summary is omitted.
982
+ //
983
+ // AND IT NOW REACHES THE TASK ROW TOO — task 1003817. It did not before: this
984
+ // `summary` fed the grader prompt, the merge commit message and the PR
985
+ // title/body and stopped there, so a builder who re-graded with a CORRECTED
986
+ // --summary saw it applied everywhere except the place that is the record —
987
+ // the hall, /status and the Discord #ship-news line all kept the first ship's
988
+ // sentence forever. persistRegradeSummary (below the preflight) is the write;
989
+ // PATCH /tasks/:id is the route it uses, and `value_summary` was added to that
990
+ // schema by this same task. tests/ship_cannot_lie.mjs pins the wiring.
991
+ const summary = summaryArg || task.value_summary || '';
992
+ // task 1003693: the fallback above is silent, and on a re-grade silence means
993
+ // re-publishing the failed attempt's sentence. Say so while it can still be
994
+ // corrected — see staleSummaryNotice for the incident this comes from.
995
+ if (!summaryArg) {
996
+ for (const line of staleSummaryNotice(taskId, task.value_summary)) console.log(line);
997
+ }
998
+
999
+ // The grader helpers want a claim-like object for touches[] (preflight's
1000
+ // working-tree-drift check) and head_sha (baseline fallback). The claim is
1001
+ // gone, so synthesize one from the task row + the last claim's head_sha.
1002
+ const claimLike = { touches: task.touches || [], head_sha: lastClaim?.head_sha ?? null, task_id: taskId, title: task.title };
1003
+
1004
+ // ---- Preflight: work committed + ship/grade tooling current ----
1005
+ // No scanner/smoke re-run — --regrade re-runs ONLY the grade step. But the
1006
+ // grader judges COMMITTED history, so uncommitted fixes on touches[] files
1007
+ // wouldn't be graded — refuse that (it would grade a stale diff). Also refuse
1008
+ // if the local ship/grade tooling is behind main (a stale grader silently
1009
+ // fails the same way — the #662 lesson). --force overrides the freshness leg.
1010
+ console.log('Preflight (working tree + branch freshness)...');
1011
+ const pre = preflight(claimLike, { force, inputFiles: shipInputPaths(args) });
1012
+ if (!pre.ok) {
1013
+ console.error('');
1014
+ console.error(`Re-grade aborted: ${pre.reason}. Task stays at completed.`);
1015
+ process.exit(1);
1016
+ }
1017
+
1018
+ // ---- Empty-diff guard (the grader reads committed history) ----
1019
+ const graderBaseline = computeGraderBaseline(claimLike);
1020
+ const committedFiles = computeChangedFiles(graderBaseline);
1021
+ if (committedFiles.length === 0) {
1022
+ // task 1003147: a DELIBERATELY artifact-free task used to dead-end here.
1023
+ // shipMain routes every 'completed' task to this re-grade BEFORE reading any
1024
+ // flag (evaluateResumeAction takes none), so --allow-empty / --skip-grade never
1025
+ // reached the manual-confirm path that a no-artifact task actually needs — and
1026
+ // that path is unreachable from 'completed' any other way. Hit for real on task
1027
+ // 1003146: a kind=verify task landed at 'completed' with no grade row, and
1028
+ // --allow-empty, --skip-grade and --verified all bailed on this same line.
1029
+ //
1030
+ // BOTH conditions are required, and the diff emptiness is MEASURED, not taken
1031
+ // on the builder's word. A flag alone must not reach confirm: a task with a
1032
+ // real diff whose grade failed would then bypass the grader by passing
1033
+ // --allow-empty, which is a quality hole, not a fix. Here the grader has
1034
+ // nothing to read, so there is no verdict to dodge. Confirming is additionally
1035
+ // permission-gated server-side on task.confirm.grade_bypass, so this widens
1036
+ // no authority — it only stops the ONE shape that had no exit at all.
1037
+ // task 1003944: the porcelain is MEASURED here and handed to the decision, so a
1038
+ // re-grade weighs the same evidence a first ship does. Without it the guard saw
1039
+ // only the flag and the (empty) committed diff, and an UNTRACKED deliverable —
1040
+ // invisible to preflight's trackedDirty — confirmed straight through to shipped.
1041
+ const emptyShip = shouldConfirmWithoutGrade({
1042
+ committedFileCount: committedFiles.length,
1043
+ porcelain: gitOk('git status --porcelain'),
1044
+ args,
1045
+ });
1046
+ if (emptyShip.confirm) {
1047
+ console.log('');
1048
+ console.log(`Nothing to grade (the committed diff vs ${graderBaseline || 'baseline'} is empty) and this ship`);
1049
+ console.log('declares itself artifact-free — manual-confirming via POST /tasks/:id/confirm.');
1050
+ await attachVisual();
1051
+ // A kind='verify' task cannot reach here without --verified: the gate above
1052
+ // exits first, so the server's verify_attestation_required can't fire below.
1053
+ const confirm = await (await cliClient()).tasks.postTasksIdConfirm({ id: taskId, body: { verified } });
1054
+ if (!confirm.ok) {
1055
+ const errObj = confirm.data && confirm.data.error;
1056
+ const errCode = typeof errObj === 'string' ? errObj : (errObj && errObj.code);
1057
+ if (confirm.status === 403 && errCode === 'permission_forbidden') {
1058
+ const details = (errObj && typeof errObj === 'object' && errObj.details) || {};
1059
+ const floor = details.floors && details.floors['task.confirm.grade_bypass'];
1060
+ // task 1003950: this branch is reached ONLY via shouldConfirmWithoutGrade,
1061
+ // which requires both an empty committed diff and an explicit --allow-empty —
1062
+ // so it is always a no-artifact close, and never a bypass of a failing grade.
1063
+ // It used to end at "ask a builder whose role holds it", which is the exact
1064
+ // dead end the bug names: a builder who knows no archon had nowhere to go.
1065
+ const escalation = await fileNoArtifactEscalation({
1066
+ // no `notes` on this path by design: regradeMain REFUSES --notes (see
1067
+ // proseFlagPresent above), so the summary is the only reason the builder gave.
1068
+ taskId, title: task && task.title, floor, summary, builder: builder.github_login,
1069
+ });
1070
+ for (const line of noArtifactRefusalLines({ taskId, floor, escalation })) console.error(line);
1071
+ process.exit(1);
1072
+ }
1073
+ console.error(`manual-confirm failed: ${apiErrorLine(confirm.data, confirm.status)}`);
1074
+ process.exit(1);
1075
+ }
1076
+ const confirmedStatus = confirm.data.taskStatus;
1077
+ printCreditsAndAchievements({
1078
+ postGradeStatus: confirmedStatus,
1079
+ credits: confirm.data.creditsAwarded ?? 0,
1080
+ creditsRaw: null,
1081
+ creditsMultiplier: null,
1082
+ ideaBonusInfo: confirm.data.ideaBonus ?? null,
1083
+ justUnlocked: confirm.data.just_unlocked || [],
1084
+ });
1085
+ // The same confirmed→shipped tail a normal ship runs, so a no-artifact resume
1086
+ // lands identically instead of stopping one step short.
1087
+ await finishShip({
1088
+ taskId, summary, advanceToMerge: confirmedStatus === 'confirmed', skipMerge, dbOnly: true,
1089
+ postGradeStatus: confirmedStatus,
1090
+ doneLine: 'Done — confirmed with no artifact (grader had nothing to read).',
1091
+ card: { title: task.title, valueSummary: summary, notes: '' },
1092
+ });
1093
+ return;
1094
+ }
1095
+ // task 1003944: the two refusals are DIFFERENT advice. 'uncommitted-work' means
1096
+ // the deliverable exists and was never committed — offering --allow-empty there
1097
+ // would be telling the builder to assert the opposite of what the tree shows,
1098
+ // which is how task 1363 shipped nothing and called it done. Only the genuinely
1099
+ // clean tree gets pointed at the flag.
1100
+ if (emptyShip.reason === 'uncommitted-work') {
1101
+ console.error('Nothing to grade: nothing is committed on this branch, but your working tree has uncommitted changes:');
1102
+ for (const f of emptyShip.uncommitted) console.error(` - ${f}`);
1103
+ console.error('');
1104
+ console.error('Your work was never committed — confirming now would mark the task "shipped" with NO artifact on main (the ledger would lie).');
1105
+ console.error('Stage + commit your work (e.g. `git add -A && git commit`), then re-run --regrade.');
1106
+ process.exit(1);
1107
+ }
1108
+ console.error(`Nothing to grade: the committed diff vs ${graderBaseline || 'baseline'} is empty.`);
1109
+ console.error('The grader reads committed history, not the working tree — commit your fixes on this branch, then re-run --regrade.');
1110
+ console.error('If this task is DELIBERATELY artifact-free (a DB-only close, an ops verification), say so:');
1111
+ console.error(` node scripts/bongos/ship.js ${taskId} --allow-empty`);
1112
+ process.exit(1);
1113
+ }
1114
+
1115
+ // ---- Persist a corrected --summary to the task row (task 1003817) ----
1116
+ // Placed HERE deliberately: after the guards that can still abort the re-grade
1117
+ // (so a refused run writes nothing), and BEFORE the grade — which is the order
1118
+ // the normal ship already has, where claim-resolve stores value_summary and
1119
+ // the panel runs afterwards. The row, the grader prompt, the merge commit and
1120
+ // the PR then all carry the same sentence.
1121
+ await persistRegradeSummary({ taskId, summaryArg, task });
1122
+ // task 1004665: the picture goes up at the same point and for the same reason
1123
+ // as the summary — after every guard that can still refuse, before the panel.
1124
+ await attachVisual();
1125
+
1126
+ // ---- Delta-aware prior-round context (task 1002662) ----
1127
+ // The prior grade's findings + the builder's response + the interim fix diff
1128
+ // ride to the panel so an already-answered finding can't re-veto on
1129
+ // re-wording alone. The interim range comes from the prior grade's
1130
+ // signals.graded_head_sha (recorded by runSubagentGrader since this task);
1131
+ // older grade rows lack it — the findings still ride, just without the diff.
1132
+ const storedGradeRow = tRes.data.grade ?? null;
1133
+ let interimCommits = '';
1134
+ let interimDiffStat = '';
1135
+ const priorSha = storedGradeRow?.signals?.graded_head_sha;
1136
+ // The sha comes from a DB JSONB blob — validate the shape before shelling out.
1137
+ if (typeof priorSha === 'string' && /^[0-9a-f]{7,40}$/i.test(priorSha) && gitOk(`git rev-parse --verify --quiet ${priorSha}`)) {
1138
+ interimCommits = gitOk(`git log --oneline ${priorSha}..HEAD`) || '';
1139
+ interimDiffStat = gitOk(`git diff --stat ${priorSha}..HEAD`) || '';
1140
+ }
1141
+ const priorRound = buildPriorRoundContext({
1142
+ storedGrade: storedGradeRow,
1143
+ responseText: responseArg,
1144
+ interimCommits,
1145
+ interimDiffStat,
1146
+ });
1147
+ if (priorRound) {
1148
+ console.log(` prior round context: ${priorRound.audit.prior_findings_count} finding(s) from the prior grade${priorRound.audit.response_present ? ' + builder response' : ''}${priorRound.audit.interim_present ? ' + interim fix diff' : ''} → round ${priorRound.audit.round}`);
1149
+ }
1150
+
1151
+ // ---- Grade step (the only step) ----
1152
+ console.log('');
1153
+ console.log('Running subagent quality grader...');
1154
+ const gradePost = await gradeAndRecord({
1155
+ taskId,
1156
+ task,
1157
+ summary,
1158
+ baseline: graderBaseline,
1159
+ committedFiles,
1160
+ priorRound,
1161
+ });
1162
+ if (!gradePost.ok) {
1163
+ console.error(`grade POST failed (${gradePost.status}):`, gradePost.data);
1164
+ console.error('Task stays at completed. Fix the issue and re-run --regrade (unlimited, no attempt cap).');
1165
+ console.error('(POST /confirm is a last resort — it is permission-gated on task.confirm.grade_bypass.)');
1166
+ process.exit(1);
1167
+ }
1168
+
1169
+ const g = gradePost.data.grade;
1170
+ recordGradeOutcome({ taskId, grade: g });
1171
+ const postGradeStatus = gradePost.data.taskStatus;
1172
+ const held = gradePost.data.held === true; // task 1004322: a page tweak's pass waits for its artist
1173
+ printGradeOutcome(g, taskId);
1174
+ printCreditsAndAchievements({
1175
+ postGradeStatus,
1176
+ credits: gradePost.data.creditsAwarded,
1177
+ creditsRaw: gradePost.data.creditsRaw ?? null,
1178
+ creditsMultiplier: gradePost.data.creditsMultiplier ?? null,
1179
+ ideaBonusInfo: gradePost.data.ideaBonus ?? null,
1180
+ justUnlocked: gradePost.data.just_unlocked || [],
1181
+ held, // task 1004379: a held pass is not 'grade not passed'
1182
+ });
1183
+
1184
+ // On a pass the task is now confirmed — run the SAME confirmed→shipped tail as a
1185
+ // normal ship (finishShip, #1093/C9) so a re-grade lands identically.
1186
+ await finishShip({
1187
+ taskId, summary, advanceToMerge: gradePost.data.advanceToMerge, skipMerge, dbOnly,
1188
+ held,
1189
+ postGradeStatus,
1190
+ doneLine: g.passed ? 'Done — re-grade passed.' : 'Done — re-grade still failing; fix and try again.',
1191
+ // task 1270: completion card for the re-grade path too.
1192
+ card: {
1193
+ title: task.title,
1194
+ valueSummary: summary,
1195
+ // Empty by design, not by omission (task 1003702). A re-grade takes no
1196
+ // --notes at all now — it is refused above — so there are none from THIS
1197
+ // round to show. The first ship's notes are the durable record and live on
1198
+ // the resolved claim; re-printing them here would suggest this round
1199
+ // produced them.
1200
+ notes: '',
1201
+ files: committedFiles,
1202
+ baseline: graderBaseline,
1203
+ creditsAwarded: gradePost.data.creditsAwarded,
1204
+ grade: { passed: g.passed, issues: g.issues || [], panel: Array.isArray(g.workers) ? g.workers.length : null },
1205
+ },
1206
+ });
1207
+ }
1208
+
1209
+ // Pure helpers are exported for unit tests (tests/session_records.mjs). The
1210
+ // orchestration only runs when ship.js is invoked directly — so `require()`ing
1211
+ // this module (a test) does NOT kick off a ship. (uploadSessionOnShip is not
1212
+ // exported: it does I/O + network and is covered by the live smoke at ship.)
1213
+
1214
+ module.exports = {
1215
+ regradeMain,
1216
+ shipMain,
1217
+ };