@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,1226 @@
1
+ // Shared helpers for GDS CLI scripts (the things the builder-* slash commands invoke).
2
+ // Renamed from PMS in V3.R01.
3
+ //
4
+ // - Reads / writes the session token at ~/.config/otb/gds-session.json
5
+ // (resolved via os.homedir(), so this works for any user on any machine).
6
+ // The legacy path ~/.config/otb/pms-session.json is still accepted on read,
7
+ // purely so any existing pre-rename session keeps working through the
8
+ // rollout — that's read-only back-compat, not a personalization.
9
+ // - Provides apiCall(method, path, body) with the auth header
10
+ // - Provides format helpers for terminal output (no deps; this isn't a TTY app,
11
+ // it's text the slash command consumes)
12
+
13
+ const fs = require('node:fs');
14
+ const fsp = require('node:fs/promises');
15
+ const path = require('node:path');
16
+ const os = require('node:os');
17
+ const { execSync } = require('node:child_process');
18
+ const ic = require('../../src/instance-config');
19
+
20
+ // Session token filenames, NEWEST FIRST. The WRITE target is the configured
21
+ // instance dir (~/.config/<configDir>/bongos-session.json; OTB → ~/.config/otb,
22
+ // unchanged). On READ we try each name across every config read dir (configured +
23
+ // legacy otb) — so a pre-rename session, or one written by a differently-
24
+ // namespaced instance, still resolves (R61 / task 1200). os.homedir() keeps it
25
+ // per-user on any machine.
26
+ //
27
+ // WHY THE OLD NAMES STAY READABLE. This file is on disk on every builder machine.
28
+ // Renaming it with no fallback signs all of them out at once and every /builder-*
29
+ // command dies with 'no Bongos session'. So a read that resolves through a
30
+ // superseded name MIGRATES forward (see loadSession), and the old file is
31
+ // deliberately LEFT IN PLACE — a builder may roll back to an older CLI, which
32
+ // can only see the old name. Part 4 (task 1003706) deletes it behind a
33
+ // test of its absence. (task 1003704)
34
+ //
35
+ // Order is FILENAME-major, not directory-major: the newest name found in ANY read
36
+ // dir beats an older name in the configured dir. That is the precedence a rename
37
+ // wants, and it is the order the two-name version of this list already used.
38
+ // The list itself lives in instance-config (the lowest module that reads the
39
+ // file, and the only one cli-lib and paste-token.js can both import).
40
+ // Destructured, not read off `ic` as a member: knip cannot trace a namespace-only
41
+ // property access on this module and reports the export dead (the same blind spot
42
+ // task 1003703 closed for two other instance-config exports).
43
+ const { SESSION_FILENAMES } = require('../../src/instance-config');
44
+ const SESSION_PATH = ic.configPath(SESSION_FILENAMES[0]);
45
+ const SESSION_READ_PATHS = SESSION_FILENAMES.flatMap((n) => ic.configReadPaths(n));
46
+ // The API base every CLI call targets, resolved ONCE through the single source of
47
+ // truth in instance-config: <PREFIX>_API_BASE (then legacy GDS_/OTB_/PMS_) → the
48
+ // persisted session's api_base → THIS instance's publicOrigin from the branding
49
+ // pack. Override for local dev / staging:
50
+ // CLOUDBONGOS_API_BASE=http://localhost:3000 node scripts/bongos/start.js
51
+ // No CLI script hard-codes another instance's URL (task 1002201; pre-ADR-0139 the
52
+ // founder instance's apex was baked in literally at four sites here). The session
53
+ // leg was added at task 1002427 — this const previously stopped at the branding
54
+ // default, so module-level consumers (reauth's Settings URL, the hall links
55
+ // hallBase() prints) named the checkout's own instance instead of the one the
56
+ // builder is signed into.
57
+ const API_BASE = ic.resolveApiBase();
58
+
59
+ // User-Agent for the GDS CLI's HTTP calls — the branding-derived neutral platform UA
60
+ // from the single source, src/branding.js userAgent() (`<repo.name|envPrefix>-gds/1.0`,
61
+ // neutral fallback `cloud-bongos-gds/1.0`), matching the `cloud-bongos-` convention the
62
+ // hooks use (tests/hook_user_agents.mjs). Was a hardcoded '<founder-instance>-gds-cli/1.0'
63
+ // at both fetch sites — task 1002234. Resolved once so apiCall + cliClient never diverge
64
+ // and branding is read a single time; falls back neutrally if branding is unreadable.
65
+ const CLI_USER_AGENT = (() => {
66
+ try { return require('../../src/branding').userAgent(); }
67
+ catch (_) { return 'cloud-bongos-gds/1.0'; }
68
+ })();
69
+
70
+ // productName() — the instance's product name for user-facing CLI copy, from the
71
+ // branding pack (task 1002428). Was hardcoded as the founder brand at several
72
+ // print sites, so a non-OTB instance told ITS builders about someone else's
73
+ // product. Neutral fallback, never a foreign brand.
74
+ function productName() {
75
+ try {
76
+ const id = require('../../src/branding').branding().identity || {};
77
+ if (id.productName) return id.productName;
78
+ } catch (_) { /* fall through */ }
79
+ return 'Cloud Bongos';
80
+ }
81
+
82
+ // rewardPolicy() — the instance's RESOLVED reward policy (ADR 0146), for CLI copy
83
+ // that prints a task's `credits_reward`. On a `cost-plus-only` instance that
84
+ // number is an advertised GUIDE and is never paid; the cost-plus session reward
85
+ // is the sole stream. Printing it bare reads as a promise, and a builder who
86
+ // then ships and sees `+0` reasonably concludes the payout broke (it cost a real
87
+ // session on 2026-07-26 — task 1002469).
88
+ //
89
+ // PREFER THE SERVER'S ANSWER. The mode is INSTANCE config, and an instance's
90
+ // config/branding.json is NOT in the builder's checkout — a laptop resolving
91
+ // locally sees only config/branding.neutral.json and would report the paying
92
+ // default on the very instance that withholds. So callers pass the `reward`
93
+ // block the server sends (GET /me, POST /claims); the local read is a fallback
94
+ // for an older server that doesn't send one, and the ADR default is the floor.
95
+ // Resolution itself is always economy's (ADR 0146) — never re-derived here.
96
+ function rewardPolicy(fromServer) {
97
+ if (fromServer && typeof fromServer.mode === 'string') {
98
+ return { mode: fromServer.mode, perTaskCredit: fromServer.perTaskCredit !== false };
99
+ }
100
+ try {
101
+ // economy's PURE resolver + our own branding read, NOT ./credits (task
102
+ // 1003676): credits.js imports { pool, branding } from src/module-api at
103
+ // module scope, so this one fallback require used to drag Postgres + auth +
104
+ // db-kernel into EVERY CLI subcommand's closure — which is what stopped the
105
+ // CLI shipping as a public, client-only package. Same resolver, same answer,
106
+ // no server. The CLI is not a module, so reading src/branding directly here
107
+ // is allowed where it would not be inside modules/ (ADR 0083).
108
+ const { rewardPolicy: resolve } = require('../../modules/economy/reward-policy');
109
+ let raw = {};
110
+ try { raw = (require('../../src/branding').branding().reward) || {}; } catch (_) { raw = {}; }
111
+ const p = resolve(raw);
112
+ if (p && typeof p.mode === 'string') return p;
113
+ } catch (_) { /* fall through */ }
114
+ return { mode: 'cost-plus-and-estimate', perTaskCredit: true };
115
+ }
116
+
117
+ // The one-line builder-facing explanation shown wherever an estimate is
118
+ // displayed on a cost-plus-only instance. Returns null on a paying instance so
119
+ // every call site is a no-op there. Single source for the wording so claim /
120
+ // start / ship say the SAME thing (task 1002469).
121
+ function costPlusOnlyNote(fromServer) {
122
+ if (rewardPolicy(fromServer).perTaskCredit) return null;
123
+ return 'This instance pays cost-plus only: you earn real session cost + 20%, not the estimate above.';
124
+ }
125
+
126
+ // hallBase(base) — the instance's builders' hall root for a given API base, e.g.
127
+ // https://cloudbongos.com/builders. Derived from the RESOLVED base (env → session →
128
+ // branding default), never a hardcoded host — so a CLI-printed link always points at
129
+ // the instance the command is actually talking to, not the founder instance's box
130
+ // (task 1002233; the printed-link twin of the task-1002201 default-base fix). Falls
131
+ // back to `${base}/builders` when base isn't a parseable absolute URL.
132
+ function hallBase(base = API_BASE) {
133
+ try { return `${new URL(base).origin}/builders`; }
134
+ catch { return `${String(base || '').replace(/\/+$/, '')}/builders`; }
135
+ }
136
+
137
+ // Node-24-on-Windows workaround: every CLI invocation here is a short-lived
138
+ // process that makes one or a handful of requests, but a kept-alive socket can
139
+ // still be mid-close when the caller's process.exit() runs, tripping a
140
+ // UV_HANDLE_CLOSING assertion that corrupts piped JSON stdout. Connection reuse
141
+ // buys these one-shot processes nothing, so route requests through a dispatcher
142
+ // with keep-alive effectively disabled. Degrades to the default dispatcher if
143
+ // undici can't be required.
144
+ //
145
+ // task 1002734 — THIS ALONE IS NOT ENOUGH, and the measurements say so: with the
146
+ // dispatcher wired in and undici resolving fine, `node scripts/bongos/api.js GET
147
+ // /tasks/<id>` still aborted 5/5 on Windows 11 / Node 24. The dispatcher removes
148
+ // one contributing handle; the actual trigger is calling process.exit() at all
149
+ // while the request machinery is still tearing down. A minimal synthetic
150
+ // fetch-then-exit does NOT reproduce, so it takes the real stack (the dynamic ESM
151
+ // client import + the Agent + any child spawn / consumed stdin) to line up — which
152
+ // is exactly why hunting the single guilty handle is a dead end.
153
+ //
154
+ // The rule for every CLI here: after a request, DO NOT call process.exit().
155
+ // Set process.exitCode and return, and let the loop drain — see cliExit below.
156
+ // Verified: the pre-push gate went 8/8 aborting to 0/8 on that change alone
157
+ // (task 1002725), and api.js 5/5 to 0/5 (this task).
158
+ let _noKeepAliveDispatcher;
159
+ let _noKeepAliveTried = false;
160
+ function noKeepAliveDispatcher() {
161
+ if (_noKeepAliveTried) return _noKeepAliveDispatcher;
162
+ _noKeepAliveTried = true;
163
+ try {
164
+ const { Agent } = require('undici');
165
+ _noKeepAliveDispatcher = new Agent({ keepAliveTimeout: 1, keepAliveMaxTimeout: 1 });
166
+ } catch { _noKeepAliveDispatcher = undefined; }
167
+ return _noKeepAliveDispatcher;
168
+ }
169
+
170
+ // task 1002670 — the vendored Agent above is only valid as a `dispatcher` for
171
+ // Node's built-in fetch when the two undici copies speak the same internal
172
+ // handler protocol. Node 26 bundles undici 8 while package.json overrides pin
173
+ // the vendored copy at ^6, so built-in fetch rejects the v6 Agent with
174
+ // InvalidArgumentError('invalid onError method') / UND_ERR_INVALID_ARG *before
175
+ // any network I/O* — and every CLI then misreported a pure client-side bug as
176
+ // "this instance isn't reachable yet". The pairing can't be predicted from
177
+ // version numbers alone (a v6 Agent works fine under Node 24's undici 7), so
178
+ // the selection is empirical: try the vendored Agent, and on the first
179
+ // incompat rejection drop it for the rest of the process and retry the request
180
+ // once on the default dispatcher.
181
+ function isDispatcherIncompatError(err) {
182
+ const seen = new Set();
183
+ for (let e = err; e && typeof e === 'object' && !seen.has(e); e = e.cause) {
184
+ seen.add(e);
185
+ if (e.code === 'UND_ERR_INVALID_ARG' || e.name === 'InvalidArgumentError') return true;
186
+ }
187
+ return false;
188
+ }
189
+
190
+ // Test-only: reset the tried-once singleton so tests/cli_dispatcher.mjs can
191
+ // exercise the selection/fallback from a clean slate regardless of what earlier
192
+ // (real) requests did to it on this Node version.
193
+ function _noKeepAliveResetForTest() {
194
+ _noKeepAliveDispatcher = undefined;
195
+ _noKeepAliveTried = false;
196
+ }
197
+
198
+ async function dispatchedFetch(url, init = {}, fetchImpl = fetch) {
199
+ const injected = init.dispatcher !== undefined && init.dispatcher === _noKeepAliveDispatcher;
200
+ try {
201
+ return await fetchImpl(url, init);
202
+ } catch (err) {
203
+ if (!injected || !isDispatcherIncompatError(err)) throw err;
204
+ // The vendored Agent is incompatible with this Node's built-in fetch.
205
+ // Stop offering it process-wide, then retry on the default dispatcher.
206
+ _noKeepAliveDispatcher = undefined;
207
+ const retry = { ...init };
208
+ delete retry.dispatcher;
209
+ return fetchImpl(url, retry);
210
+ }
211
+ }
212
+
213
+ // cliExit(code) — the post-request replacement for process.exit(code). Records the
214
+ // exit status and lets node exit naturally once the loop drains, which is what
215
+ // keeps the UV_HANDLE_CLOSING abort above from firing. Callers must `return` after
216
+ // calling it: unlike process.exit() it does NOT stop execution.
217
+ //
218
+ // Gotcha (learned in task 1002725): a hard exit MASKS leaked timers/handles. Once a
219
+ // CLI exits naturally, anything still armed — an uncleared setTimeout, an open
220
+ // interval — keeps the process alive. Clear them, or the CLI hangs instead of
221
+ // crashing.
222
+ function cliExit(code = 0) {
223
+ process.exitCode = code;
224
+ }
225
+
226
+ async function readSessionFile(p) {
227
+ try {
228
+ const raw = await fsp.readFile(p, 'utf8');
229
+ return JSON.parse(raw);
230
+ } catch (err) {
231
+ if (err.code === 'ENOENT') return null;
232
+ throw err;
233
+ }
234
+ }
235
+
236
+ // Copy a session that resolved through a SUPERSEDED path forward to SESSION_PATH,
237
+ // so the next command reads the new name directly instead of walking the fallback
238
+ // list forever. The old file is left in place on purpose (see SESSION_FILENAMES).
239
+ //
240
+ // BEST-EFFORT BY DESIGN: a read-only home, a full disk, or a permissions problem
241
+ // must never turn a working loadSession() into a failing command. The caller
242
+ // already holds a valid session; failing to write the copy changes nothing about
243
+ // this invocation. So every error is swallowed and the session is still returned.
244
+ async function migrateSessionFile(session) {
245
+ try {
246
+ await fsp.mkdir(path.dirname(SESSION_PATH), { recursive: true });
247
+ await fsp.writeFile(SESSION_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });
248
+ return true;
249
+ } catch (_) {
250
+ return false;
251
+ }
252
+ }
253
+
254
+ async function loadSession() {
255
+ // Try each read path in priority order (configured dir's bongos-session.json,
256
+ // legacy otb dir, then each superseded filename across the same dirs). A hit on
257
+ // anything OTHER than SESSION_PATH is migrated forward — SESSION_READ_PATHS[0]
258
+ // IS SESSION_PATH (configReadDirs puts the configured dir first), so the common
259
+ // case writes nothing.
260
+ for (const p of SESSION_READ_PATHS) {
261
+ const s = await readSessionFile(p);
262
+ if (s) {
263
+ if (p !== SESSION_PATH) await migrateSessionFile(s);
264
+ return s;
265
+ }
266
+ }
267
+ return null;
268
+ }
269
+
270
+ // ---- the shared session store (task 1003741, ADR 0269) ---------------------
271
+ // ONE FILE PER INSTANCE, at a FIXED anchor — deliberately NOT configHome().
272
+ //
273
+ // WHY A FIXED ANCHOR. configHome() is brand-derived, and the brand is read out of whatever checkout
274
+ // the process is standing in. That gave the CLI exactly one session slot, and the slot MOVED: run
275
+ // standalone (the then-public @cloudbongos/cli's whole situation; ADR 0324 retired it) the brand
276
+ // cannot resolve, so every
277
+ // instance shared one gds-session.json and signing into a second DESTROYED the first; run from
278
+ // inside an instance repo and the session landed in ~/.config/<slug>/ where the standalone CLI
279
+ // could never find it. The owner's own config dir carries a hand-made `hermeslines-clobber` backup
280
+ // from the first mode.
281
+ //
282
+ // WHY HERE AND NOT instance-config.js. That module is generic config-path machinery shared with the
283
+ // server; a CLI session store is not its concern, and cli-lib already owns SESSION_PATH and
284
+ // SESSION_READ_PATHS. Keeping the two together means one file describes where a session lives.
285
+ function sessionStoreDir() {
286
+ // Directory name deliberately NOT 'sessions': that is a live module key, and ADR 0083
287
+ // §Decision #4 forbids naming one in shared machinery. 'instances' is the truer name anyway —
288
+ // one file per instance is exactly what this holds.
289
+ return path.join(os.homedir(), '.config', ic.FALLBACK_DIR, 'instances');
290
+ }
291
+
292
+ // The store's filename for an instance, derived from its api_base host. Returns null when the base
293
+ // names no host — an unkeyable session is simply not stored, never stored under a guessed name.
294
+ function sessionHostKey(apiBase) {
295
+ const raw = String(apiBase || '').trim();
296
+ if (!raw) return null;
297
+ let host = null;
298
+ try { host = new URL(raw).host; } catch (_) { host = null; }
299
+ if (!host) return null;
300
+ // Filename-safe, and collision-free for real hosts: ':' (a port) is the only character a valid
301
+ // host adds beyond the safe set, and it maps to '_' which cannot otherwise appear in one.
302
+ const safe = host.replace(/[^A-Za-z0-9._-]/g, '_');
303
+ return safe && safe !== '.' && safe !== '..' ? safe : null;
304
+ }
305
+
306
+ function sessionStorePath(apiBase) {
307
+ const key = sessionHostKey(apiBase);
308
+ return key ? path.join(sessionStoreDir(), `${key}.json`) : null;
309
+ }
310
+
311
+ // Write one session into the shared, host-keyed store. No-op when the session names no host —
312
+ // an unkeyable session is skipped, never filed under a guessed name.
313
+ async function writeSessionToStore(session) {
314
+ const target = session && sessionStorePath(session.api_base);
315
+ if (!target) return null;
316
+ await fsp.mkdir(path.dirname(target), { recursive: true });
317
+ await fsp.chmod(path.dirname(target), 0o700).catch(() => {});
318
+ await fsp.writeFile(target, JSON.stringify(session, null, 2), { mode: 0o600 });
319
+ return target;
320
+ }
321
+
322
+ // Every instance's session is kept, not just the last one (task 1003741).
323
+ //
324
+ // This used to write ONE file, so `bongos login <another-instance>` silently DESTROYED the session
325
+ // you already had — the owner's own config dir carries a hand-made `hermeslines-clobber` backup
326
+ // from exactly that. Three steps now, and the order matters:
327
+ //
328
+ // 1. archive the OUTGOING session first. That is what rescues a session written before the store
329
+ // existed: it was never in the store, so without this step the very first login after
330
+ // upgrading would still lose it.
331
+ // 2. store the incoming one under its own host.
332
+ // 3. write the ACTIVE pointer exactly where it has always gone, so every existing reader —
333
+ // in-repo skills and hooks — behaves identically.
334
+ async function saveSession(session) {
335
+ const dir = path.dirname(SESSION_PATH);
336
+ await fsp.mkdir(dir, { recursive: true });
337
+
338
+ try {
339
+ const prev = await loadSession();
340
+ const prevKey = prev && prev.token ? sessionHostKey(prev.api_base) : null;
341
+ const nextKey = sessionHostKey(session && session.api_base);
342
+ if (prevKey && prevKey !== nextKey) await writeSessionToStore(prev);
343
+ } catch (_) {
344
+ // Archiving is best-effort — a lost previous session must never block a real sign-in.
345
+ }
346
+
347
+ await writeSessionToStore(session).catch(() => null);
348
+ await fsp.writeFile(SESSION_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });
349
+ }
350
+
351
+ // The stored session for one instance, or null. Used by `bongos login` to switch back to an
352
+ // instance you are already signed into without a fresh device flow.
353
+ async function loadStoredSession(apiBase) {
354
+ const target = sessionStorePath(apiBase);
355
+ if (!target) return null;
356
+ return readSessionFile(target);
357
+ }
358
+
359
+ // Every instance this machine has a stored session for — so the CLI can say which one it is
360
+ // targeting and what else it remembers. Sorted for a stable listing; never throws.
361
+ function listStoredSessions() {
362
+ let names = [];
363
+ try { names = fs.readdirSync(sessionStoreDir()); } catch (_) { return []; }
364
+ const out = [];
365
+ for (const name of names) {
366
+ if (!name.endsWith('.json')) continue;
367
+ try {
368
+ const j = JSON.parse(fs.readFileSync(path.join(sessionStoreDir(), name), 'utf8'));
369
+ if (j && j.token) {
370
+ out.push({
371
+ host: name.slice(0, -5),
372
+ api_base: j.api_base || null,
373
+ login: (j.builder && j.builder.github_login) || null,
374
+ instance: (j.instance && j.instance.name) || null,
375
+ });
376
+ }
377
+ } catch (_) { /* a corrupt entry is skipped, never fatal */ }
378
+ }
379
+ return out.sort((a, b) => a.host.localeCompare(b.host));
380
+ }
381
+
382
+ function loadSessionSync() {
383
+ for (const p of SESSION_READ_PATHS) {
384
+ if (!fs.existsSync(p)) continue;
385
+ try {
386
+ return JSON.parse(fs.readFileSync(p, 'utf8'));
387
+ } catch (_) {
388
+ /* try next */
389
+ }
390
+ }
391
+ return null;
392
+ }
393
+
394
+ // ---- argv helpers (C11) ---------------------------------------------------
395
+ // One home for the flag parsing every GDS CLI rolled by hand. Two contracts:
396
+ // arg(name) → the flag's VALUE ('--out x' or '--out=x'), else null
397
+ // hasFlag(name) → boolean presence ('--json', '--no-write')
398
+ // Both default `args` to process.argv.slice(2). arg() accepts BOTH the space and
399
+ // `=` forms (the superset — space-only callers gain `=` for free, harmlessly).
400
+ // A presence flag wants hasFlag(), NOT arg() — they are opposite contracts
401
+ // (repo-metrics.js learned this the hard way; do not collapse the two).
402
+ function arg(name, args = process.argv.slice(2)) {
403
+ const eq = args.find((a) => a.startsWith(`${name}=`));
404
+ if (eq != null) return eq.slice(name.length + 1);
405
+ const i = args.indexOf(name);
406
+ return i >= 0 ? args[i + 1] : null;
407
+ }
408
+
409
+ function hasFlag(name, args = process.argv.slice(2)) {
410
+ return args.includes(name);
411
+ }
412
+
413
+ // stripBom(s) — remove a leading UTF-8 BOM (U+FEFF), the artifact PowerShell's
414
+ // `Out-File`/`>` redirection writes. JSON.parse does not strip it, so a
415
+ // --body-file written from PS 5.1 fails to parse unless this runs first.
416
+ // Non-string input passes through unchanged. Extracted (rather than left
417
+ // inline in api.js) so it's unit-testable — api.js itself has no exports.
418
+ function stripBom(s) {
419
+ if (typeof s !== 'string') return s;
420
+ return s.charCodeAt(0) === 0xfeff ? s.slice(1) : s;
421
+ }
422
+
423
+ // argText(name, args, io) — resolve prose passed EITHER inline (`--notes "..."`)
424
+ // or from a file (`--notes-file path`, or `-` for stdin). Returns
425
+ // { value, source, error }: `value` is a string ('' when neither flag is
426
+ // present), `source` is 'inline' | 'file' | 'stdin' | 'none', and `error` is a
427
+ // caller-printable string when the request was refused or unreadable.
428
+ //
429
+ // WHY THIS EXISTS (learning 1000197). Prose handed to a CLI inline goes through
430
+ // the SHELL first. A handoff note containing backticks — which technical prose
431
+ // constantly does — is command-substituted by bash before node ever runs: the
432
+ // backticked span executes, its output replaces it, and the rest of the argument
433
+ // list is truncated. That is not a theoretical hazard; it silently shipped a task
434
+ // with EMPTY notes and no summary, so the ledger recorded nothing about a session
435
+ // that had happened. A file argument is the only form the shell cannot rewrite.
436
+ //
437
+ // BOTH-GIVEN IS AN ERROR, never a silent precedence. Picking one would mean the
438
+ // caller's other input vanished without a word — the same class of quiet loss
439
+ // this helper exists to end (the capture.js --spark/--full refusal precedent).
440
+ function argText(name, args = process.argv.slice(2), io = {}) {
441
+ const readFile = io.readFile || ((f) => require('fs').readFileSync(f, 'utf8'));
442
+ const readStdin = io.readStdin || (() => require('fs').readFileSync(0, 'utf8'));
443
+ const fileFlag = `${name}-file`;
444
+ const inline = arg(name, args);
445
+ // arg() returns undefined (not null) for a flag present as the LAST token, so
446
+ // presence must be tested separately — otherwise `--notes-file` with no path
447
+ // slips past the null check and resolves to an empty string, which is the very
448
+ // silent-empty outcome this helper exists to prevent.
449
+ const filePresent = args.includes(fileFlag) || args.some((a) => a.startsWith(`${fileFlag}=`));
450
+ const file = filePresent ? arg(fileFlag, args) : null;
451
+
452
+ if (inline != null && filePresent) {
453
+ return {
454
+ value: '', source: 'none',
455
+ error: `${name} and ${fileFlag} were both given. Pass one — ${fileFlag} is the safe form for prose `
456
+ + '(a shell rewrites backticks in an inline value before node sees it). Refusing rather than '
457
+ + 'silently picking one, so nothing you wrote is dropped without a word.',
458
+ };
459
+ }
460
+ if (filePresent) {
461
+ if (file == null || file === '' || file.startsWith('--')) {
462
+ return { value: '', source: 'none', error: `${fileFlag} needs a path (or - for stdin).` };
463
+ }
464
+ try {
465
+ const raw = file === '-' ? readStdin() : readFile(file);
466
+ return { value: stripBom(String(raw)), source: file === '-' ? 'stdin' : 'file', error: null };
467
+ } catch (err) {
468
+ return { value: '', source: 'none', error: `could not read ${fileFlag} ${file}: ${err.message}` };
469
+ }
470
+ }
471
+ if (inline != null) return { value: inline, source: 'inline', error: null };
472
+ return { value: '', source: 'none', error: null };
473
+ }
474
+
475
+ // resolveQuiet(args, env) — true when api.js's stderr status banner should be
476
+ // suppressed: the --quiet flag or the GDS_QUIET env var. Both default to the
477
+ // live process, matching hasFlag()'s own default-args contract. Default OFF —
478
+ // existing pipelines that scrape the banner off stderr are unaffected.
479
+ function resolveQuiet(args = process.argv.slice(2), env = process.env) {
480
+ return hasFlag('--quiet', args) || !!env.GDS_QUIET;
481
+ }
482
+
483
+ // readSessionToken() — the { token, apiBase } a token-only raw fetch needs, read
484
+ // synchronously from the session file. apiBase resolves the one way every base
485
+ // resolution does — <PREFIX>_API_BASE (incl. legacy GDS_/PMS_) || session.api_base
486
+ // || the branding default — via ic.resolveApiBase, passing the session we already
487
+ // loaded so it needs no second disk read (task 1002427). Returns null when not
488
+ // signed in. Callers that must FAIL OPEN (e.g. the sound player) use this + their
489
+ // own fetch rather than apiCall (which exits on 401).
490
+ function readSessionToken() {
491
+ const j = loadSessionSync();
492
+ if (!j || !j.token) return null;
493
+ return {
494
+ token: j.token,
495
+ apiBase: ic.resolveApiBase({ session: j }),
496
+ };
497
+ }
498
+
499
+ // Track whether we've already surfaced an auth-broken message this process so
500
+ // repeated calls (e.g. a script that fires several apiCalls in a row) only
501
+ // print the helpful guidance once before exiting.
502
+ let _unauthExitInFlight = false;
503
+
504
+ function printUnauthGuidanceAndExit() {
505
+ // Stable, single-screen guidance. Builders should see exactly this when
506
+ // their CLI session breaks — no raw API JSON, no stack trace.
507
+ console.error('');
508
+ console.error('✖ Your Bongos CLI session is no longer valid.');
509
+ console.error('');
510
+ if (isTerminalSurface()) {
511
+ // No checkout here, so `node scripts/bongos/*.js` is not a path this reader has (task 1003730).
512
+ console.error(` Recover the fast (UI-first) way — run ${surfaceAction('reauth')}`);
513
+ console.error(' (opens your Settings page; under "CLI Access" click "Re-issue CLI');
514
+ console.error(' token", copy the one-liner, paste it back — no terminal Device Flow.)');
515
+ console.error(' Fallback (browser sign-in): npx bongos login <instance-url>');
516
+ } else {
517
+ console.error(' Recover the fast (UI-first) way — run /builder-reauth, or:');
518
+ console.error(' node scripts/bongos/reauth.js');
519
+ console.error(' (opens your Settings page; under "CLI Access" click "Re-issue CLI');
520
+ console.error(' token", copy the one-liner, paste it back — no terminal Device Flow.)');
521
+ console.error(' Fallback (terminal Device Flow): node scripts/bongos/setup.js --force');
522
+ }
523
+ console.error('');
524
+ console.error(' Possible causes:');
525
+ console.error(' - Your token was revoked — by you ("Sign out everywhere") or by an Archon');
526
+ console.error(' - A recent deploy applied an auth-changing migration (see deploy banner)');
527
+ console.error(' - This instance is older than ADR 0294 and still expires idle CLI sessions');
528
+ console.error('');
529
+ console.error(' Once re-authed, re-run whichever command you were trying.');
530
+ // `doctor` is checkout-only — it is not one of the public CLI's verbs (ADR 0258).
531
+ if (!isTerminalSurface()) console.error(' For a full diagnosis, run: node scripts/bongos/doctor.js');
532
+ for (const line of plainCardLines('session_invalid')) console.error(line);
533
+ console.error('');
534
+ process.exit(2);
535
+ }
536
+
537
+
538
+ // ---- fail-closed instance guard (task 2102) --------------------------------
539
+ // A half-configured instance folder used to fail THROUGH: with no local session
540
+ // for ITS OWN origin, the CLI fell back to whatever instance the machine last
541
+ // signed into (session.api_base, else the prod default) and acted THERE. On
542
+ // 2026-07-08 a fresh `demo` clone (config/branding → demo.cloudbongos.com), with
543
+ // no demo session on the machine, borrowed the founder instance's session
544
+ // and offered to write a task into the wrong LIVE backlog. A wrong-instance write
545
+ // is a data-integrity hazard, so we fail CLOSED: if the session we'd authenticate
546
+ // with belongs to a different instance than THIS repo is configured for, refuse
547
+ // and point at the fix. (Inert for a correctly-signed-in instance — OTB's session
548
+ // api_base and branding publicOrigin share a host, so this never fires there.)
549
+
550
+ function safeBranding() {
551
+ try { return require('../../src/branding').branding() || {}; }
552
+ catch { return {}; }
553
+ }
554
+
555
+ // True when THIS checkout declares an instance identity — i.e. config/branding.json
556
+ // exists. A NEUTRAL checkout (the portable core, or a fresh template carrying only
557
+ // branding.neutral.json) returns false: its resolved publicOrigin is just the neutral
558
+ // placeholder, not a real declared instance, so there is nothing to enforce a session
559
+ // against. Injectable so the pure guard stays unit-testable. (task 1002399, area 2)
560
+ function defaultHasInstanceConfig() {
561
+ try {
562
+ const { INSTANCE_PATH } = require('../../src/branding');
563
+ return !!(INSTANCE_PATH && fs.existsSync(INSTANCE_PATH));
564
+ } catch { return false; }
565
+ }
566
+
567
+ // Host of an origin string, or null if unparseable. Comparing HOSTS (not full
568
+ // origins) tolerates scheme / trailing-slash noise between branding + session.
569
+ function instanceOriginHost(origin) {
570
+ try { return new URL(String(origin)).host || null; }
571
+ catch { return null; }
572
+ }
573
+
574
+ // PURE + exported for tests. Decide whether the session we'd use targets a
575
+ // DIFFERENT instance than this repo is configured for. Fails OPEN (no mismatch)
576
+ // when: an explicit <PREFIX>_API_BASE override is set (dev/staging — the operator
577
+ // is deliberately steering the base); OR there is no session (nothing to borrow —
578
+ // the no-session/401 path handles that); OR this checkout is NEUTRAL (no
579
+ // config/branding.json — no declared instance to enforce, so trust the session:
580
+ // this is what lets a neutral core checkout run every /builder-* command with NO
581
+ // <PREFIX>_API_BASE prefix — task 1002399); OR the repo declares no publicOrigin
582
+ // (unknown identity — you can't assert a mismatch you can't define). Otherwise the
583
+ // mismatch is expectedHost !== sessionHost — the guard that still fires for a
584
+ // BRANDED checkout whose session points at a different instance (the 2026-07-08
585
+ // hazard).
586
+ function detectInstanceMismatch({ session, brand = safeBranding(), env = process.env, hasInstanceConfig = defaultHasInstanceConfig } = {}) {
587
+ if (ic.resolveEnv('API_BASE', { env })) return { mismatch: false };
588
+ if (!session || !session.api_base) return { mismatch: false };
589
+ if (!hasInstanceConfig()) return { mismatch: false };
590
+ const expected = brand && brand.domains && brand.domains.publicOrigin;
591
+ if (!expected) return { mismatch: false };
592
+ const expectedHost = instanceOriginHost(expected);
593
+ const actualHost = instanceOriginHost(session.api_base);
594
+ if (!expectedHost || !actualHost) return { mismatch: false };
595
+ return { mismatch: expectedHost !== actualHost, expected, actual: session.api_base };
596
+ }
597
+
598
+ let _instanceMismatchExitInFlight = false;
599
+
600
+ function printInstanceMismatchAndExit({ expected, actual }) {
601
+ const pfx = ic.envPrefix();
602
+ console.error('');
603
+ console.error('✖ Wrong instance — refusing to act.');
604
+ console.error(' This project is configured for one Cloud Bongos instance, but your signed-in');
605
+ console.error(' session belongs to a different one. Acting would write to the wrong place, so');
606
+ console.error(' I stop here (a wrong-instance write is worse than doing nothing).');
607
+ console.error('');
608
+ console.error(` This project (config/branding.json): ${expected}`);
609
+ console.error(` Your session is signed in to: ${actual}`);
610
+ console.error('');
611
+ console.error(' Sign in to THIS instance, then re-run your command:');
612
+ console.error(` npx bongos login ${expected}`);
613
+ console.error(` (or, from a checkout without the bongos bin: node scripts/bongos/login.js ${expected})`);
614
+ console.error('');
615
+ console.error(' Intentionally targeting another instance? Set the base explicitly, e.g.');
616
+ console.error(` ${pfx}_API_BASE=${actual} <your command>`);
617
+ for (const line of plainCardLines('instance_mismatch')) console.error(line);
618
+ console.error('');
619
+ process.exit(3); // 3 = instance mismatch (distinct from 2 = unauth)
620
+ }
621
+
622
+ // Fail-closed instance guard for RAW-fetch READ commands (task 2124 / demo-audit C2).
623
+ // apiCall + cliClient guard themselves, but a command that reaches the API through its
624
+ // OWN fetch bypasses that — the 2026-07-08 demo hit exactly this: `bongos status` used a
625
+ // raw fetch(API_BASE/…) and happily printed the MAIN instance's progress while sitting in
626
+ // the demo repo, giving false confidence, while the write path correctly refused. Such a
627
+ // command must call this first. Inert when there is no session, when API_BASE is overridden,
628
+ // or when the session's instance matches this repo's branding — it only fires on a genuine
629
+ // wrong-instance session. Reuses the same detector + message as the write-side guard.
630
+ async function assertInstanceMatch({ allowInstanceMismatch = false } = {}) {
631
+ if (allowInstanceMismatch || _instanceMismatchExitInFlight) return;
632
+ const session = await loadSession();
633
+ const mm = detectInstanceMismatch({ session });
634
+ if (mm.mismatch) {
635
+ _instanceMismatchExitInFlight = true;
636
+ printInstanceMismatchAndExit(mm);
637
+ }
638
+ }
639
+
640
+ /**
641
+ * Make an authenticated request to the GDS API.
642
+ *
643
+ * Default behavior on HTTP 401: print clear actionable guidance and exit(2).
644
+ * Callers can opt out by passing { allowUnauthenticated: true } when 401 is a
645
+ * legitimate response they want to handle (e.g. setup.js pre-flighting /me to
646
+ * decide whether to re-auth automatically).
647
+ */
648
+ async function apiCall(method, urlPath, body = null, opts = {}) {
649
+ const { allowUnauthenticated = false, allowInstanceMismatch = false } = opts;
650
+ const session = await loadSession();
651
+ // Fail CLOSED (task 2102) if the session we'd authenticate with belongs to a
652
+ // different instance than this repo is configured for — never silently borrow
653
+ // another instance's credentials. Opt out with { allowInstanceMismatch: true }
654
+ // for a deliberate cross-instance caller (login.js talks to other instances via
655
+ // its own fetch, so it never reaches here).
656
+ if (!allowInstanceMismatch && !_instanceMismatchExitInFlight) {
657
+ const mm = detectInstanceMismatch({ session });
658
+ if (mm.mismatch) {
659
+ _instanceMismatchExitInFlight = true;
660
+ printInstanceMismatchAndExit(mm);
661
+ }
662
+ }
663
+ // Instance-agnostic base (V4.R83 / task 1250): `bongos login <instance>` writes
664
+ // that instance's origin to session.api_base, so every later command targets it.
665
+ // Precedence mirrors readSessionToken: an explicit <PREFIX>_API_BASE env wins
666
+ // (local dev / staging override), then the logged-in instance, then prod. OTB
667
+ // sessions already store the founder instance's api_base, so this is a no-op
668
+ // for the OTB instance and only bites once someone logs in to a different one.
669
+ const base = ic.resolveApiBase({ session: session || null });
670
+ const headers = {
671
+ 'Content-Type': 'application/json',
672
+ 'User-Agent': CLI_USER_AGENT,
673
+ };
674
+ if (session && session.token) {
675
+ headers['Authorization'] = `Bearer ${session.token}`;
676
+ }
677
+ // The Anthropic-identity pin was removed (task 1039, idea 258): we no longer
678
+ // send X-Anthropic-User, because the server no longer cross-checks it. The
679
+ // reward is a uniform server-side valuation (ADR 0054), not per-Anthropic-
680
+ // account billing, so identity is not an auth boundary. anthropic_user_id is
681
+ // still kept in the session as cosmetic attribution; it is simply not
682
+ // transmitted as a header.
683
+ // opts.rawBody (a Buffer) + opts.contentType send bytes instead of JSON — a
684
+ // UAT recording upload (task 1004392), whose route reads a raw video body.
685
+ if (opts.rawBody) headers['Content-Type'] = opts.contentType || 'application/octet-stream';
686
+ const res = await dispatchedFetch(`${base}${urlPath}`, {
687
+ method,
688
+ headers,
689
+ body: opts.rawBody ? opts.rawBody : (body ? JSON.stringify(body) : null),
690
+ dispatcher: noKeepAliveDispatcher(),
691
+ });
692
+ const text = await res.text();
693
+ let data;
694
+ try {
695
+ data = text ? JSON.parse(text) : null;
696
+ } catch (_) {
697
+ data = { raw: text };
698
+ }
699
+ if (res.status === 401 && !allowUnauthenticated && !_unauthExitInFlight) {
700
+ _unauthExitInFlight = true;
701
+ printUnauthGuidanceAndExit();
702
+ }
703
+ return { status: res.status, ok: res.ok, data };
704
+ }
705
+
706
+ // task 1996 (R09): the ONE HTTP client. cliClient() returns the generated typed
707
+ // client (clients/bongos-client — ADR 0118) configured for the CLI:
708
+ // • baseUrl — the session-resolved instance origin + the versioned API prefix
709
+ // (/api/bongos/v1), so paths are the spec-relative /tasks/… form.
710
+ // • token — the session bearer.
711
+ // • throwOnError:false — every call resolves to { status, ok, data } (never
712
+ // throws on HTTP status; network errors still reject), so the long-standing
713
+ // apiCall contract holds and status-inspecting callers port 1:1.
714
+ // • fetch — a wrapper that keeps apiCall's behavior: the founder CLI
715
+ // User-Agent, plus the 401 auto-exit guidance.
716
+ // Named methods (api.tasks.getTasksId({ id })) replace hand-built apiCall paths;
717
+ // api.request(method, path, opts) is the escape hatch for non-spec routes.
718
+ // The generated client is ESM; we import() it once and cache per (base, token,
719
+ // opts) — CommonJS callers just `const api = await cliClient()`.
720
+ let _clientModPromise = null;
721
+ const _clientCache = new Map();
722
+
723
+ // Generate the typed client into this core's own root when it is missing (task 1004866:
724
+ // gitignored; a fresh clone has no copy). Only when MISSING: an installed core ships its
725
+ // packaged copy and may sit on a read-only path, and a dev checkout's copy is refreshed by
726
+ // `node scripts/bongos/api-artifacts.js`. A failure is left to the import below to report.
727
+ function ensureCliClientFile({ root = path.resolve(__dirname, '..', '..'), exists = fs.existsSync, ensure } = {}) {
728
+ if (exists(path.join(root, 'clients', 'bongos-client', 'index.mjs'))) return false;
729
+ try {
730
+ (ensure || require('./api-artifacts.js').ensureApiArtifacts)({ root });
731
+ return true;
732
+ } catch (e) {
733
+ console.error(`bongos: could not generate the API client (${e.message}) — run \`node scripts/bongos/api-artifacts.js\`.`);
734
+ return false;
735
+ }
736
+ }
737
+ async function cliClient(opts = {}) {
738
+ const { allowUnauthenticated = false, allowInstanceMismatch = false } = opts;
739
+ const session = await loadSession();
740
+ // Fail CLOSED (task 2102) — the same guard as apiCall, on the OTHER HTTP entry
741
+ // point. cliClient() is the typed client (api.js + newer scripts route through
742
+ // it), and it resolves the base identically, so it can silently target the wrong
743
+ // instance too. Guard both, or the hole just moves. Opt out with
744
+ // { allowInstanceMismatch: true } for a deliberate cross-instance caller.
745
+ if (!allowInstanceMismatch && !_instanceMismatchExitInFlight) {
746
+ const mm = detectInstanceMismatch({ session });
747
+ if (mm.mismatch) {
748
+ _instanceMismatchExitInFlight = true;
749
+ printInstanceMismatchAndExit(mm);
750
+ }
751
+ }
752
+ const base = ic.resolveApiBase({ session: session || null });
753
+ const token = (session && session.token) || null;
754
+ const key = `${base}|${token || ''}|${allowUnauthenticated}`;
755
+ if (_clientCache.has(key)) return _clientCache.get(key);
756
+ if (!_clientModPromise) {
757
+ // task 1004866: the client is gitignored, so a fresh core checkout has none until it
758
+ // is generated (an installed core carries it — package-core packs it). Build it from
759
+ // the routes into the core root first; a no-op when it is already current.
760
+ ensureCliClientFile();
761
+ _clientModPromise = import('../../clients/bongos-client/index.mjs');
762
+ }
763
+ const { createClient } = await _clientModPromise;
764
+ const authedFetch = async (url, init) => {
765
+ init = init || {};
766
+ init.headers = Object.assign({ 'User-Agent': CLI_USER_AGENT }, init.headers);
767
+ if (init.dispatcher === undefined) init.dispatcher = noKeepAliveDispatcher();
768
+ const res = await dispatchedFetch(url, init);
769
+ if (res.status === 401 && !allowUnauthenticated && !_unauthExitInFlight) {
770
+ _unauthExitInFlight = true;
771
+ printUnauthGuidanceAndExit();
772
+ }
773
+ return res;
774
+ };
775
+ const client = createClient({ baseUrl: `${base}/api/bongos/v1`, token, fetch: authedFetch, throwOnError: false });
776
+ _clientCache.set(key, client);
777
+ return client;
778
+ }
779
+
780
+ async function requireSession() {
781
+ const s = await loadSession();
782
+ if (!s || !s.token) {
783
+ console.error(`No Bongos session found at ${SESSION_PATH}.`);
784
+ console.error(`You're not signed in yet — pick the line that fits:`);
785
+ if (isTerminalSurface()) {
786
+ // A terminal reader may have no instance configured at all — naming one is the whole point
787
+ // of `login`, and `/builder-*` does not exist outside a Claude Code session (task 1003730).
788
+ console.error(` • First time here → run npx bongos login <instance-url> (sign in with a browser click)`);
789
+ console.error(` • Signed in before / expired → run npx bongos reauth (re-issue your CLI token)`);
790
+ } else {
791
+ console.error(` • First time on the project → run /builder-setup (one-time GitHub sign-in that also registers you)`);
792
+ console.error(` • Signed in before / expired → run /builder-reauth (fast UI re-issue of your CLI token)`);
793
+ }
794
+ for (const line of plainCardLines('no_session')) console.error(line);
795
+ process.exit(2);
796
+ }
797
+ return s;
798
+ }
799
+
800
+ // -------------------------------------------------------------------------
801
+ // Output helpers (text, structured for the slash command to relay)
802
+ // -------------------------------------------------------------------------
803
+
804
+ function fmtMinutes(m) {
805
+ if (m == null) return '—';
806
+ if (m < 60) return `${m}m`;
807
+ const h = Math.floor(m / 60);
808
+ const rem = m % 60;
809
+ return rem ? `${h}h${rem}m` : `${h}h`;
810
+ }
811
+
812
+ function fmtUsd(n) {
813
+ if (n == null) return '—';
814
+ return `$${Number(n).toFixed(2)}`;
815
+ }
816
+
817
+ function fmtTouches(arr) {
818
+ if (!arr || arr.length === 0) return '—';
819
+ if (arr.length <= 3) return arr.join(', ');
820
+ return `${arr.slice(0, 3).join(', ')} +${arr.length - 3}`;
821
+ }
822
+
823
+ // Estimate display: prefer the calibrated minutes (per-kind median × raw est).
824
+ // When calibration differs meaningfully from the raw input we show both as
825
+ // `~5m (raw 90m)` so the gap is visible. When raw == calibrated (small task,
826
+ // no historical data, or differs by <20%) we collapse to a single number.
827
+ // Migration 015 added est_minutes_calibrated to /tasks/claimable + getTask.
828
+ function fmtEstimate(t) {
829
+ const raw = t.est_minutes;
830
+ const cal = t.est_minutes_calibrated;
831
+ if (cal == null) return fmtMinutes(raw);
832
+ if (raw == null || raw === cal) return fmtMinutes(cal);
833
+ const diff = Math.abs(cal - raw) / raw;
834
+ if (diff < 0.2) return fmtMinutes(cal);
835
+ return `~${fmtMinutes(cal)} (raw ${fmtMinutes(raw)})`;
836
+ }
837
+
838
+ function tableTask(t) {
839
+ // Version chip — eg `[V1]` / `[PMS-V2]`.
840
+ const versionChip = `[${t.version_id}]`;
841
+ return [
842
+ `#${t.id}`,
843
+ versionChip,
844
+ `P${t.priority ?? '?'}`,
845
+ fmtEstimate(t),
846
+ `${fmtUsd(t.est_cost_usd)}`,
847
+ `M${t.manual_degree ?? '?'}`,
848
+ `${t.credits_reward ?? 0}c`,
849
+ t.automation_tag ? `[${t.automation_tag}]` : '',
850
+ t.title,
851
+ ]
852
+ .filter(Boolean)
853
+ .join(' ');
854
+ }
855
+
856
+ // -------------------------------------------------------------------------
857
+ // Free-text session-request parser
858
+ // -------------------------------------------------------------------------
859
+ //
860
+ // Pure function. Returns { timeBudgetMin, mode, parallel } where each field
861
+ // may be null if not detected. Returns null when *no* fields parsed (so the
862
+ // CLI can fall through to the interactive prompt).
863
+ //
864
+ // Time: \d+\s*(h|hr|hrs|hour|hours|min|m|minutes?)
865
+ // Mode: overnight|autonomous|async → 'autonomous'
866
+ // active|focused → 'active'
867
+ // check[\s-]?in|intermittent → 'check-in'
868
+ // Parallel: parallel\s*\d+, \d+\s*sessions?, max\s*\d+
869
+
870
+ // V3.R13 (#237): one-line "next: <stage>" nudge for newcomers.
871
+ //
872
+ // Given the /api/bongos/me response, print a banner pointing at the next
873
+ // uncleared onboarding stage. Silent when the builder has graduated or has
874
+ // already cleared first_ship (the post-newcomer threshold) — gates lift
875
+ // after the first ship, so the nudge is too. Also silent when the
876
+ // onboarding payload is missing (older API, network glitch) — we'd rather
877
+ // say nothing than print noise.
878
+ //
879
+ // Maps stage -> a concrete CLI/web action the builder can take RIGHT NOW.
880
+ // Stage-internal hints (STAGE_HINTS in src/bongos/onboarding-state.js) are
881
+ // the canonical description; the per-CLI commands are the action verbs.
882
+ // The nudges name an action the reader can run. Which spelling is right depends on who is
883
+ // reading — see scripts/bongos/surface.js (task 1003680). Fail-open: a missing surface module must
884
+ // never break a nudge.
885
+ //
886
+ // Both helpers are `function` declarations so they hoist — the guidance printers above (which run
887
+ // far earlier in the file) call them, and moving them up would churn the nudge block they belong to.
888
+ function surfaceAction(verb, arg) {
889
+ try { return require('./surface').action(verb, arg); }
890
+ catch (_) { return `/builder-${verb}${arg == null ? '' : ` ${arg}`}`; }
891
+ }
892
+
893
+ // Is a person at a console reading this, rather than a Claude Code session? Fails open to AGENT,
894
+ // so a missing/broken surface module leaves the agent contract byte-identical (task 1003730).
895
+ function isTerminalSurface() {
896
+ try { return require('./surface').isTerminal(); }
897
+ catch (_) { return false; }
898
+ }
899
+
900
+ // The same refusal in plain words, for an agent to relay (task 1003989). Same fail-open
901
+ // shape as the two helpers above: a guidance printer must never die on its own footnote.
902
+ function plainCardLines(code) {
903
+ try { return require('./plain-cards').plainCardLines(code); }
904
+ catch (_) { return []; }
905
+ }
906
+
907
+ function nudgeActionForStage(stage) {
908
+ switch (stage) {
909
+ case 'auth_complete':
910
+ return 'Run node scripts/bongos/setup.js to authenticate.';
911
+ case 'pick_disciplines':
912
+ return `Choose the work that calls you — open the hall at ${hallBase()} and pick engineer, artist, ideator, or any mix.`;
913
+ case 'first_start':
914
+ return `Run ${surfaceAction('start')} to survey what you can claim.`;
915
+ case 'first_claim':
916
+ return `Pick a task from ${surfaceAction('start')} and claim it with ${surfaceAction('claim', 'N')}.`;
917
+ case 'ship_three':
918
+ return `Carry three tasks through with ${surfaceAction('ship')} — the third makes you a Thetes.`;
919
+ default:
920
+ return null;
921
+ }
922
+ }
923
+
924
+ function printOnboardingNudge(meBody) {
925
+ if (!meBody || typeof meBody !== 'object') return;
926
+ const onboarding = meBody.onboarding;
927
+ if (!onboarding || typeof onboarding !== 'object') return;
928
+ if (onboarding.graduated) return;
929
+ const cleared = new Set(Array.isArray(onboarding.completed_stages) ? onboarding.completed_stages : []);
930
+ // Reached the ship-three milestone (= graduated to Thetes): no further nagging.
931
+ if (cleared.has('ship_three')) return;
932
+ const stage = onboarding.current_stage;
933
+ if (!stage || stage === 'graduated') return;
934
+ const action = nudgeActionForStage(stage);
935
+ if (!action) return;
936
+ // Use a recognizable prefix so the slash command and any UI surface can
937
+ // detect/strip the line if needed. Ascii-only — these scripts must work
938
+ // in low-fidelity terminals.
939
+ const stages = Array.isArray(onboarding.stages) ? onboarding.stages : [];
940
+ const stageMeta = stages.find((s) => s.id === stage);
941
+ const label = (stageMeta && stageMeta.label) || stage;
942
+ console.log(`Next: ${label} — ${action}`);
943
+ }
944
+
945
+ // V3.R84 (#302), criterion C3: the CLI-side budget "ping". Prints a prominent
946
+ // soft-cap (warn) or hard-cap (over) line from the /me `cost` object. The CLI is
947
+ // the builder's private surface, so this is where the budget warning reaches
948
+ // them — not Discord (shared mirror). No-op when under budget or when the server
949
+ // didn't return a cost status (older deploy / read error → fail-quiet).
950
+ function printCostWarning(meBody) {
951
+ const cost = meBody && meBody.cost;
952
+ if (!cost || typeof cost !== 'object') return;
953
+ if (cost.level === 'over') {
954
+ console.log(`⚠ BUDGET EXCEEDED — $${cost.spend_mtd_usd} of $${cost.budget_mtd_usd} this month (${cost.pct_used}%). Cost-incurring actions (ship, art pipeline) are blocked until a Metic or Archon raises your budget.`);
955
+ } else if (cost.level === 'warn') {
956
+ console.log(`⚠ Budget at ${cost.pct_used}% — $${cost.spend_mtd_usd} of $${cost.budget_mtd_usd} this month. You'll be blocked from cost-incurring actions at 100%.`);
957
+ }
958
+ }
959
+
960
+ // task 1013 / ADR 0073: the CLI half of the consistent "the system needs an input
961
+ // from you" signal. Given the /api/bongos/me response, print a short line for each
962
+ // `needs` item in the action_needed state — the builder's private surface is the
963
+ // right place to tell them an input is missing (mirrors printCostWarning). Silent
964
+ // when nothing needs action (covered / satisfied items don't nag) or when the
965
+ // payload is absent (older API / network glitch). One line per item, with the
966
+ // concrete place to fix it. The hall Standing card renders the same `needs` data.
967
+ const HALL_BASE = hallBase();
968
+ function printNeedsNudge(meBody) {
969
+ if (!meBody || typeof meBody !== 'object') return;
970
+ const needs = meBody.needs;
971
+ if (!needs || !Array.isArray(needs.items)) return;
972
+ const action = needs.items.filter((n) => n && n.state === 'action_needed');
973
+ if (action.length === 0) return;
974
+ const noun = action.length === 1 ? 'thing needs' : 'things need';
975
+ console.log(`⚠ ${action.length} ${noun} your input:`);
976
+ for (const n of action) {
977
+ const where = n.action && n.action.href ? ` — ${HALL_BASE}${n.action.href}` : '';
978
+ console.log(` • ${n.title}: ${n.message}${where}`);
979
+ }
980
+ }
981
+
982
+ function parseSessionRequest(text) {
983
+ if (!text || typeof text !== 'string') return null;
984
+ const s = text.toLowerCase();
985
+
986
+ let timeBudgetMin = null;
987
+ let mode = null;
988
+ let parallel = null;
989
+
990
+ // Parallel — try the most specific patterns first so a "3 sessions" form
991
+ // doesn't get clobbered by an earlier "\d+\s*h" match on the same digits.
992
+ let mParallel =
993
+ s.match(/parallel\s*[:=]?\s*(\d+)/) ||
994
+ s.match(/(\d+)\s*sessions?\b/) ||
995
+ s.match(/max\s*[:=]?\s*(\d+)/);
996
+ if (mParallel) parallel = Number(mParallel[1]);
997
+
998
+ // Time — accept hours and minutes in any combination ("6h", "90 min",
999
+ // "1 hour", "2hr30min"). Sum them. (?![a-z]) instead of \b so digit-suffix
1000
+ // compounds like "2hr30min" still match the hour group.
1001
+ const hourRe = /(\d+)\s*(hours|hour|hrs|hr|h)(?![a-z])/g;
1002
+ const minRe = /(\d+)\s*(minutes|minute|min|m)(?![a-z])/g;
1003
+ let total = 0;
1004
+ let matched = false;
1005
+ // Hours pass first.
1006
+ let m;
1007
+ while ((m = hourRe.exec(s)) !== null) {
1008
+ total += Number(m[1]) * 60;
1009
+ matched = true;
1010
+ }
1011
+ // Minutes pass — but only count "m" alone if it's not eaten by hour.
1012
+ // Strip already-matched hour spans so "2hr30min" doesn't double-count.
1013
+ let minSearch = s.replace(hourRe, ' ');
1014
+ while ((m = minRe.exec(minSearch)) !== null) {
1015
+ total += Number(m[1]);
1016
+ matched = true;
1017
+ }
1018
+ if (matched) timeBudgetMin = total;
1019
+
1020
+ // Mode — most-specific wins. check-in patterns first because they overlap
1021
+ // with nothing; then autonomous (overnight/async), then active.
1022
+ if (/\bcheck[\s-]?in\b|\bintermittent\b/.test(s)) {
1023
+ mode = 'check-in';
1024
+ } else if (/\bovernight\b|\bautonomous\b|\basync\b/.test(s)) {
1025
+ mode = 'autonomous';
1026
+ } else if (/\bactive\b|\bfocused\b/.test(s)) {
1027
+ mode = 'active';
1028
+ }
1029
+
1030
+ if (timeBudgetMin == null && mode == null && parallel == null) return null;
1031
+ return { timeBudgetMin, mode, parallel };
1032
+ }
1033
+
1034
+ // task 1002809: Git Bash (MSYS) rewrites a leading-slash argument into a Windows
1035
+ // path under the Git install root BEFORE node sees it — `/tasks/123` arrives as
1036
+ // `C:/Program Files/Git/tasks/123` — unless the builder remembers
1037
+ // MSYS_NO_PATHCONV=1. Undo it here so no one needs the env prefix. EXEPATH (set
1038
+ // by Git Bash) points INSIDE the install (`…\Git\bin`), while the mangled prefix
1039
+ // is the install root (`…\Git`), so we strip the LONGEST ancestor of EXEPATH
1040
+ // that prefixes the arg — never the bare drive root (that would "repair"
1041
+ // arbitrary Windows paths). Case-insensitive, both slash styles. Pure + exported
1042
+ // for tests/api_msys_path_repair.mjs; no-op off win32 or without EXEPATH.
1043
+ function repairMsysMangledPath(raw, { exepath = process.env.EXEPATH, platform = process.platform } = {}) {
1044
+ if (!raw || raw.startsWith('/')) return raw;
1045
+ if (platform !== 'win32' || !exepath) return raw;
1046
+ const rawFwd = String(raw).replace(/\\/g, '/');
1047
+ const rawLower = rawFwd.toLowerCase();
1048
+ let ancestor = String(exepath).replace(/\\/g, '/').replace(/\/+$/, '');
1049
+ let best = null;
1050
+ while (ancestor.includes('/')) {
1051
+ // Stop before the bare drive root ("C:" after the last slice).
1052
+ if (/^[a-z]:$/i.test(ancestor)) break;
1053
+ if (rawLower.startsWith(ancestor.toLowerCase() + '/') && (best === null || ancestor.length > best.length)) {
1054
+ best = ancestor;
1055
+ }
1056
+ ancestor = ancestor.slice(0, ancestor.lastIndexOf('/'));
1057
+ }
1058
+ if (best === null) return raw;
1059
+ return rawFwd.slice(best.length);
1060
+ }
1061
+
1062
+ // detectWorktreeName — which linked git worktree is this process running in?
1063
+ // Moved here from claim.js in task 1003767 so the CLAIM and the RESOLVE agree on
1064
+ // one answer: the server keys both the one-active-claim guard and (now) the
1065
+ // resolve lock on the WORKING TREE rather than the shared auth session, and two
1066
+ // copies of this detector drifting apart would strand a ship with a name
1067
+ // mismatch. One definition, both callers.
1068
+ //
1069
+ // Only names a LINKED worktree — git-dir != git-common-dir, i.e. a real
1070
+ // `.claude/worktrees/<name>` checkout — using its top-level directory basename
1071
+ // (the `<name>` the convention already uses). The MAIN checkout returns null,
1072
+ // which the server reads as "no tree named" and falls back to the session
1073
+ // compare. Best-effort: any git hiccup yields null, so this can never break a
1074
+ // claim or a ship.
1075
+ function detectWorktreeName() {
1076
+ try {
1077
+ const gitDir = execSync('git rev-parse --git-dir', { encoding: 'utf8' }).trim();
1078
+ const commonDir = execSync('git rev-parse --git-common-dir', { encoding: 'utf8' }).trim();
1079
+ // Same dir → the main checkout, not a linked worktree → leave unnamed.
1080
+ if (path.resolve(gitDir) === path.resolve(commonDir)) return null;
1081
+ const top = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
1082
+ const name = path.basename(top);
1083
+ return name || null;
1084
+ } catch (_) {
1085
+ return null;
1086
+ }
1087
+ }
1088
+
1089
+ // ---- card richness (task 1002518) ------------------------------------------
1090
+ //
1091
+ // The one place a CLI turns a /me payload into "what should this card look
1092
+ // like": three booleans — print the card at all, write the widget, open its
1093
+ // summary — that emitCard consumes directly.
1094
+ //
1095
+ // WHY THIS READS THE PAYLOAD AND NEVER require()s render-prefs.js. The ladder
1096
+ // lives in modules/builder-settings/render-prefs.js, and a CLI reaches a
1097
+ // module's logic through the server, never by require — the module may be
1098
+ // disabled on the instance, and a require would couple every CLI to one
1099
+ // module's internals. So the server resolves the rung and ships the answers on
1100
+ // `render.flags`; this function only picks them up.
1101
+ //
1102
+ // TWO SERVER SHAPES, deliberately. `render.flags` is the ladder (task 1002518);
1103
+ // `render.widgets_enabled` is the boolean that predates it. A CLI newer than the
1104
+ // instance it is pointed at sees only the boolean — the /me payload is not
1105
+ // version-negotiated — so the fallback is not defensive padding, it is the
1106
+ // supported path against a pinned instance, and it reconstructs exactly what
1107
+ // that boolean has always meant: card always, widget iff true, never expanded.
1108
+ // An absent or failed /me lands on the same default.
1109
+ function cardFlagsFromMe(me) {
1110
+ const render = me && me.data && me.data.render;
1111
+ const f = render && render.flags;
1112
+ if (f && typeof f === 'object') {
1113
+ return {
1114
+ level: typeof f.level === 'string' ? f.level : null,
1115
+ showCard: f.showCard !== false,
1116
+ showWidget: f.showWidget === true,
1117
+ expanded: f.expanded === true,
1118
+ };
1119
+ }
1120
+ const enabled = !render || render.widgets_enabled !== false;
1121
+ return { level: null, showCard: true, showWidget: enabled, expanded: false };
1122
+ }
1123
+
1124
+ // ---------------------------------------------------------------------------
1125
+ // errCode — read the error slug out of an ADR 0116 response envelope.
1126
+ // ---------------------------------------------------------------------------
1127
+ // ADR 0116 standardised every failure on a NESTED envelope:
1128
+ //
1129
+ // { "error": { "code": "task_not_found", "message": "…", "details": … } }
1130
+ //
1131
+ // so the obvious-looking `r.data.error === 'task_not_found'` compares an OBJECT to a
1132
+ // STRING and is never true. That is not a cosmetic bug: each such comparison guards a
1133
+ // helpful, specific message, so against a live server every one of those branches is
1134
+ // unreachable and the user falls through to the raw `(409): [object Object]` dump —
1135
+ // the failure looks like a tooling crash rather than the clear refusal the server sent.
1136
+ //
1137
+ // Verified live 2026-09-22 against cloudbongos.com:
1138
+ // POST /api/bongos/tasks/1003846/abandon
1139
+ // -> 409 {"error":{"code":"cannot_abandon_shipped","message":"shipped tasks are immutable history"}}
1140
+ //
1141
+ // The flat-string fallback is deliberate, not defensive padding: some older routes and
1142
+ // every non-envelope transport error (a proxy's plain-text body, a pre-0116 instance an
1143
+ // upgraded CLI is talking to) still surface `error` as a bare string. Reading both is
1144
+ // what makes one helper safe to use everywhere.
1145
+ //
1146
+ // Fixed in ship.js under task 1002789; extracted here under task 1003658 so the next
1147
+ // caller cannot reintroduce the same comparison. Pure — tests/cli_err_code.mjs.
1148
+ function errCode(data) {
1149
+ const e = data && data.error;
1150
+ if (typeof e === 'string') return e;
1151
+ if (e && typeof e === 'object' && typeof e.code === 'string') return e.code;
1152
+ return null;
1153
+ }
1154
+
1155
+ // errDetails — the structured payload beside the slug, same envelope.
1156
+ //
1157
+ // This matters as much as errCode and is easy to miss: the sibling fields moved WITH
1158
+ // the code. demote.js printed `r.data.current_status` beside its message; ADR 0116 put
1159
+ // that at `error.details.current_status`, so a fix that changed only the comparison
1160
+ // would have restored the branch and then printed "it is 'undefined', not 'ready'" —
1161
+ // a half-fix that looks like a whole one. Verified live 2026-09-22:
1162
+ //
1163
+ // POST /api/bongos/tasks/1003846/demote
1164
+ // -> 409 {"error":{"code":"cannot_demote","details":{"current_status":"shipped"}}}
1165
+ //
1166
+ // Falls back to the top-level body so a pre-0116 flat response still resolves.
1167
+ function errDetails(data) {
1168
+ const e = data && data.error;
1169
+ if (e && typeof e === 'object' && e.details && typeof e.details === 'object') return e.details;
1170
+ return (data && typeof data === 'object') ? data : {};
1171
+ }
1172
+
1173
+ module.exports = {
1174
+ errCode,
1175
+ errDetails,
1176
+ API_BASE,
1177
+ detectWorktreeName,
1178
+ hallBase,
1179
+ productName,
1180
+ rewardPolicy,
1181
+ costPlusOnlyNote,
1182
+ SESSION_PATH,
1183
+ SESSION_FILENAMES,
1184
+ SESSION_READ_PATHS,
1185
+ loadSession,
1186
+ loadSessionSync,
1187
+ saveSession,
1188
+ sessionStoreDir,
1189
+ sessionHostKey,
1190
+ sessionStorePath,
1191
+ loadStoredSession,
1192
+ listStoredSessions,
1193
+ arg,
1194
+ argText,
1195
+ hasFlag,
1196
+ stripBom,
1197
+ repairMsysMangledPath,
1198
+ resolveQuiet,
1199
+ readSessionToken,
1200
+ CLI_USER_AGENT,
1201
+ apiCall,
1202
+ cliExit,
1203
+ isDispatcherIncompatError,
1204
+ dispatchedFetch,
1205
+ noKeepAliveDispatcher,
1206
+ _noKeepAliveResetForTest,
1207
+ cliClient,
1208
+ ensureCliClientFile,
1209
+ requireSession,
1210
+ surfaceAction,
1211
+ isTerminalSurface,
1212
+ printUnauthGuidanceAndExit,
1213
+ detectInstanceMismatch,
1214
+ assertInstanceMatch,
1215
+ instanceOriginHost,
1216
+ fmtMinutes,
1217
+ fmtUsd,
1218
+ fmtTouches,
1219
+ fmtEstimate,
1220
+ tableTask,
1221
+ parseSessionRequest,
1222
+ printOnboardingNudge,
1223
+ printCostWarning,
1224
+ printNeedsNudge,
1225
+ cardFlagsFromMe,
1226
+ };