@bongos/core 1.21.174 → 1.21.176

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