@bongos/core 1.21.175 → 1.21.177

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1719) hide show
  1. package/.bongos-core.json +3371 -1636
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +15 -15
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/config/scheduled-routines.json +3 -8
  58. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  59. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +1 -1
  60. package/docs/adr/0093-tranche-2-core-carve-sequence.md +1 -1
  61. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  62. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  63. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  64. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  65. package/docs/adr/README.md +2 -0
  66. package/docs/api/openapi.json +606 -44
  67. package/docs/api-reference.md +25 -12
  68. package/docs/architecture.md +8 -7
  69. package/docs/canonical-permissions.md +4 -4
  70. package/docs/copy-inventory.md +1370 -1411
  71. package/docs/copy-registry.json +2136 -2536
  72. package/docs/design/demonolith-plan.md +6 -6
  73. package/docs/design/modular-architecture/00-research-report.md +1 -1
  74. package/docs/design/project-startup-direction.md +2 -2
  75. package/docs/design/projects-hub-direction-v2.md +1 -1
  76. package/docs/design/reviews/hall-v2/README.md +2 -2
  77. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  78. package/docs/file-map.md +92 -96
  79. package/docs/handoff-template.md +5 -5
  80. package/docs/module-api-changelog.md +7 -3
  81. package/docs/modules-contract.md +8 -7
  82. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  83. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  84. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  85. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  86. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  87. package/docs/onboarding/diagrams/README.md +5 -9
  88. package/docs/onboarding/diagrams/assertions.json +3 -3
  89. package/docs/onboarding/slash-commands.md +2 -2
  90. package/docs/packs/artist.md +4 -4
  91. package/docs/packs/engineer.md +11 -10
  92. package/docs/packs/ideator.md +7 -7
  93. package/docs/page-inventory.json +20 -1
  94. package/docs/page-readings.json +4387 -4603
  95. package/docs/recipes/README.md +1 -1
  96. package/docs/recipes/audit-replay.md +4 -4
  97. package/docs/recipes/autobongos-windows-host.md +6 -6
  98. package/docs/recipes/bongos-cli-release.md +2 -2
  99. package/docs/recipes/claude-design-loop.md +7 -7
  100. package/docs/recipes/core-release-pipeline.md +19 -19
  101. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  102. package/docs/recipes/figma-design-loop.md +6 -6
  103. package/docs/recipes/gds-db-backup.md +9 -9
  104. package/docs/recipes/instance-deploy.md +3 -3
  105. package/docs/recipes/instance-first-run.md +1 -1
  106. package/docs/recipes/multi-builder-merge.md +2 -2
  107. package/docs/recipes/ops-gotchas.md +13 -10
  108. package/docs/recipes/packaging-the-core.md +6 -6
  109. package/docs/recipes/parallel-goal-waves.md +4 -4
  110. package/docs/recipes/private-npm-distribution.md +9 -9
  111. package/docs/recipes/redteam-patrol.md +5 -5
  112. package/docs/recipes/render-pilot.md +2 -2
  113. package/docs/recipes/reranking-a-goals-board.md +2 -2
  114. package/docs/recipes/search-index-ingestion.md +5 -5
  115. package/docs/recipes/self-host.md +1 -1
  116. package/docs/recipes/ship-and-regrade.md +4 -4
  117. package/docs/recipes/staging-environment.md +1 -1
  118. package/docs/recipes/standalone-live-docs.md +1 -1
  119. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  120. package/docs/recipes/upgrading-the-core.md +11 -11
  121. package/docs/recipes/windows-builders.md +18 -18
  122. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  123. package/docs/research/task-network-map-readability.md +3 -3
  124. package/migrations/core_278_builder_tester_tag.sql +18 -0
  125. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  126. package/modules/agents/lib/answer-hold.js +1 -1
  127. package/modules/agents/lib/gate.js +1 -1
  128. package/modules/agents/lib/validate.js +1 -1
  129. package/modules/autonomy/db.js +9 -0
  130. package/modules/autonomy/gauge.js +1 -1
  131. package/modules/autonomy/governor-docket.js +2 -2
  132. package/modules/autonomy/module.json +2 -2
  133. package/modules/autonomy/pollers/daily-checks.js +262 -0
  134. package/modules/autonomy/pollers/routine-timers.js +9 -7
  135. package/modules/autonomy/rank-roles.js +64 -0
  136. package/modules/autonomy/routes/autonomy.js +3 -3
  137. package/modules/autonomy/server-schedule.js +37 -0
  138. package/modules/builder-settings/interaction-prefs.js +1 -1
  139. package/modules/builder-settings/render-prefs.js +1 -1
  140. package/modules/builder-settings/routes/settings.js +1 -1
  141. package/modules/builder-settings/skill-prefs.js +2 -2
  142. package/modules/builder-settings/wandering-prefs.js +2 -2
  143. package/modules/copy-desk/module.json +2 -2
  144. package/modules/copy-desk/page-data.js +5 -5
  145. package/modules/copy-desk/page-decisions.js +13 -1
  146. package/modules/copy-desk/proposals.js +4 -4
  147. package/modules/copy-desk/registry.js +2 -2
  148. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  149. package/modules/copy-desk/routes/copy-desk.js +3 -12
  150. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  151. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  152. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  153. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  154. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  155. package/modules/design-styles/skills/README.md +4 -4
  156. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  157. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  158. package/modules/discord/bug-attachments.js +1 -1
  159. package/modules/discord/ship-broadcast.js +1 -1
  160. package/modules/economy/achievements.js +49 -7
  161. package/modules/economy/cost-classify.js +6 -6
  162. package/modules/economy/cost-report.js +1 -1
  163. package/modules/economy/cost.js +1 -1
  164. package/modules/economy/credits.js +2 -1
  165. package/modules/economy/idea-size.js +2 -2
  166. package/modules/economy/reward.js +2 -0
  167. package/modules/economy/routes/cost.js +1 -1
  168. package/modules/economy/streak.js +43 -4
  169. package/modules/government/asks.js +1 -1
  170. package/modules/government/board.js +19 -2
  171. package/modules/government/catalog.js +3 -0
  172. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  173. package/modules/government/protected-surfaces.json +48 -47
  174. package/modules/government/recommendations.js +6 -2
  175. package/modules/government/routes/government.js +1 -1
  176. package/modules/grading/generated-provenance.js +13 -5
  177. package/modules/grading/grade-engine.js +1 -1
  178. package/modules/grading/grader-rubric.json +1 -1
  179. package/modules/grading/grader-score.js +1 -1
  180. package/modules/grading/grader-workers/index.js +1 -1
  181. package/modules/grading/grader.js +1 -1
  182. package/modules/grading/routes/grade.js +1 -1
  183. package/modules/hall-ui/public/atlas.html +5 -7
  184. package/modules/hall-ui/public/atlas.js +1 -1
  185. package/modules/hall-ui/public/atlas.states.json +1 -1
  186. package/modules/hall-ui/public/blockers.css +9 -0
  187. package/modules/hall-ui/public/blockers.html +4 -4
  188. package/modules/hall-ui/public/blockers.js +29 -30
  189. package/modules/hall-ui/public/board-room.css +5 -17
  190. package/modules/hall-ui/public/board-room.html +5 -6
  191. package/modules/hall-ui/public/board-room.js +41 -23
  192. package/modules/hall-ui/public/board-room.states.json +1 -1
  193. package/modules/hall-ui/public/brand-apply.js +1 -1
  194. package/modules/hall-ui/public/brand-holes.js +1 -1
  195. package/modules/hall-ui/public/builders.js +40 -86
  196. package/modules/hall-ui/public/city-decide.js +18 -4
  197. package/modules/hall-ui/public/city.html +1 -1
  198. package/modules/hall-ui/public/collab.html +1 -1
  199. package/modules/hall-ui/public/commands.html +6 -9
  200. package/modules/hall-ui/public/copy-desk.html +1 -1
  201. package/modules/hall-ui/public/copy-desk.js +2 -2
  202. package/modules/hall-ui/public/craft-mode.js +4 -0
  203. package/modules/hall-ui/public/deploy.html +6 -2
  204. package/modules/hall-ui/public/deploy.js +21 -13
  205. package/modules/hall-ui/public/diagrams.css +1 -1
  206. package/modules/hall-ui/public/diagrams.html +5 -8
  207. package/modules/hall-ui/public/diagrams.states.json +1 -1
  208. package/modules/hall-ui/public/drachmae.html +3 -7
  209. package/modules/hall-ui/public/fleet.html +3 -2
  210. package/modules/hall-ui/public/fleet.js +0 -4
  211. package/modules/hall-ui/public/gate.html +7 -7
  212. package/modules/hall-ui/public/gate.js +58 -77
  213. package/modules/hall-ui/public/goal-map.html +1 -1
  214. package/modules/hall-ui/public/goals-page.js +5 -5
  215. package/modules/hall-ui/public/goals-render.js +10 -11
  216. package/modules/hall-ui/public/goals.css +10 -0
  217. package/modules/hall-ui/public/goals.html +14 -7
  218. package/modules/hall-ui/public/government.html +3 -5
  219. package/modules/hall-ui/public/government.js +1 -5
  220. package/modules/hall-ui/public/hall-render.js +117 -57
  221. package/modules/hall-ui/public/hall-widgets.js +11 -11
  222. package/modules/hall-ui/public/idea.html +1 -1
  223. package/modules/hall-ui/public/ideas.html +3 -1
  224. package/modules/hall-ui/public/ideas.js +1 -0
  225. package/modules/hall-ui/public/index.html +12 -6
  226. package/modules/hall-ui/public/index.states.json +1 -1
  227. package/modules/hall-ui/public/mine-lens.js +1 -1
  228. package/modules/hall-ui/public/modules.html +7 -10
  229. package/modules/hall-ui/public/modules.js +0 -2
  230. package/modules/hall-ui/public/my-agents.html +1 -1
  231. package/modules/hall-ui/public/palette.js +5 -5
  232. package/modules/hall-ui/public/primer.html +4 -9
  233. package/modules/hall-ui/public/profile-connections.js +10 -2
  234. package/modules/hall-ui/public/profile-roles.js +3 -10
  235. package/modules/hall-ui/public/profile.html +12 -10
  236. package/modules/hall-ui/public/profile.js +13 -17
  237. package/modules/hall-ui/public/project-settings.html +3 -4
  238. package/modules/hall-ui/public/project-settings.js +0 -3
  239. package/modules/hall-ui/public/ranks.html +5 -11
  240. package/modules/hall-ui/public/ranks.js +6 -8
  241. package/modules/hall-ui/public/roadmap.css +0 -2
  242. package/modules/hall-ui/public/roadmap.html +1 -1
  243. package/modules/hall-ui/public/roadmap.js +16 -51
  244. package/modules/hall-ui/public/roster.html +1 -1
  245. package/modules/hall-ui/public/sessions.html +6 -8
  246. package/modules/hall-ui/public/sessions.js +7 -7
  247. package/modules/hall-ui/public/settings.html +1 -1
  248. package/modules/hall-ui/public/shell-trail.js +1 -1
  249. package/modules/hall-ui/public/shell.js +17 -17
  250. package/modules/hall-ui/public/street-deck.css +2 -1
  251. package/modules/hall-ui/public/street-deck.js +10 -2
  252. package/modules/hall-ui/public/street-desk.js +16 -5
  253. package/modules/hall-ui/public/street.html +1 -1
  254. package/modules/hall-ui/public/studio-lib.js +4 -0
  255. package/modules/hall-ui/public/studio.css +2 -0
  256. package/modules/hall-ui/public/studio.html +1 -1
  257. package/modules/hall-ui/public/studio.js +27 -1
  258. package/modules/hall-ui/public/style.css +43 -26
  259. package/modules/hall-ui/public/task-detail.js +10 -7
  260. package/modules/hall-ui/public/task.css +2 -0
  261. package/modules/hall-ui/public/task.html +3 -1
  262. package/modules/hall-ui/public/task.js +23 -7
  263. package/modules/hall-ui/public/thinking.html +1 -1
  264. package/modules/hall-ui/public/tweak-editor.html +1 -1
  265. package/modules/hall-ui/public/vote-control.js +208 -0
  266. package/modules/hall-ui/public/watch.html +3 -5
  267. package/modules/hall-ui/public/watch.js +5 -4
  268. package/modules/hall-ui/public/welcome-boot.css +130 -0
  269. package/modules/hall-ui/public/welcome-boot.js +334 -0
  270. package/modules/hall-ui/public/welcome-day.webp +0 -0
  271. package/modules/hall-ui/public/welcome-night.webp +0 -0
  272. package/modules/hall-ui/public/work-summary.js +1 -1
  273. package/modules/hall-ui/public/work.css +1 -0
  274. package/modules/hall-ui/public/work.html +3 -1
  275. package/modules/hall-ui/public/work.js +2 -1
  276. package/modules/hall-ui/records/accomplishments.md +16 -0
  277. package/modules/hall-ui/records/hall-ask-card.md +9 -0
  278. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  279. package/modules/hall-ui/records/oversight-family.md +1 -1
  280. package/modules/hall-ui/records/profile-connections.md +2 -0
  281. package/modules/hall-ui/records/profile-roles.md +1 -1
  282. package/modules/hall-ui/records/reading-rooms.md +1 -1
  283. package/modules/hall-ui/records/welcome-tower.md +50 -0
  284. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  285. package/modules/ideas/projection.js +1 -1
  286. package/modules/ideas/routes/blockers.js +3 -3
  287. package/modules/ideas/routes/inbox.js +29 -1
  288. package/modules/ideas/routes/ratify-goal.js +1 -1
  289. package/modules/ideas/routing.js +1 -1
  290. package/modules/ideas/templates.js +1 -1
  291. package/modules/ideas/trail-descent.js +1 -1
  292. package/modules/ideas/trail-size.js +1 -1
  293. package/modules/ideas/votes.js +93 -0
  294. package/modules/lifecycle/abandon-leftovers.js +1 -1
  295. package/modules/lifecycle/cascade.js +1 -1
  296. package/modules/lifecycle/conflict-resolve.js +13 -21
  297. package/modules/lifecycle/criterion-ref.js +1 -1
  298. package/modules/lifecycle/db-analytics.js +57 -4
  299. package/modules/lifecycle/db-deps-criteria.js +1 -1
  300. package/modules/lifecycle/db-ship.js +2 -2
  301. package/modules/lifecycle/db-tasks.js +2 -2
  302. package/modules/lifecycle/db-versions.js +1 -1
  303. package/modules/lifecycle/db.js +2 -0
  304. package/modules/lifecycle/dead-deps.js +3 -3
  305. package/modules/lifecycle/dependency-advisory.js +3 -3
  306. package/modules/lifecycle/goal-category.js +1 -1
  307. package/modules/lifecycle/goal-forest.js +1 -1
  308. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  309. package/modules/lifecycle/kickoff-checklist.js +1 -1
  310. package/modules/lifecycle/kickoff-seed.js +1 -1
  311. package/modules/lifecycle/lifecycle.js +2 -0
  312. package/modules/lifecycle/merge-reach.js +29 -15
  313. package/modules/lifecycle/missing-dep-classify.js +3 -3
  314. package/modules/lifecycle/module.json +2 -1
  315. package/modules/lifecycle/page-tweak-approve.js +85 -1
  316. package/modules/lifecycle/page-tweak-hold.js +1 -1
  317. package/modules/lifecycle/publish-reconciler.js +1 -2
  318. package/modules/lifecycle/rot.js +1 -1
  319. package/modules/lifecycle/routes/artist-gate.js +1 -1
  320. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  321. package/modules/lifecycle/routes/goals.js +1 -1
  322. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  323. package/modules/lifecycle/routes/task-votes.js +54 -0
  324. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  325. package/modules/lifecycle/routes/tasks.js +2 -2
  326. package/modules/lifecycle/routes/versions.js +2 -2
  327. package/modules/lifecycle/ship-card.js +4 -4
  328. package/modules/lifecycle/ship-preflight.js +1 -1
  329. package/modules/lifecycle/task-classifier.js +1 -1
  330. package/modules/lifecycle/task-status.js +1 -1
  331. package/modules/lifecycle/task-visual-db.js +1 -1
  332. package/modules/memory/learnings.js +1 -1
  333. package/modules/memory/pollers/search-index.js +2 -2
  334. package/modules/memory/routes/learnings.js +1 -1
  335. package/modules/memory/routes/memory.js +1 -1
  336. package/modules/memory/search.js +2 -2
  337. package/modules/npm-release/release.js +1 -1
  338. package/modules/onboarding/howto-moments.js +1 -1
  339. package/modules/onboarding/newcomer-restock.js +3 -3
  340. package/modules/onboarding/onboarding.js +1 -1
  341. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  342. package/modules/platform-identity/origin-containment.js +1 -1
  343. package/modules/platform-identity/publish-gate.js +1 -1
  344. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  345. package/modules/provisioning/capacity.js +1 -1
  346. package/modules/provisioning/core-upgrade.js +15 -9
  347. package/modules/provisioning/credential-preflight.js +3 -3
  348. package/modules/provisioning/disconnect.js +1 -1
  349. package/modules/provisioning/dns-resolves.js +1 -1
  350. package/modules/provisioning/module.json +1 -1
  351. package/modules/provisioning/onboard-plan.js +1 -1
  352. package/modules/provisioning/paid-shape-gate.js +2 -2
  353. package/modules/provisioning/planet-physics.js +11 -2
  354. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  355. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  356. package/modules/provisioning/provisioning.js +2 -2
  357. package/modules/provisioning/render-lookup.js +1 -1
  358. package/modules/provisioning/render-standup.js +3 -3
  359. package/modules/provisioning/repo-private.js +1 -1
  360. package/modules/provisioning/routes/callback-page.js +1 -1
  361. package/modules/provisioning/routes/core-upgrade.js +23 -3
  362. package/modules/provisioning/routes/provisioning.js +2 -2
  363. package/modules/provisioning/routes/render-standup.js +1 -1
  364. package/modules/provisioning/routes/repo-private.js +1 -1
  365. package/modules/provisioning/soft-limits.js +1 -1
  366. package/modules/provisioning/starter-bundles.js +4 -2
  367. package/modules/provisioning/tests/provisioning.mjs +1 -1
  368. package/modules/public-landing/public/account.html +4 -6
  369. package/modules/public-landing/public/assets/cosmos.css +13 -6
  370. package/modules/public-landing/public/connections.html +4 -6
  371. package/modules/public-landing/public/contact.html +4 -6
  372. package/modules/public-landing/public/guild.html +4 -6
  373. package/modules/public-landing/public/index.html +11 -9
  374. package/modules/public-landing/public/invitations.html +4 -6
  375. package/modules/public-landing/public/privacy.html +4 -6
  376. package/modules/public-landing/public/projects.html +168 -46
  377. package/modules/public-landing/public/terms.html +4 -6
  378. package/modules/raise/content/copy.json +40 -0
  379. package/modules/raise/content/nda.html +39 -0
  380. package/modules/raise/content/settings.json +49 -0
  381. package/modules/raise/db.js +95 -0
  382. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  383. package/modules/raise/module.json +28 -0
  384. package/modules/raise/page.js +194 -0
  385. package/modules/raise/public/edit.js +152 -0
  386. package/modules/raise/public/favicon.svg +1 -0
  387. package/modules/raise/public/logo-ink.svg +1 -0
  388. package/modules/raise/public/logo-night.svg +1 -0
  389. package/modules/raise/public/mode.js +8 -0
  390. package/modules/raise/public/raise.css +234 -0
  391. package/modules/raise/public/raise.js +91 -0
  392. package/modules/raise/raise.js +174 -0
  393. package/modules/raise/routes/raise.js +152 -0
  394. package/modules/raise/views/gate.html +39 -0
  395. package/modules/raise/views/nda.html +21 -0
  396. package/modules/raise/views/page.html +133 -0
  397. package/modules/raise/web.js +72 -0
  398. package/modules/render-deploy/deploys.js +1 -1
  399. package/modules/render-deploy/render.js +2 -2
  400. package/modules/security/secret-scrub.js +3 -3
  401. package/modules/security/security.js +1 -1
  402. package/modules/security/tests/artifact_scan.mjs +1 -1
  403. package/modules/security/tests/mirror.mjs +1 -1
  404. package/modules/security/tests/scan_store.mjs +1 -1
  405. package/modules/sessions/db.js +2 -2
  406. package/modules/sessions/pulse.js +2 -2
  407. package/modules/sessions/routes/sessions.js +1 -1
  408. package/modules/specialities/specialities.js +1 -1
  409. package/modules/status-ui/public/README.md +3 -4
  410. package/modules/status-ui/public/index.html +5 -31
  411. package/modules/status-ui/public/status.js +6 -174
  412. package/modules/status-ui/public/style.css +4 -133
  413. package/modules/ui-design/docs/design-contract.md +3 -3
  414. package/modules/ui-design/kit/README.md +1 -1
  415. package/modules/ui-design/kit/serve.js +13 -4
  416. package/modules/ui-design/scripts/design-sync.js +1 -1
  417. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  418. package/modules/ui-design/scripts/validate-design.js +1 -1
  419. package/package-lock.json +27 -11
  420. package/package.json +2 -3
  421. package/release-notes.json +186 -0
  422. package/scripts/bongos/CLAUDE.md +15 -0
  423. package/scripts/bongos/abandon.js +137 -0
  424. package/scripts/bongos/accessibility-replay.js +195 -0
  425. package/scripts/bongos/address-park-sweep.sh +91 -0
  426. package/scripts/bongos/adopt-detect.js +123 -0
  427. package/scripts/bongos/adopt-import.js +111 -0
  428. package/scripts/bongos/adopt-preflight.js +187 -0
  429. package/scripts/bongos/adr-namespace.js +273 -0
  430. package/scripts/bongos/agent-invoke.js +689 -0
  431. package/scripts/bongos/agents-sync.js +502 -0
  432. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  433. package/scripts/bongos/api-artifacts.js +91 -0
  434. package/scripts/bongos/api.js +86 -0
  435. package/scripts/bongos/api.ps1 +26 -0
  436. package/scripts/bongos/architect-audit.js +294 -0
  437. package/scripts/bongos/artifact-audit.js +326 -0
  438. package/scripts/bongos/artifact-format.js +203 -0
  439. package/scripts/bongos/ask.js +231 -0
  440. package/scripts/bongos/audit-authorship.sh +324 -0
  441. package/scripts/bongos/audit-deps.js +189 -0
  442. package/scripts/bongos/audit-gate.js +121 -0
  443. package/scripts/bongos/audit-rank-roles.js +131 -0
  444. package/scripts/bongos/audit-replay.sh +205 -0
  445. package/scripts/bongos/autobongos-digest.js +123 -0
  446. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  447. package/scripts/bongos/autobongos-loop.js +210 -0
  448. package/scripts/bongos/autobongos-run.js +1361 -0
  449. package/scripts/bongos/autobongos-service.cmd +50 -0
  450. package/scripts/bongos/autobongos-service.ps1 +270 -0
  451. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  452. package/scripts/bongos/autobongos-verify.js +618 -0
  453. package/scripts/bongos/autonomy-gate.js +135 -0
  454. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  455. package/scripts/bongos/autonomy-gauge.js +84 -0
  456. package/scripts/bongos/backfill-cost.js +176 -0
  457. package/scripts/bongos/backfill-disciplines.js +144 -0
  458. package/scripts/bongos/backfill-session-earnings.js +123 -0
  459. package/scripts/bongos/backfill-session-types.js +87 -0
  460. package/scripts/bongos/backfill-sessions.js +411 -0
  461. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  462. package/scripts/bongos/backfill-task-rewards.js +413 -0
  463. package/scripts/bongos/backlog-review.js +399 -0
  464. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  465. package/scripts/bongos/backup.js +116 -0
  466. package/scripts/bongos/baseline-staleness.js +217 -0
  467. package/scripts/bongos/bfg-principal-token.js +65 -0
  468. package/scripts/bongos/bug-attachment-audit.js +149 -0
  469. package/scripts/bongos/bug-attachment-recover.js +198 -0
  470. package/scripts/bongos/bug-triage.js +292 -0
  471. package/scripts/bongos/build-bongos.js +94 -0
  472. package/scripts/bongos/bump-version.js +221 -0
  473. package/scripts/bongos/capture.js +481 -0
  474. package/scripts/bongos/category-advisory-guard.js +206 -0
  475. package/scripts/bongos/ci-grade.js +82 -0
  476. package/scripts/bongos/claim-recall.js +112 -0
  477. package/scripts/bongos/claim.js +789 -0
  478. package/scripts/bongos/claude-materialize.js +1200 -0
  479. package/scripts/bongos/claude-md-template.js +142 -0
  480. package/scripts/bongos/cleanup-orphans.js +74 -0
  481. package/scripts/bongos/cli-lib.js +1226 -0
  482. package/scripts/bongos/client-baseurl-guard.js +116 -0
  483. package/scripts/bongos/codemod-rename-scripts-gds.js +380 -0
  484. package/scripts/bongos/conductor-dispatch.js +535 -0
  485. package/scripts/bongos/context-pack.js +326 -0
  486. package/scripts/bongos/control-manifest.js +199 -0
  487. package/scripts/bongos/copy-apply.js +758 -0
  488. package/scripts/bongos/copy-inventory.js +571 -0
  489. package/scripts/bongos/core-origin-follow.js +185 -0
  490. package/scripts/bongos/core-pin-sync.js +260 -0
  491. package/scripts/bongos/cost-report.js +63 -0
  492. package/scripts/bongos/cost.js +47 -0
  493. package/scripts/bongos/credential-presence.js +296 -0
  494. package/scripts/bongos/cutover-codemod.js +240 -0
  495. package/scripts/bongos/db-backup-nightly.sh +232 -0
  496. package/scripts/bongos/db-backup-offsite.sh +267 -0
  497. package/scripts/bongos/demote.js +45 -0
  498. package/scripts/bongos/deploy-divergence.js +454 -0
  499. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  500. package/scripts/bongos/design-sync.js +12 -0
  501. package/scripts/bongos/dev-box-guard.js +166 -0
  502. package/scripts/bongos/dev-lib.js +722 -0
  503. package/scripts/bongos/dev.js +645 -0
  504. package/scripts/bongos/device-flow-help.js +72 -0
  505. package/scripts/bongos/diagnose-achievements.js +118 -0
  506. package/scripts/bongos/diagram-facts.js +355 -0
  507. package/scripts/bongos/discord-channels.js +77 -0
  508. package/scripts/bongos/do-api.js +109 -0
  509. package/scripts/bongos/doc-cli-guard.js +274 -0
  510. package/scripts/bongos/doc-comment-coverage.js +139 -0
  511. package/scripts/bongos/doc-control-claims.js +170 -0
  512. package/scripts/bongos/docs-entropy.js +453 -0
  513. package/scripts/bongos/doctor.js +493 -0
  514. package/scripts/bongos/enroll-control-plane.js +101 -0
  515. package/scripts/bongos/exec-path-guard.js +564 -0
  516. package/scripts/bongos/feedback-send.js +249 -0
  517. package/scripts/bongos/fetch-art-key.js +106 -0
  518. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  519. package/scripts/bongos/figma-design-sync.js +11 -0
  520. package/scripts/bongos/find-untested.js +371 -0
  521. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  522. package/scripts/bongos/fitness-checks-identity.js +332 -0
  523. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  524. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  525. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  526. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  527. package/scripts/bongos/fitness-lib.js +127 -0
  528. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  529. package/scripts/bongos/fitness-ratchets.js +594 -0
  530. package/scripts/bongos/fitness.js +1498 -0
  531. package/scripts/bongos/forwarder.js +80 -0
  532. package/scripts/bongos/gate-review.js +330 -0
  533. package/scripts/bongos/gating.js +348 -0
  534. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  535. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  537. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  538. package/scripts/bongos/gds-literal-scan.js +196 -0
  539. package/scripts/bongos/gen-api-client.js +576 -0
  540. package/scripts/bongos/gen-api-docs.js +1111 -0
  541. package/scripts/bongos/gen-atlas.js +366 -0
  542. package/scripts/bongos/gen-diagrams.js +608 -0
  543. package/scripts/bongos/gen-file-map.js +337 -0
  544. package/scripts/bongos/gen-freshness.js +32 -0
  545. package/scripts/bongos/gen-interaction-posture.js +122 -0
  546. package/scripts/bongos/gen-repo-map.js +540 -0
  547. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  548. package/scripts/bongos/gen-session-index.js +243 -0
  549. package/scripts/bongos/gen-sounds.js +176 -0
  550. package/scripts/bongos/git-merge-regen.js +254 -0
  551. package/scripts/bongos/go-live.js +1071 -0
  552. package/scripts/bongos/goal.js +272 -0
  553. package/scripts/bongos/government-walk.js +1477 -0
  554. package/scripts/bongos/grade-correlation-audit.js +310 -0
  555. package/scripts/bongos/grade-replay.js +237 -0
  556. package/scripts/bongos/grade-smoke.js +205 -0
  557. package/scripts/bongos/home-isolation-guard.js +126 -0
  558. package/scripts/bongos/hooks/pre-push.js +211 -0
  559. package/scripts/bongos/howto.js +145 -0
  560. package/scripts/bongos/http-api-client.js +81 -0
  561. package/scripts/bongos/identity-strip.js +75 -0
  562. package/scripts/bongos/init.js +1159 -0
  563. package/scripts/bongos/install-git-hooks.js +200 -0
  564. package/scripts/bongos/instance-apex.js +38 -0
  565. package/scripts/bongos/intent-retry.js +52 -0
  566. package/scripts/bongos/key-card.js +222 -0
  567. package/scripts/bongos/key-status.js +126 -0
  568. package/scripts/bongos/land-watch.js +201 -0
  569. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  570. package/scripts/bongos/learning-capture.js +145 -0
  571. package/scripts/bongos/lib.sh +74 -0
  572. package/scripts/bongos/linkify-refs.js +655 -0
  573. package/scripts/bongos/lint-infra-exec.js +70 -0
  574. package/scripts/bongos/lint-migrations.js +102 -0
  575. package/scripts/bongos/lint-workflow-exec.js +63 -0
  576. package/scripts/bongos/local-preview-lib.js +128 -0
  577. package/scripts/bongos/local-preview.js +82 -0
  578. package/scripts/bongos/login.js +360 -0
  579. package/scripts/bongos/main-audit.js +625 -0
  580. package/scripts/bongos/me.js +97 -0
  581. package/scripts/bongos/memory-map.js +176 -0
  582. package/scripts/bongos/merge-lock.js +71 -0
  583. package/scripts/bongos/migration-namespace.js +313 -0
  584. package/scripts/bongos/mirror-lineage-check.js +343 -0
  585. package/scripts/bongos/mirror-redact.js +350 -0
  586. package/scripts/bongos/module-artifact.js +289 -0
  587. package/scripts/bongos/module-assess-docs.js +238 -0
  588. package/scripts/bongos/module-assess-installs.js +228 -0
  589. package/scripts/bongos/module-assess-score.js +111 -0
  590. package/scripts/bongos/module-assess-security.js +252 -0
  591. package/scripts/bongos/module-assess-tests.js +278 -0
  592. package/scripts/bongos/module-assess-version.js +92 -0
  593. package/scripts/bongos/module-error-report.js +148 -0
  594. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  595. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  596. package/scripts/bongos/module-test-runner.js +414 -0
  597. package/scripts/bongos/module.js +1376 -0
  598. package/scripts/bongos/move-escalation.js +141 -0
  599. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  600. package/scripts/bongos/newcomer-floor.js +421 -0
  601. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  602. package/scripts/bongos/newcomer-floor.test.js +235 -0
  603. package/scripts/bongos/next-number.js +163 -0
  604. package/scripts/bongos/oauth-secret.js +202 -0
  605. package/scripts/bongos/onboard.js +267 -0
  606. package/scripts/bongos/onboarding-analyze.js +226 -0
  607. package/scripts/bongos/onboarding-config.js +179 -0
  608. package/scripts/bongos/onboarding-ship.js +92 -0
  609. package/scripts/bongos/pack-env-prefix.js +73 -0
  610. package/scripts/bongos/package-core.js +1200 -0
  611. package/scripts/bongos/page-inventory.js +348 -0
  612. package/scripts/bongos/page-reader.js +722 -0
  613. package/scripts/bongos/paste-token.js +212 -0
  614. package/scripts/bongos/plain-cards.js +351 -0
  615. package/scripts/bongos/portability-smoke-art.sh +85 -0
  616. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  617. package/scripts/bongos/preflight.js +214 -0
  618. package/scripts/bongos/probe-cache.js +246 -0
  619. package/scripts/bongos/prove-strict-versioning.js +284 -0
  620. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  621. package/scripts/bongos/provision-byo-host.js +68 -0
  622. package/scripts/bongos/provision-capacity.js +79 -0
  623. package/scripts/bongos/provision-caps.js +63 -0
  624. package/scripts/bongos/provision-config.js +233 -0
  625. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  626. package/scripts/bongos/provision-disconnect.js +88 -0
  627. package/scripts/bongos/provision-github-setup.js +168 -0
  628. package/scripts/bongos/provision-net.js +357 -0
  629. package/scripts/bongos/provision-pin-key.js +176 -0
  630. package/scripts/bongos/provision-pin-replay.js +126 -0
  631. package/scripts/bongos/provision-process.js +170 -0
  632. package/scripts/bongos/provision-render.js +201 -0
  633. package/scripts/bongos/provision-repo-auth.js +164 -0
  634. package/scripts/bongos/provision-repo-private.js +98 -0
  635. package/scripts/bongos/provision-repo.js +1337 -0
  636. package/scripts/bongos/provision-teardown.js +106 -0
  637. package/scripts/bongos/provision-units.js +469 -0
  638. package/scripts/bongos/provision.js +1479 -0
  639. package/scripts/bongos/publish-credential-check.js +66 -0
  640. package/scripts/bongos/publish-integration-gate.js +142 -0
  641. package/scripts/bongos/publish-manifest.js +440 -0
  642. package/scripts/bongos/publish-watch.js +268 -0
  643. package/scripts/bongos/pulse.js +338 -0
  644. package/scripts/bongos/push-main.js +56 -0
  645. package/scripts/bongos/push-path-brief.js +100 -0
  646. package/scripts/bongos/read-session-export.js +359 -0
  647. package/scripts/bongos/reauth.js +155 -0
  648. package/scripts/bongos/recall.js +183 -0
  649. package/scripts/bongos/redteam-patrol.js +437 -0
  650. package/scripts/bongos/regen-instance-docs.js +47 -0
  651. package/scripts/bongos/release-core.js +80 -0
  652. package/scripts/bongos/release-notes.js +271 -0
  653. package/scripts/bongos/release.js +139 -0
  654. package/scripts/bongos/rename-history-check.js +369 -0
  655. package/scripts/bongos/rename-ledger-prose.js +482 -0
  656. package/scripts/bongos/render-api.js +197 -0
  657. package/scripts/bongos/render-check.js +206 -0
  658. package/scripts/bongos/render-ideas.js +226 -0
  659. package/scripts/bongos/render-payload.js +85 -0
  660. package/scripts/bongos/repo-metrics.js +363 -0
  661. package/scripts/bongos/review-sheet.js +108 -0
  662. package/scripts/bongos/role-pack-guard.js +142 -0
  663. package/scripts/bongos/route-shadow-guard.js +175 -0
  664. package/scripts/bongos/routine-schedule.js +318 -0
  665. package/scripts/bongos/run-routine.js +257 -0
  666. package/scripts/bongos/run-unit-tests.js +654 -0
  667. package/scripts/bongos/runner-drift.js +151 -0
  668. package/scripts/bongos/sandbox-stage.js +459 -0
  669. package/scripts/bongos/scope-map-guard.js +300 -0
  670. package/scripts/bongos/scope-roster-guard.js +118 -0
  671. package/scripts/bongos/seam-wiring-guard.js +275 -0
  672. package/scripts/bongos/search-ingest-db.js +288 -0
  673. package/scripts/bongos/search-ingest-md.js +269 -0
  674. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  675. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  676. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  677. package/scripts/bongos/seed-staging.sh +117 -0
  678. package/scripts/bongos/seed-verify-criteria.js +124 -0
  679. package/scripts/bongos/sequence.js +597 -0
  680. package/scripts/bongos/session-cost.js +430 -0
  681. package/scripts/bongos/session-digest-build.js +293 -0
  682. package/scripts/bongos/session-digest.js +200 -0
  683. package/scripts/bongos/session-eval.js +631 -0
  684. package/scripts/bongos/session-transcript-build.js +155 -0
  685. package/scripts/bongos/session-transcript-upload.js +29 -0
  686. package/scripts/bongos/session.js +404 -0
  687. package/scripts/bongos/setup.js +646 -0
  688. package/scripts/bongos/ship-check.js +89 -0
  689. package/scripts/bongos/ship-deploy-target.js +393 -0
  690. package/scripts/bongos/ship-escalation.js +167 -0
  691. package/scripts/bongos/ship-finish.js +420 -0
  692. package/scripts/bongos/ship-flow.js +1217 -0
  693. package/scripts/bongos/ship-git.js +100 -0
  694. package/scripts/bongos/ship-grade-steps.js +547 -0
  695. package/scripts/bongos/ship-grade.js +426 -0
  696. package/scripts/bongos/ship-honesty.js +314 -0
  697. package/scripts/bongos/ship-io.js +139 -0
  698. package/scripts/bongos/ship-land.js +1130 -0
  699. package/scripts/bongos/ship-memory-sync.js +249 -0
  700. package/scripts/bongos/ship-merge-gate.js +225 -0
  701. package/scripts/bongos/ship-merge.js +466 -0
  702. package/scripts/bongos/ship-mode-ask.js +138 -0
  703. package/scripts/bongos/ship-mode-manual.js +54 -0
  704. package/scripts/bongos/ship-preflight-steps.js +399 -0
  705. package/scripts/bongos/ship-regen.js +291 -0
  706. package/scripts/bongos/ship-resume.js +201 -0
  707. package/scripts/bongos/ship-session-upload.js +313 -0
  708. package/scripts/bongos/ship-state.js +110 -0
  709. package/scripts/bongos/ship-surprise.js +84 -0
  710. package/scripts/bongos/ship-visual.js +75 -0
  711. package/scripts/bongos/ship.js +382 -0
  712. package/scripts/bongos/shipping-mode.js +71 -0
  713. package/scripts/bongos/skill-lint.js +250 -0
  714. package/scripts/bongos/skill-preflight.js +361 -0
  715. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  716. package/scripts/bongos/smoke-batch-release.sh +316 -0
  717. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  718. package/scripts/bongos/smoke-dependencies.sh +143 -0
  719. package/scripts/bongos/smoke-gds.js +256 -0
  720. package/scripts/bongos/smoke-write.sh +275 -0
  721. package/scripts/bongos/source-text-test-scan.js +106 -0
  722. package/scripts/bongos/spark.js +294 -0
  723. package/scripts/bongos/stale-worktrees.js +212 -0
  724. package/scripts/bongos/start-goals.js +102 -0
  725. package/scripts/bongos/start.js +1090 -0
  726. package/scripts/bongos/status.js +545 -0
  727. package/scripts/bongos/strand-watch.js +315 -0
  728. package/scripts/bongos/stranded-rows.js +200 -0
  729. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  730. package/scripts/bongos/surface.js +101 -0
  731. package/scripts/bongos/task.js +273 -0
  732. package/scripts/bongos/test-path-guard.js +99 -0
  733. package/scripts/bongos/triage.js +742 -0
  734. package/scripts/bongos/turn-end-sound.js +74 -0
  735. package/scripts/bongos/tweak-halt.js +70 -0
  736. package/scripts/bongos/tweak-renders.js +200 -0
  737. package/scripts/bongos/uat.js +120 -0
  738. package/scripts/bongos/ui-kit-transform.js +43 -0
  739. package/scripts/bongos/update-channel.js +512 -0
  740. package/scripts/bongos/update-sweep.js +829 -0
  741. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  742. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  743. package/scripts/bongos/upgrade-migrate.js +224 -0
  744. package/scripts/bongos/upgrade-operator.js +73 -0
  745. package/scripts/bongos/upgrade-outcome.js +174 -0
  746. package/scripts/bongos/upgrade.js +1499 -0
  747. package/scripts/bongos/validate-design.js +12 -0
  748. package/scripts/bongos/version-close.js +621 -0
  749. package/scripts/bongos/version-literal-guard.js +140 -0
  750. package/scripts/bongos/version-select.js +79 -0
  751. package/scripts/bongos/visual-review-nudge.js +39 -0
  752. package/scripts/bongos/wedge-remedy.js +174 -0
  753. package/scripts/bongos/worktree-claim-guard.js +130 -0
  754. package/scripts/bongos/worktree.js +449 -0
  755. package/scripts/discord/post.js +1 -1
  756. package/scripts/gds/README.md +9 -0
  757. package/scripts/gds/abandon.js +6 -136
  758. package/scripts/gds/accessibility-replay.js +5 -194
  759. package/scripts/gds/address-park-sweep.sh +7 -90
  760. package/scripts/gds/adopt-detect.js +5 -121
  761. package/scripts/gds/adopt-import.js +5 -109
  762. package/scripts/gds/adopt-preflight.js +5 -185
  763. package/scripts/gds/adr-namespace.js +5 -271
  764. package/scripts/gds/agent-invoke.js +5 -687
  765. package/scripts/gds/agents-sync.js +5 -500
  766. package/scripts/gds/api-alias-caller-scan.js +5 -255
  767. package/scripts/gds/api-artifacts.js +6 -0
  768. package/scripts/gds/api.js +6 -85
  769. package/scripts/gds/api.ps1 +8 -26
  770. package/scripts/gds/architect-audit.js +6 -293
  771. package/scripts/gds/artifact-audit.js +5 -324
  772. package/scripts/gds/artifact-format.js +6 -203
  773. package/scripts/gds/ask.js +5 -229
  774. package/scripts/gds/audit-authorship.sh +7 -328
  775. package/scripts/gds/audit-deps.js +6 -188
  776. package/scripts/gds/audit-gate.js +5 -119
  777. package/scripts/gds/audit-rank-roles.js +6 -171
  778. package/scripts/gds/audit-replay.sh +7 -204
  779. package/scripts/gds/autobongos-digest.js +5 -121
  780. package/scripts/gds/autobongos-grade-cap.js +5 -186
  781. package/scripts/gds/autobongos-loop.js +5 -208
  782. package/scripts/gds/autobongos-run.js +5 -1359
  783. package/scripts/gds/autobongos-service.cmd +8 -49
  784. package/scripts/gds/autobongos-service.ps1 +8 -270
  785. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  786. package/scripts/gds/autobongos-verify.js +5 -616
  787. package/scripts/gds/autonomy-gate.js +5 -133
  788. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  789. package/scripts/gds/autonomy-gauge.js +5 -82
  790. package/scripts/gds/backfill-cost.js +6 -175
  791. package/scripts/gds/backfill-disciplines.js +5 -142
  792. package/scripts/gds/backfill-session-earnings.js +5 -121
  793. package/scripts/gds/backfill-session-types.js +5 -85
  794. package/scripts/gds/backfill-sessions.js +5 -409
  795. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  796. package/scripts/gds/backfill-task-rewards.js +5 -411
  797. package/scripts/gds/backlog-review.js +6 -398
  798. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  799. package/scripts/gds/backup.js +6 -115
  800. package/scripts/gds/baseline-staleness.js +5 -215
  801. package/scripts/gds/bfg-principal-token.js +6 -64
  802. package/scripts/gds/bug-attachment-audit.js +5 -147
  803. package/scripts/gds/bug-attachment-recover.js +5 -196
  804. package/scripts/gds/bug-triage.js +6 -291
  805. package/scripts/gds/build-bongos.js +5 -92
  806. package/scripts/gds/bump-version.js +5 -219
  807. package/scripts/gds/capture.js +6 -480
  808. package/scripts/gds/category-advisory-guard.js +5 -205
  809. package/scripts/gds/ci-grade.js +6 -81
  810. package/scripts/gds/claim-recall.js +6 -111
  811. package/scripts/gds/claim.js +6 -788
  812. package/scripts/gds/claude-materialize.js +5 -1198
  813. package/scripts/gds/claude-md-template.js +5 -140
  814. package/scripts/gds/cleanup-orphans.js +6 -73
  815. package/scripts/gds/cli-lib.js +6 -1204
  816. package/scripts/gds/client-baseurl-guard.js +5 -114
  817. package/scripts/gds/conductor-dispatch.js +6 -534
  818. package/scripts/gds/context-pack.js +6 -325
  819. package/scripts/gds/control-manifest.js +5 -197
  820. package/scripts/gds/copy-apply.js +5 -756
  821. package/scripts/gds/copy-inventory.js +5 -569
  822. package/scripts/gds/core-origin-follow.js +5 -184
  823. package/scripts/gds/core-pin-sync.js +5 -258
  824. package/scripts/gds/cost-report.js +6 -62
  825. package/scripts/gds/cost.js +6 -46
  826. package/scripts/gds/credential-presence.js +5 -294
  827. package/scripts/gds/cutover-codemod.js +5 -239
  828. package/scripts/gds/db-backup-nightly.sh +7 -231
  829. package/scripts/gds/db-backup-offsite.sh +7 -266
  830. package/scripts/gds/demote.js +6 -44
  831. package/scripts/gds/deploy-divergence.js +6 -445
  832. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  833. package/scripts/gds/design-sync.js +5 -10
  834. package/scripts/gds/dev-box-guard.js +5 -164
  835. package/scripts/gds/dev-lib.js +5 -721
  836. package/scripts/gds/dev.js +5 -643
  837. package/scripts/gds/device-flow-help.js +5 -70
  838. package/scripts/gds/diagnose-achievements.js +5 -116
  839. package/scripts/gds/diagram-facts.js +6 -355
  840. package/scripts/gds/discord-channels.js +5 -75
  841. package/scripts/gds/do-api.js +6 -109
  842. package/scripts/gds/doc-cli-guard.js +5 -266
  843. package/scripts/gds/doc-comment-coverage.js +5 -137
  844. package/scripts/gds/doc-control-claims.js +5 -166
  845. package/scripts/gds/docs-entropy.js +5 -443
  846. package/scripts/gds/doctor.js +6 -492
  847. package/scripts/gds/enroll-control-plane.js +5 -99
  848. package/scripts/gds/exec-path-guard.js +5 -562
  849. package/scripts/gds/feedback-send.js +5 -247
  850. package/scripts/gds/fetch-art-key.js +5 -104
  851. package/scripts/gds/fetch-sound-prefs.js +5 -124
  852. package/scripts/gds/figma-design-sync.js +5 -9
  853. package/scripts/gds/find-untested.js +5 -369
  854. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  855. package/scripts/gds/fitness-checks-identity.js +5 -342
  856. package/scripts/gds/fitness-checks-packaging.js +5 -131
  857. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  858. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  859. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  860. package/scripts/gds/fitness-lib.js +5 -126
  861. package/scripts/gds/fitness-migration-contraction.js +5 -49
  862. package/scripts/gds/fitness-ratchets.js +5 -563
  863. package/scripts/gds/fitness.js +5 -1493
  864. package/scripts/gds/gate-review.js +5 -328
  865. package/scripts/gds/gating.js +5 -346
  866. package/scripts/gds/gds-literal-scan.js +5 -194
  867. package/scripts/gds/gen-api-client.js +5 -555
  868. package/scripts/gds/gen-api-docs.js +5 -1100
  869. package/scripts/gds/gen-atlas.js +5 -364
  870. package/scripts/gds/gen-diagrams.js +6 -607
  871. package/scripts/gds/gen-file-map.js +5 -335
  872. package/scripts/gds/gen-freshness.js +5 -31
  873. package/scripts/gds/gen-interaction-posture.js +5 -120
  874. package/scripts/gds/gen-repo-map.js +5 -538
  875. package/scripts/gds/gen-role-responsibilities.js +5 -133
  876. package/scripts/gds/gen-session-index.js +5 -241
  877. package/scripts/gds/gen-sounds.js +5 -174
  878. package/scripts/gds/git-merge-regen.js +6 -291
  879. package/scripts/gds/go-live.js +5 -1069
  880. package/scripts/gds/goal.js +6 -271
  881. package/scripts/gds/government-walk.js +5 -1475
  882. package/scripts/gds/grade-correlation-audit.js +5 -308
  883. package/scripts/gds/grade-replay.js +5 -235
  884. package/scripts/gds/grade-smoke.js +6 -204
  885. package/scripts/gds/home-isolation-guard.js +5 -125
  886. package/scripts/gds/hooks/pre-push.js +5 -209
  887. package/scripts/gds/howto.js +5 -143
  888. package/scripts/gds/http-api-client.js +6 -81
  889. package/scripts/gds/identity-strip.js +5 -74
  890. package/scripts/gds/init.js +5 -1157
  891. package/scripts/gds/install-git-hooks.js +5 -198
  892. package/scripts/gds/instance-apex.js +5 -37
  893. package/scripts/gds/intent-retry.js +5 -51
  894. package/scripts/gds/key-card.js +6 -221
  895. package/scripts/gds/key-status.js +5 -124
  896. package/scripts/gds/land-watch.js +5 -199
  897. package/scripts/gds/leak-scan-allowlist.js +5 -291
  898. package/scripts/gds/learning-capture.js +6 -144
  899. package/scripts/gds/lib.sh +7 -73
  900. package/scripts/gds/linkify-refs.js +6 -654
  901. package/scripts/gds/lint-infra-exec.js +5 -68
  902. package/scripts/gds/lint-migrations.js +5 -100
  903. package/scripts/gds/lint-workflow-exec.js +5 -61
  904. package/scripts/gds/local-preview-lib.js +6 -128
  905. package/scripts/gds/local-preview.js +6 -81
  906. package/scripts/gds/login.js +5 -358
  907. package/scripts/gds/main-audit.js +5 -623
  908. package/scripts/gds/me.js +6 -96
  909. package/scripts/gds/memory-map.js +5 -174
  910. package/scripts/gds/merge-lock.js +6 -70
  911. package/scripts/gds/migration-namespace.js +5 -311
  912. package/scripts/gds/mirror-lineage-check.js +5 -341
  913. package/scripts/gds/mirror-redact.js +5 -348
  914. package/scripts/gds/module-artifact.js +6 -289
  915. package/scripts/gds/module-assess-docs.js +6 -237
  916. package/scripts/gds/module-assess-installs.js +6 -227
  917. package/scripts/gds/module-assess-score.js +6 -110
  918. package/scripts/gds/module-assess-security.js +6 -251
  919. package/scripts/gds/module-assess-tests.js +6 -277
  920. package/scripts/gds/module-assess-version.js +6 -91
  921. package/scripts/gds/module-error-report.js +5 -146
  922. package/scripts/gds/module-test-runner.js +6 -413
  923. package/scripts/gds/module.js +5 -1374
  924. package/scripts/gds/move-escalation.js +5 -140
  925. package/scripts/gds/newcomer-floor.js +6 -420
  926. package/scripts/gds/newcomer-floor.test.js +6 -234
  927. package/scripts/gds/next-number.js +6 -162
  928. package/scripts/gds/oauth-secret.js +5 -200
  929. package/scripts/gds/onboard.js +5 -265
  930. package/scripts/gds/onboarding-analyze.js +6 -225
  931. package/scripts/gds/onboarding-config.js +6 -179
  932. package/scripts/gds/onboarding-ship.js +6 -91
  933. package/scripts/gds/pack-env-prefix.js +5 -72
  934. package/scripts/gds/package-core.js +5 -1102
  935. package/scripts/gds/page-inventory.js +5 -346
  936. package/scripts/gds/page-reader.js +5 -720
  937. package/scripts/gds/paste-token.js +6 -211
  938. package/scripts/gds/plain-cards.js +5 -350
  939. package/scripts/gds/portability-smoke-art.sh +7 -84
  940. package/scripts/gds/portability-smoke-memory.sh +7 -175
  941. package/scripts/gds/preflight.js +5 -212
  942. package/scripts/gds/probe-cache.js +5 -244
  943. package/scripts/gds/prove-strict-versioning.js +6 -283
  944. package/scripts/gds/provision-auto-upgrade.js +5 -161
  945. package/scripts/gds/provision-byo-host.js +5 -67
  946. package/scripts/gds/provision-capacity.js +5 -78
  947. package/scripts/gds/provision-caps.js +5 -62
  948. package/scripts/gds/provision-config.js +5 -232
  949. package/scripts/gds/provision-core-upgrade.js +5 -1165
  950. package/scripts/gds/provision-disconnect.js +5 -87
  951. package/scripts/gds/provision-github-setup.js +5 -167
  952. package/scripts/gds/provision-net.js +5 -356
  953. package/scripts/gds/provision-pin-key.js +5 -175
  954. package/scripts/gds/provision-pin-replay.js +5 -125
  955. package/scripts/gds/provision-process.js +5 -169
  956. package/scripts/gds/provision-render.js +5 -200
  957. package/scripts/gds/provision-repo-auth.js +5 -163
  958. package/scripts/gds/provision-repo-private.js +5 -97
  959. package/scripts/gds/provision-repo.js +5 -1336
  960. package/scripts/gds/provision-teardown.js +5 -105
  961. package/scripts/gds/provision-units.js +5 -468
  962. package/scripts/gds/provision.js +5 -1477
  963. package/scripts/gds/publish-credential-check.js +6 -65
  964. package/scripts/gds/publish-integration-gate.js +5 -140
  965. package/scripts/gds/publish-manifest.js +5 -437
  966. package/scripts/gds/publish-watch.js +5 -266
  967. package/scripts/gds/pulse.js +6 -335
  968. package/scripts/gds/push-main.js +5 -54
  969. package/scripts/gds/push-path-brief.js +5 -98
  970. package/scripts/gds/read-session-export.js +5 -357
  971. package/scripts/gds/reauth.js +6 -154
  972. package/scripts/gds/recall.js +6 -182
  973. package/scripts/gds/redteam-patrol.js +5 -435
  974. package/scripts/gds/regen-instance-docs.js +5 -45
  975. package/scripts/gds/release-core.js +5 -78
  976. package/scripts/gds/release-notes.js +5 -270
  977. package/scripts/gds/release.js +6 -138
  978. package/scripts/gds/rename-history-check.js +5 -367
  979. package/scripts/gds/rename-ledger-prose.js +5 -480
  980. package/scripts/gds/render-api.js +5 -196
  981. package/scripts/gds/render-check.js +5 -204
  982. package/scripts/gds/render-ideas.js +6 -225
  983. package/scripts/gds/render-payload.js +5 -84
  984. package/scripts/gds/repo-metrics.js +6 -362
  985. package/scripts/gds/review-sheet.js +5 -106
  986. package/scripts/gds/role-pack-guard.js +5 -141
  987. package/scripts/gds/route-shadow-guard.js +5 -173
  988. package/scripts/gds/routine-schedule.js +5 -281
  989. package/scripts/gds/run-routine.js +5 -255
  990. package/scripts/gds/run-unit-tests.js +6 -659
  991. package/scripts/gds/runner-drift.js +5 -149
  992. package/scripts/gds/sandbox-stage.js +6 -458
  993. package/scripts/gds/scope-map-guard.js +5 -299
  994. package/scripts/gds/scope-roster-guard.js +5 -117
  995. package/scripts/gds/seam-wiring-guard.js +5 -274
  996. package/scripts/gds/search-ingest-db.js +6 -287
  997. package/scripts/gds/search-ingest-md.js +6 -268
  998. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  999. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1000. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1001. package/scripts/gds/seed-staging.sh +7 -116
  1002. package/scripts/gds/seed-verify-criteria.js +6 -124
  1003. package/scripts/gds/sequence.js +6 -596
  1004. package/scripts/gds/session-cost.js +6 -429
  1005. package/scripts/gds/session-digest-build.js +6 -293
  1006. package/scripts/gds/session-digest.js +6 -199
  1007. package/scripts/gds/session-eval.js +6 -630
  1008. package/scripts/gds/session-transcript-build.js +6 -155
  1009. package/scripts/gds/session-transcript-upload.js +6 -29
  1010. package/scripts/gds/session.js +6 -403
  1011. package/scripts/gds/setup.js +6 -645
  1012. package/scripts/gds/ship-check.js +5 -85
  1013. package/scripts/gds/ship-deploy-target.js +5 -392
  1014. package/scripts/gds/ship-escalation.js +5 -166
  1015. package/scripts/gds/ship-finish.js +5 -419
  1016. package/scripts/gds/ship-flow.js +5 -1216
  1017. package/scripts/gds/ship-git.js +5 -99
  1018. package/scripts/gds/ship-grade-steps.js +5 -546
  1019. package/scripts/gds/ship-grade.js +5 -425
  1020. package/scripts/gds/ship-honesty.js +5 -312
  1021. package/scripts/gds/ship-io.js +5 -138
  1022. package/scripts/gds/ship-land.js +5 -1129
  1023. package/scripts/gds/ship-memory-sync.js +5 -248
  1024. package/scripts/gds/ship-merge-gate.js +5 -224
  1025. package/scripts/gds/ship-merge.js +5 -465
  1026. package/scripts/gds/ship-mode-ask.js +5 -137
  1027. package/scripts/gds/ship-mode-manual.js +5 -53
  1028. package/scripts/gds/ship-preflight-steps.js +5 -398
  1029. package/scripts/gds/ship-regen.js +5 -313
  1030. package/scripts/gds/ship-resume.js +5 -200
  1031. package/scripts/gds/ship-session-upload.js +5 -312
  1032. package/scripts/gds/ship-state.js +5 -109
  1033. package/scripts/gds/ship-surprise.js +5 -83
  1034. package/scripts/gds/ship-visual.js +5 -74
  1035. package/scripts/gds/ship.js +5 -380
  1036. package/scripts/gds/shipping-mode.js +5 -69
  1037. package/scripts/gds/skill-lint.js +5 -248
  1038. package/scripts/gds/skill-preflight.js +5 -359
  1039. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1040. package/scripts/gds/smoke-batch-release.sh +7 -315
  1041. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1042. package/scripts/gds/smoke-dependencies.sh +7 -142
  1043. package/scripts/gds/smoke-gds.js +6 -255
  1044. package/scripts/gds/smoke-write.sh +7 -274
  1045. package/scripts/gds/source-text-test-scan.js +7 -0
  1046. package/scripts/gds/spark.js +6 -293
  1047. package/scripts/gds/stale-worktrees.js +5 -210
  1048. package/scripts/gds/start-goals.js +5 -101
  1049. package/scripts/gds/start.js +6 -1089
  1050. package/scripts/gds/status.js +6 -544
  1051. package/scripts/gds/strand-watch.js +5 -313
  1052. package/scripts/gds/stranded-rows.js +5 -198
  1053. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1054. package/scripts/gds/surface.js +5 -100
  1055. package/scripts/gds/task.js +6 -272
  1056. package/scripts/gds/test-path-guard.js +5 -97
  1057. package/scripts/gds/triage.js +6 -741
  1058. package/scripts/gds/turn-end-sound.js +5 -72
  1059. package/scripts/gds/tweak-halt.js +5 -68
  1060. package/scripts/gds/tweak-renders.js +5 -198
  1061. package/scripts/gds/uat.js +6 -119
  1062. package/scripts/gds/ui-kit-transform.js +5 -41
  1063. package/scripts/gds/update-channel.js +5 -510
  1064. package/scripts/gds/update-sweep.js +5 -827
  1065. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1066. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1067. package/scripts/gds/upgrade-migrate.js +5 -223
  1068. package/scripts/gds/upgrade-operator.js +6 -73
  1069. package/scripts/gds/upgrade-outcome.js +5 -173
  1070. package/scripts/gds/upgrade.js +5 -1497
  1071. package/scripts/gds/validate-design.js +5 -10
  1072. package/scripts/gds/version-close.js +6 -620
  1073. package/scripts/gds/version-literal-guard.js +5 -138
  1074. package/scripts/gds/version-select.js +5 -77
  1075. package/scripts/gds/visual-review-nudge.js +5 -38
  1076. package/scripts/gds/wedge-remedy.js +5 -173
  1077. package/scripts/gds/worktree-claim-guard.js +5 -129
  1078. package/scripts/gds/worktree.js +6 -448
  1079. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1080. package/scripts/hall-preview/server.js +2 -2
  1081. package/scripts/migrate.sh +3 -3
  1082. package/scripts/public-mirror-export.js +3 -3
  1083. package/scripts/security/dep-audit.js +50 -124
  1084. package/scripts/setup-builder.js +7 -7
  1085. package/src/bongos/api-errors.js +1 -0
  1086. package/src/bongos/api-prefix.js +1 -1
  1087. package/src/bongos/auth-github.js +19 -3
  1088. package/src/bongos/auth-idp.js +7 -0
  1089. package/src/bongos/claim-attribution.js +2 -2
  1090. package/src/bongos/core-moves.js +1 -1
  1091. package/src/bongos/core-update.js +3 -3
  1092. package/src/bongos/craft-mode.js +2 -2
  1093. package/src/bongos/db-kernel.js +15 -3
  1094. package/src/bongos/db.js +30 -4
  1095. package/src/bongos/github-repos.js +1 -1
  1096. package/src/bongos/llm-cache.js +1 -1
  1097. package/src/bongos/llm-pricing.js +1 -1
  1098. package/src/bongos/metrics.js +1 -1
  1099. package/src/bongos/middleware/rate-limit.js +2 -2
  1100. package/src/bongos/module-listing.js +93 -1
  1101. package/src/bongos/module-scope-map.js +90 -85
  1102. package/src/bongos/module-store.js +1 -1
  1103. package/src/bongos/module-submissions.js +1 -1
  1104. package/src/bongos/optimizer.js +1 -1
  1105. package/src/bongos/package-registry.js +1 -1
  1106. package/src/bongos/path-match.js +1 -1
  1107. package/src/bongos/permission-path-check.js +3 -3
  1108. package/src/bongos/platform-visibility-gate.js +3 -5
  1109. package/src/bongos/prelaunch-gate.js +7 -6
  1110. package/src/bongos/route-rank-check.js +2 -2
  1111. package/src/bongos/routes/auth.js +15 -2
  1112. package/src/bongos/routes/backup.js +1 -1
  1113. package/src/bongos/routes/builders.js +29 -1
  1114. package/src/bongos/routes/me.js +49 -18
  1115. package/src/bongos/routes/modules.js +29 -9
  1116. package/src/bongos/routes/public.js +3 -72
  1117. package/src/bongos/schema-lag.js +1 -1
  1118. package/src/bongos/sensitive-surfaces.js +1 -1
  1119. package/src/bongos/serve-internal.js +65 -16
  1120. package/src/bongos/software-update.js +2 -2
  1121. package/src/bongos/upgrade-hold.js +3 -3
  1122. package/src/hall-look.js +6 -5
  1123. package/src/module-api.js +3 -3
  1124. package/src/module-loader/catalog.js +1 -1
  1125. package/src/module-loader/error-tally.js +3 -3
  1126. package/src/module-loader/manifest-schema.js +3 -3
  1127. package/src/platform-server.js +10 -0
  1128. package/src/role-responsibilities.js +1 -1
  1129. package/src/stale-timer.js +2 -2
  1130. package/tests/accessibility_replay.mjs +1 -1
  1131. package/tests/activity_rollup_order_db.mjs +1 -1
  1132. package/tests/activity_snapshots_db.mjs +1 -1
  1133. package/tests/adopt_detect.mjs +1 -1
  1134. package/tests/adopt_import.mjs +1 -1
  1135. package/tests/adopt_preflight.mjs +1 -1
  1136. package/tests/adr_0089_scope.mjs +10 -7
  1137. package/tests/adr_0162_citation.mjs +1 -1
  1138. package/tests/adr_0162_gate_citation.mjs +1 -1
  1139. package/tests/agent_invoke.mjs +1 -1
  1140. package/tests/agent_invoke_live.mjs +3 -3
  1141. package/tests/agents_cron_trigger.mjs +2 -2
  1142. package/tests/agents_roster.mjs +1 -1
  1143. package/tests/agents_sync.mjs +4 -4
  1144. package/tests/allow_rule_guard.mjs +20 -20
  1145. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1146. package/tests/api_alias_exceptions.mjs +7 -6
  1147. package/tests/api_artifacts.mjs +214 -0
  1148. package/tests/api_cli_flags.mjs +3 -3
  1149. package/tests/api_client.mjs +56 -54
  1150. package/tests/api_docs.mjs +30 -9
  1151. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1152. package/tests/api_msys_path_repair.mjs +2 -2
  1153. package/tests/architect.mjs +1 -1
  1154. package/tests/art_stage.mjs +2 -2
  1155. package/tests/artifact_audit.mjs +2 -2
  1156. package/tests/atlas.mjs +1 -1
  1157. package/tests/audit_deps.mjs +1 -1
  1158. package/tests/audit_gate.mjs +1 -1
  1159. package/tests/auth_flow_slice1.mjs +3 -3
  1160. package/tests/auth_inactive_builder.mjs +43 -5
  1161. package/tests/auth_session_expiry_db.mjs +16 -4
  1162. package/tests/auth_session_ttl.mjs +23 -0
  1163. package/tests/authorship_audit.mjs +2 -2
  1164. package/tests/autobongos_cadence.mjs +1 -1
  1165. package/tests/autobongos_fence.mjs +1 -1
  1166. package/tests/autobongos_grade_cap.mjs +2 -2
  1167. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1168. package/tests/autobongos_host_access.mjs +3 -3
  1169. package/tests/autobongos_loop.mjs +17 -17
  1170. package/tests/autobongos_service_ps1.mjs +3 -3
  1171. package/tests/autobongos_tweak_lane.mjs +2 -2
  1172. package/tests/autobongos_verify.mjs +2 -2
  1173. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1174. package/tests/autonomy_config_idle.mjs +1 -1
  1175. package/tests/autonomy_daily_checks.mjs +201 -0
  1176. package/tests/autonomy_digest.mjs +1 -1
  1177. package/tests/autonomy_gate.mjs +1 -1
  1178. package/tests/autonomy_gauge.mjs +2 -2
  1179. package/tests/autonomy_runner_identity.mjs +1 -1
  1180. package/tests/backfill_sessions.mjs +8 -8
  1181. package/tests/backfill_subagent_rewards.mjs +1 -1
  1182. package/tests/backfill_task_rewards.mjs +2 -2
  1183. package/tests/backlog_review.mjs +3 -3
  1184. package/tests/baseline_staleness.mjs +2 -2
  1185. package/tests/bfg.mjs +11 -5
  1186. package/tests/bfg_write.mjs +20 -11
  1187. package/tests/blockers_hall.mjs +14 -4
  1188. package/tests/blockers_page_ui.mjs +56 -12
  1189. package/tests/bongos_dispatch.mjs +5 -5
  1190. package/tests/bongos_login.mjs +2 -2
  1191. package/tests/bug_attachment_audit.mjs +1 -1
  1192. package/tests/bug_attachment_recover.mjs +2 -2
  1193. package/tests/bug_triage.mjs +3 -3
  1194. package/tests/build_info.mjs +1 -1
  1195. package/tests/builder_tester_tag.mjs +184 -0
  1196. package/tests/bump_version.mjs +3 -3
  1197. package/tests/canonical_profile_url.mjs +1 -1
  1198. package/tests/capture_error_format.mjs +1 -1
  1199. package/tests/capture_goal_routing.mjs +2 -2
  1200. package/tests/category_advisory_guard.mjs +3 -3
  1201. package/tests/claim_error_surface.mjs +2 -2
  1202. package/tests/claim_from_task_and_home.mjs +1 -1
  1203. package/tests/claim_gate_open_blocker.mjs +7 -4
  1204. package/tests/claim_gate_rebase.mjs +12 -8
  1205. package/tests/claim_recall.mjs +4 -4
  1206. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1207. package/tests/claude_materialize.mjs +68 -68
  1208. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1209. package/tests/cli_allowlist_permissions.mjs +11 -11
  1210. package/tests/cli_dispatcher.mjs +2 -2
  1211. package/tests/cli_err_code.mjs +6 -6
  1212. package/tests/cli_exit_no_abort.mjs +7 -7
  1213. package/tests/cli_lib_formatters.mjs +2 -2
  1214. package/tests/cli_sessions.mjs +5 -5
  1215. package/tests/cli_surface.mjs +15 -15
  1216. package/tests/cli_token_reissue.mjs +2 -2
  1217. package/tests/client_baseurl_guard.mjs +1 -1
  1218. package/tests/client_bundle_route.mjs +35 -4
  1219. package/tests/cloud_bongos_pack.mjs +1 -1
  1220. package/tests/community_leaderboard_db.mjs +1 -1
  1221. package/tests/conductor.mjs +18 -18
  1222. package/tests/conflict_resolve.mjs +14 -16
  1223. package/tests/consumer_layout_boot.mjs +12 -12
  1224. package/tests/context_pack.mjs +6 -6
  1225. package/tests/control_manifest.mjs +4 -4
  1226. package/tests/copy_desk_page_reads.mjs +1 -1
  1227. package/tests/copy_desk_page_release.mjs +192 -0
  1228. package/tests/copy_inventory.mjs +2 -2
  1229. package/tests/core_auto_upgrade.mjs +1 -1
  1230. package/tests/core_move_notice.mjs +2 -2
  1231. package/tests/core_origin_follow.mjs +7 -7
  1232. package/tests/core_pin_sync.mjs +3 -3
  1233. package/tests/core_upgrade_door.mjs +2 -2
  1234. package/tests/core_upgrade_owner_door.mjs +34 -1
  1235. package/tests/core_upgrade_runner.mjs +19 -19
  1236. package/tests/credential_presence.mjs +2 -2
  1237. package/tests/credit_grant.mjs +3 -3
  1238. package/tests/credit_log_single_writer.mjs +5 -5
  1239. package/tests/criterion_ref_status.mjs +2 -2
  1240. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1241. package/tests/cutover_codemod.mjs +2 -4
  1242. package/tests/db_backup_nightly.mjs +1 -1
  1243. package/tests/db_backup_offsite.mjs +1 -1
  1244. package/tests/db_ownership_handover.mjs +2 -2
  1245. package/tests/dead_deps.mjs +3 -3
  1246. package/tests/dependency_advisory.mjs +1 -1
  1247. package/tests/deploy_audit_gate.mjs +4 -4
  1248. package/tests/deploy_divergence_line.mjs +36 -16
  1249. package/tests/deploy_page_projects.mjs +35 -4
  1250. package/tests/dev_lib.mjs +2 -2
  1251. package/tests/dev_windows.mjs +2 -2
  1252. package/tests/diagram_facts_offset.mjs +1 -1
  1253. package/tests/diagram_repo_slug.mjs +1 -1
  1254. package/tests/diff_derived_signals.mjs +2 -2
  1255. package/tests/dns_preflight.mjs +2 -2
  1256. package/tests/do_api.mjs +3 -3
  1257. package/tests/doc_cli_guard.mjs +28 -28
  1258. package/tests/doc_comment_coverage.mjs +1 -1
  1259. package/tests/doc_control_claims.mjs +11 -11
  1260. package/tests/docs_entropy.mjs +2 -2
  1261. package/tests/docs_openapi_route.mjs +8 -6
  1262. package/tests/doctor_hooks.mjs +1 -1
  1263. package/tests/edit_hints.mjs +3 -2
  1264. package/tests/effective_visibility_predicate.mjs +1 -19
  1265. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1266. package/tests/exec_path_guard.mjs +4 -4
  1267. package/tests/executed_closure.mjs +18 -12
  1268. package/tests/file_map.mjs +1 -1
  1269. package/tests/find_untested.mjs +13 -13
  1270. package/tests/first_admin_bootstrap.mjs +1 -1
  1271. package/tests/fitness.mjs +16 -16
  1272. package/tests/fitness_gds_ratchet.mjs +2 -2
  1273. package/tests/fitness_installed_core.mjs +3 -3
  1274. package/tests/fitness_no_raw_nul.mjs +1 -1
  1275. package/tests/fitness_ratchets.mjs +3 -3
  1276. package/tests/fitness_scope_roster.mjs +2 -2
  1277. package/tests/fitness_two_root.mjs +8 -8
  1278. package/tests/fixtures/accessibility-replay.json +5 -5
  1279. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1280. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1281. package/tests/fixtures/page-ledger.mjs +22 -0
  1282. package/tests/fixtures/session-506-digest.json +5 -5
  1283. package/tests/gate_approvals.mjs +50 -0
  1284. package/tests/gate_review.mjs +8 -8
  1285. package/tests/gating_review_retired.mjs +2 -2
  1286. package/tests/gen_freshness.mjs +3 -3
  1287. package/tests/git_guard.mjs +3 -3
  1288. package/tests/git_merge_regen.mjs +41 -65
  1289. package/tests/github_one_trip.mjs +4 -4
  1290. package/tests/github_pick_up.mjs +2 -2
  1291. package/tests/github_push_merge_driver.mjs +1 -1
  1292. package/tests/go_live.mjs +3 -2
  1293. package/tests/goal_category.mjs +1 -1
  1294. package/tests/goal_cli.mjs +2 -2
  1295. package/tests/goal_create_spec_entry.mjs +1 -1
  1296. package/tests/goal_invite_consent.mjs +3 -1
  1297. package/tests/goal_move.mjs +1 -1
  1298. package/tests/goal_working_area.mjs +1 -1
  1299. package/tests/government_agent_asks.mjs +7 -7
  1300. package/tests/government_board_room_copy.mjs +6 -1
  1301. package/tests/government_board_view.mjs +39 -0
  1302. package/tests/government_board_vote_ui.mjs +39 -1
  1303. package/tests/government_config.mjs +2 -2
  1304. package/tests/government_live_proof_shape.mjs +1 -1
  1305. package/tests/government_protected_surfaces.mjs +54 -53
  1306. package/tests/government_require_permission.mjs +9 -1
  1307. package/tests/government_vanilla_boot.mjs +1 -1
  1308. package/tests/government_vocabulary.mjs +2 -2
  1309. package/tests/government_walk.mjs +2 -2
  1310. package/tests/grade_body_limit.mjs +6 -4
  1311. package/tests/grade_correlation_audit.mjs +3 -3
  1312. package/tests/grade_diff_hash.mjs +1 -1
  1313. package/tests/grade_engine_replay.mjs +2 -2
  1314. package/tests/grade_server_authoritative.mjs +1 -1
  1315. package/tests/grade_unavailable_display.mjs +1 -1
  1316. package/tests/grader.mjs +8 -24
  1317. package/tests/grader_generated_provenance.mjs +14 -14
  1318. package/tests/grader_no_artifact.mjs +1 -1
  1319. package/tests/grader_prompt_fencing.mjs +1 -1
  1320. package/tests/grader_quality_window_overflow.mjs +1 -1
  1321. package/tests/grader_reader_lens.mjs +3 -3
  1322. package/tests/grader_regrade_delta.mjs +1 -1
  1323. package/tests/grader_unbacked_score.mjs +2 -2
  1324. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1325. package/tests/hall_asset_cache.mjs +127 -0
  1326. package/tests/hall_audit.mjs +63 -0
  1327. package/tests/hall_board_world.mjs +20 -0
  1328. package/tests/hall_city_card_words.mjs +61 -0
  1329. package/tests/hall_client_request_shape.mjs +5 -1
  1330. package/tests/hall_home_ships_bounded.mjs +160 -0
  1331. package/tests/hall_landing_boot.mjs +15 -2
  1332. package/tests/hall_nav.mjs +33 -0
  1333. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1334. package/tests/hall_oversight_world.mjs +44 -4
  1335. package/tests/hall_palette.mjs +12 -9
  1336. package/tests/hall_preview_security.mjs +1 -1
  1337. package/tests/hall_profile_world.mjs +17 -0
  1338. package/tests/hall_reading_world.mjs +16 -1
  1339. package/tests/hall_roster_world.mjs +2 -1
  1340. package/tests/hall_studio_world.mjs +4 -1
  1341. package/tests/hall_work_history_id.mjs +39 -0
  1342. package/tests/held_tweak_reporting.mjs +4 -4
  1343. package/tests/helpers.mjs +3 -3
  1344. package/tests/home_bounded_reads.mjs +1 -1
  1345. package/tests/home_isolation_guard.mjs +1 -1
  1346. package/tests/hook_core_resolve.mjs +7 -7
  1347. package/tests/hook_user_agents.mjs +1 -1
  1348. package/tests/hooks_drain.mjs +2 -2
  1349. package/tests/host_topology_skips.mjs +1 -1
  1350. package/tests/howto_guide.mjs +1 -1
  1351. package/tests/howto_moments.mjs +3 -3
  1352. package/tests/hub_account_page.mjs +1 -1
  1353. package/tests/idea_capture_grades.mjs +2 -2
  1354. package/tests/idea_develop_spark.mjs +1 -1
  1355. package/tests/idea_filed_via.mjs +2 -2
  1356. package/tests/idea_ideate_full.mjs +1 -1
  1357. package/tests/idea_spark_mark.mjs +1 -1
  1358. package/tests/idea_spark_queue.mjs +1 -1
  1359. package/tests/idea_triage.mjs +1 -1
  1360. package/tests/idea_triage_grade.mjs +3 -3
  1361. package/tests/idea_vote_permission.mjs +113 -0
  1362. package/tests/idea_votes_fold_db.mjs +123 -0
  1363. package/tests/infra_exec_paths.mjs +12 -12
  1364. package/tests/init.mjs +2 -2
  1365. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1366. package/tests/instance_feedback.mjs +9 -9
  1367. package/tests/instance_mismatch_guard.mjs +2 -2
  1368. package/tests/integration_parked_ratchet.mjs +24 -2
  1369. package/tests/intent_retry.mjs +1 -1
  1370. package/tests/interaction_posture.mjs +3 -3
  1371. package/tests/invite_expiry_db.mjs +1 -1
  1372. package/tests/joinability_invite_only.mjs +1 -1
  1373. package/tests/karma_vote_lists.mjs +270 -0
  1374. package/tests/key-card.mjs +2 -2
  1375. package/tests/key-status.mjs +2 -2
  1376. package/tests/knip_ratchet_ambient.mjs +2 -2
  1377. package/tests/known_failing_ratchet.mjs +1 -1
  1378. package/tests/land_watch.mjs +2 -2
  1379. package/tests/landing_legal_pages.mjs +1 -1
  1380. package/tests/landing_page.mjs +2 -2
  1381. package/tests/leaderboard_roles.mjs +4 -1
  1382. package/tests/leak_scan_allowlist.mjs +8 -8
  1383. package/tests/leak_scan_fail_closed.mjs +1 -1
  1384. package/tests/lib_sh_resolution.mjs +9 -9
  1385. package/tests/lifecycle-card.mjs +7 -7
  1386. package/tests/linkify_check.mjs +2 -2
  1387. package/tests/linkify_refs.mjs +1 -1
  1388. package/tests/llm-cache-route.mjs +1 -1
  1389. package/tests/local_preview.mjs +2 -2
  1390. package/tests/main_audit.mjs +3 -3
  1391. package/tests/main_audit_attestation.mjs +1 -1
  1392. package/tests/main_audit_db_roster.mjs +2 -2
  1393. package/tests/main_worktree_busy_reason.mjs +3 -3
  1394. package/tests/markdown_line_endings.mjs +2 -2
  1395. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1396. package/tests/membership_kind_lockstep.mjs +1 -1
  1397. package/tests/memory_isolation.mjs +16 -8
  1398. package/tests/memory_map.mjs +2 -2
  1399. package/tests/memory_pull.mjs +33 -25
  1400. package/tests/merge_driver_register.mjs +3 -3
  1401. package/tests/migration_allocation.mjs +2 -2
  1402. package/tests/migration_namespace.mjs +1 -1
  1403. package/tests/migrations_forward_safe.mjs +1 -1
  1404. package/tests/mingle.mjs +1 -1
  1405. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1406. package/tests/mirror_lineage_proof.mjs +2 -2
  1407. package/tests/mirror_redact.mjs +4 -4
  1408. package/tests/missing_dep_classify.mjs +3 -3
  1409. package/tests/module-scope-map.mjs +22 -22
  1410. package/tests/module_api_lazy.mjs +1 -1
  1411. package/tests/module_assess_docs.mjs +2 -2
  1412. package/tests/module_assess_installs.mjs +3 -3
  1413. package/tests/module_assess_price_parity.mjs +5 -5
  1414. package/tests/module_assess_score.mjs +5 -5
  1415. package/tests/module_assess_security.mjs +4 -4
  1416. package/tests/module_assess_tests.mjs +3 -3
  1417. package/tests/module_assessments_migration.mjs +1 -1
  1418. package/tests/module_catalog.mjs +2 -2
  1419. package/tests/module_cli.mjs +3 -3
  1420. package/tests/module_entitlements.mjs +1 -1
  1421. package/tests/module_error_counts.mjs +1 -1
  1422. package/tests/module_install.mjs +4 -4
  1423. package/tests/module_loader.mjs +3 -1
  1424. package/tests/module_owned_tests.mjs +1 -1
  1425. package/tests/module_release_channels.mjs +1 -1
  1426. package/tests/module_store_howto.mjs +3 -3
  1427. package/tests/module_store_listing.mjs +139 -2
  1428. package/tests/module_store_publish.mjs +4 -4
  1429. package/tests/module_store_publish_route.mjs +1 -1
  1430. package/tests/module_store_reassess.mjs +1 -1
  1431. package/tests/module_store_registry_migration.mjs +1 -1
  1432. package/tests/module_test_runner.mjs +3 -3
  1433. package/tests/module_update.mjs +4 -4
  1434. package/tests/module_upgrade_updates.mjs +1 -1
  1435. package/tests/move_escalation.mjs +2 -2
  1436. package/tests/nav_permission_atoms.mjs +3 -2
  1437. package/tests/needs_rebase.mjs +7 -3
  1438. package/tests/newcomer_floor.mjs +1 -1
  1439. package/tests/next_number.mjs +1 -1
  1440. package/tests/no_artifact_escalation.mjs +3 -3
  1441. package/tests/npm_release_where.mjs +1 -1
  1442. package/tests/oauth_secret.mjs +2 -2
  1443. package/tests/onboard.mjs +6 -6
  1444. package/tests/onboarding_gate.mjs +2 -2
  1445. package/tests/opt_in_skill_modules.mjs +3 -3
  1446. package/tests/own_scope_guard.mjs +1 -1
  1447. package/tests/own_session_revoke.mjs +4 -1
  1448. package/tests/package_core.mjs +10 -11
  1449. package/tests/page_inventory.mjs +5 -5
  1450. package/tests/page_reader.mjs +7 -7
  1451. package/tests/page_tweak_hold.mjs +6 -6
  1452. package/tests/parallel-load.mjs +1 -1
  1453. package/tests/paste_token_api_base.mjs +1 -1
  1454. package/tests/paste_token_session_store.mjs +2 -2
  1455. package/tests/pending_invite_purge_db.mjs +1 -1
  1456. package/tests/permission_path.mjs +1 -1
  1457. package/tests/pin_replay.mjs +1 -1
  1458. package/tests/pin_write_key.mjs +7 -7
  1459. package/tests/plain_cards.mjs +15 -15
  1460. package/tests/pr_assign.mjs +1 -1
  1461. package/tests/pre_push_hook.mjs +3 -3
  1462. package/tests/preflight_checks.mjs +2 -2
  1463. package/tests/prelaunch_gate.mjs +1 -1
  1464. package/tests/privacy_matrix.mjs +1 -1
  1465. package/tests/probe_cache.mjs +6 -6
  1466. package/tests/profile_connections_ui.mjs +4 -3
  1467. package/tests/profile_fields.mjs +11 -1
  1468. package/tests/profile_privacy_owner_view.mjs +1 -1
  1469. package/tests/profile_role_headline.mjs +10 -9
  1470. package/tests/project_admin_console_model.mjs +1 -1
  1471. package/tests/projects_hub.mjs +1 -1
  1472. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1473. package/tests/promote_goal_id.mjs +6 -6
  1474. package/tests/promotion_sweep.mjs +1 -1
  1475. package/tests/provision.mjs +24 -24
  1476. package/tests/provision_account_identity.mjs +2 -2
  1477. package/tests/provision_byo_host.mjs +1 -1
  1478. package/tests/provision_caddy_wiring.mjs +2 -2
  1479. package/tests/provision_disconnect.mjs +2 -2
  1480. package/tests/provision_dns_first.mjs +1 -1
  1481. package/tests/provision_render.mjs +9 -9
  1482. package/tests/provision_repo_private.mjs +3 -3
  1483. package/tests/provision_resource_caps.mjs +5 -5
  1484. package/tests/provision_restart.mjs +3 -3
  1485. package/tests/provision_settings_apply.mjs +7 -7
  1486. package/tests/provision_teardown_address.mjs +2 -2
  1487. package/tests/provisioning_capacity.mjs +5 -5
  1488. package/tests/provisioning_credential_preflight.mjs +1 -1
  1489. package/tests/provisioning_disconnect.mjs +1 -1
  1490. package/tests/provisioning_error_note_scope.mjs +4 -4
  1491. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1492. package/tests/provisioning_planet_physics.mjs +16 -0
  1493. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1494. package/tests/provisioning_settings_env.mjs +1 -1
  1495. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1496. package/tests/public_mirror_export.mjs +1 -1
  1497. package/tests/publish_integration_gate.mjs +2 -2
  1498. package/tests/publish_manifest.mjs +6 -6
  1499. package/tests/publish_watch.mjs +1 -1
  1500. package/tests/push_path_brief.mjs +2 -2
  1501. package/tests/raise.mjs +248 -0
  1502. package/tests/rank_roles_audit.mjs +1 -1
  1503. package/tests/rank_tier_single_source.mjs +2 -2
  1504. package/tests/rate_limit_public.mjs +1 -1
  1505. package/tests/read_default_meter.mjs +2 -2
  1506. package/tests/read_session_export.mjs +1 -1
  1507. package/tests/rebase_gate_set_aside.mjs +1 -1
  1508. package/tests/recall_cli.mjs +1 -1
  1509. package/tests/recall_corpus_health.mjs +3 -2
  1510. package/tests/recall_hints.mjs +1 -1
  1511. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1512. package/tests/redteam_patrol.mjs +2 -2
  1513. package/tests/regrade_actual_minutes.mjs +2 -2
  1514. package/tests/regrade_eligibility.mjs +2 -2
  1515. package/tests/release_core.mjs +2 -2
  1516. package/tests/release_notes.mjs +4 -4
  1517. package/tests/rename_history_restraint.mjs +3 -3
  1518. package/tests/rename_ledger_prose.mjs +6 -6
  1519. package/tests/render_api.mjs +1 -1
  1520. package/tests/render_check.mjs +4 -4
  1521. package/tests/render_deploy.mjs +1 -1
  1522. package/tests/repo_info_binding.mjs +1 -1
  1523. package/tests/repo_map.mjs +5 -5
  1524. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1525. package/tests/reward_mode_surfacing.mjs +1 -1
  1526. package/tests/role_responsibilities.mjs +1 -1
  1527. package/tests/route_permission_check.mjs +1 -1
  1528. package/tests/route_shadow_guard.mjs +1 -1
  1529. package/tests/route_validation.mjs +1 -1
  1530. package/tests/routine_capture_kind.mjs +24 -13
  1531. package/tests/routine_schedule.mjs +51 -9
  1532. package/tests/run_routine.mjs +5 -5
  1533. package/tests/run_routine_two_root.mjs +5 -5
  1534. package/tests/runner_drift.mjs +17 -17
  1535. package/tests/sandbox_stage.mjs +5 -5
  1536. package/tests/scope_map_guard.mjs +7 -7
  1537. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1538. package/tests/scripts_gds_forwarders.mjs +224 -0
  1539. package/tests/scrubber_corpus.mjs +2 -2
  1540. package/tests/seam_wiring_guard.mjs +1 -1
  1541. package/tests/search_ingest.mjs +2 -2
  1542. package/tests/search_ingest_db.mjs +1 -1
  1543. package/tests/search_ingest_nul.mjs +6 -6
  1544. package/tests/seed_verify_criteria.mjs +3 -3
  1545. package/tests/sequence.mjs +3 -3
  1546. package/tests/served_paths_shipped.mjs +3 -3
  1547. package/tests/session_506_regression.mjs +1 -1
  1548. package/tests/session_accessibility.mjs +1 -1
  1549. package/tests/session_caps.mjs +1 -1
  1550. package/tests/session_cost.mjs +1 -1
  1551. package/tests/session_digest.mjs +2 -2
  1552. package/tests/session_eval.mjs +6 -6
  1553. package/tests/session_index.mjs +1 -1
  1554. package/tests/session_records.mjs +4 -4
  1555. package/tests/session_rename_fallback.mjs +2 -2
  1556. package/tests/session_reward_on_land.mjs +7 -149
  1557. package/tests/session_reward_on_land_db.mjs +191 -0
  1558. package/tests/session_reward_reconcile.mjs +6 -88
  1559. package/tests/session_reward_reconcile_db.mjs +132 -0
  1560. package/tests/session_transcript.mjs +1 -1
  1561. package/tests/sessions_kit_pager.mjs +2 -1
  1562. package/tests/setup_device_flow_fallback.mjs +2 -2
  1563. package/tests/setup_smoke.mjs +12 -5
  1564. package/tests/setup_status_facts.mjs +54 -12
  1565. package/tests/ship_autolinkify.mjs +2 -2
  1566. package/tests/ship_automerge_injection.mjs +1 -1
  1567. package/tests/ship_base_flag.mjs +1 -1
  1568. package/tests/ship_broadcast_routing.mjs +1 -1
  1569. package/tests/ship_broadcast_server.mjs +2 -2
  1570. package/tests/ship_builder_model.mjs +1 -1
  1571. package/tests/ship_cannot_lie.mjs +9 -9
  1572. package/tests/ship_card.mjs +2 -2
  1573. package/tests/ship_ci_deploy.mjs +7 -7
  1574. package/tests/ship_error_shape.mjs +1 -1
  1575. package/tests/ship_land_ci_not_started.mjs +3 -3
  1576. package/tests/ship_land_conflict.mjs +3 -3
  1577. package/tests/ship_land_proof.mjs +3 -3
  1578. package/tests/ship_land_red_pr.mjs +5 -5
  1579. package/tests/ship_merge_gate.mjs +14 -14
  1580. package/tests/ship_mode.mjs +1 -1
  1581. package/tests/ship_mode_first_ship.mjs +4 -4
  1582. package/tests/ship_mode_hands_off.mjs +8 -8
  1583. package/tests/ship_post_land_verify.mjs +1 -1
  1584. package/tests/ship_preflight.mjs +19 -19
  1585. package/tests/ship_premerge.mjs +1 -1
  1586. package/tests/ship_publish_error.mjs +2 -2
  1587. package/tests/ship_push_diagnosis.mjs +1 -1
  1588. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1589. package/tests/ship_resume.mjs +4 -4
  1590. package/tests/ship_smoke_gate.mjs +1 -1
  1591. package/tests/ship_upload_skip.mjs +1 -1
  1592. package/tests/ship_upstream_deletion.mjs +1 -1
  1593. package/tests/ship_vendored_instance.mjs +8 -8
  1594. package/tests/ship_visual_regrade.mjs +3 -3
  1595. package/tests/ship_zero_commit.mjs +1 -1
  1596. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1597. package/tests/skill_friction_kind.mjs +1 -1
  1598. package/tests/skill_grade_recover.mjs +1 -1
  1599. package/tests/skill_grader_health.mjs +1 -1
  1600. package/tests/skill_lint.mjs +1 -1
  1601. package/tests/skill_menu_ruling.mjs +1 -1
  1602. package/tests/skill_preflight.mjs +7 -7
  1603. package/tests/skip_is_not_pass.mjs +22 -1
  1604. package/tests/smoke_dependencies_witness.mjs +2 -2
  1605. package/tests/smoke_preflight.mjs +1 -1
  1606. package/tests/smoke_target.mjs +2 -2
  1607. package/tests/smoke_write_contract.mjs +2 -2
  1608. package/tests/sound_player.mjs +8 -8
  1609. package/tests/source_text_test_ratchet.mjs +97 -0
  1610. package/tests/speciality_corpus_scope.mjs +1 -1
  1611. package/tests/speciality_session_skills.mjs +1 -1
  1612. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1613. package/tests/stale_timer.mjs +3 -3
  1614. package/tests/stale_worktrees.mjs +1 -1
  1615. package/tests/start_env_guard.mjs +1 -1
  1616. package/tests/start_goal_first.mjs +3 -3
  1617. package/tests/start_inbox_count.mjs +1 -1
  1618. package/tests/start_rebase_warning.mjs +1 -1
  1619. package/tests/status_default_version.mjs +3 -3
  1620. package/tests/status_mirror_sync.mjs +1 -1
  1621. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1622. package/tests/stop_refcheck.mjs +1 -1
  1623. package/tests/strand_watch.mjs +1 -1
  1624. package/tests/stranded_rows.mjs +1 -1
  1625. package/tests/stuck_detector.mjs +14 -14
  1626. package/tests/sweep_app_account.mjs +3 -3
  1627. package/tests/task_cli.mjs +2 -2
  1628. package/tests/task_detail_ui.mjs +11 -1
  1629. package/tests/task_discipline_required.mjs +2 -2
  1630. package/tests/task_list_paging.mjs +1 -1
  1631. package/tests/task_visual_slots.mjs +2 -2
  1632. package/tests/terms_acceptance.mjs +1 -1
  1633. package/tests/terms_grandfather_db.mjs +1 -1
  1634. package/tests/test_path_guard.mjs +1 -1
  1635. package/tests/triage_development.mjs +1 -1
  1636. package/tests/tweak_batch_apply.mjs +2 -2
  1637. package/tests/tweak_land_heal.mjs +3 -3
  1638. package/tests/tweak_unattended.mjs +3 -3
  1639. package/tests/ui_design_skills.mjs +2 -2
  1640. package/tests/unit_report_status.mjs +2 -2
  1641. package/tests/unit_runner_serial.mjs +2 -2
  1642. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1643. package/tests/update_channel.mjs +2 -2
  1644. package/tests/update_channel_db.mjs +4 -4
  1645. package/tests/update_subscription_engine.mjs +26 -26
  1646. package/tests/update_sweep_home.mjs +14 -14
  1647. package/tests/upgrade.mjs +11 -11
  1648. package/tests/upgrade_artist_gate.mjs +4 -4
  1649. package/tests/upgrade_commit_identity.mjs +2 -2
  1650. package/tests/upgrade_migrate.mjs +7 -7
  1651. package/tests/upgrade_operator.mjs +2 -2
  1652. package/tests/upgrade_outcome.mjs +2 -2
  1653. package/tests/upgrade_persist_pin.mjs +5 -5
  1654. package/tests/upkeep_home.mjs +1 -1
  1655. package/tests/version_close.mjs +2 -2
  1656. package/tests/version_close_cli.mjs +2 -2
  1657. package/tests/version_close_route.mjs +1 -1
  1658. package/tests/version_literals.mjs +23 -23
  1659. package/tests/visual_review.mjs +5 -5
  1660. package/tests/wedge_remedy.mjs +5 -5
  1661. package/tests/welcome_boot.mjs +116 -0
  1662. package/tests/welcome_boot_browser.mjs +271 -0
  1663. package/tests/wizard_born_first_board.mjs +3 -3
  1664. package/tests/wizard_demo.mjs +1 -1
  1665. package/tests/wizard_one_page.mjs +4 -3
  1666. package/tests/wizard_physics.mjs +3 -1
  1667. package/tests/wizard_physics_more.mjs +42 -3
  1668. package/tests/work_title_wrap.mjs +1 -1
  1669. package/tests/workflow_exec_paths.mjs +6 -6
  1670. package/tests/worktree_claim_guard.mjs +1 -1
  1671. package/tests/worktree_helper.mjs +2 -2
  1672. package/tests/write_validation_gaps.mjs +3 -3
  1673. package/scripts/gds/api.sh +0 -6
  1674. package/scripts/gds/artifact-staleness.js +0 -267
  1675. package/scripts/gds/audit-exports.js +0 -128
  1676. package/scripts/gds/classify-discipline.js +0 -153
  1677. package/scripts/gds/codemod-rename-src-gds.js +0 -145
  1678. package/scripts/gds/coreB-carve-proof.sh +0 -725
  1679. package/scripts/gds/goal-names.js +0 -102
  1680. package/scripts/gds/rename-goals.js +0 -109
  1681. package/scripts/gds/resolve-skill-model.js +0 -57
  1682. package/scripts/gds/security-baseline-check.sh +0 -180
  1683. package/scripts/gds/seed-adopt-tasks.js +0 -75
  1684. package/scripts/gds/seed-api-contract-goal-tasks.js +0 -141
  1685. package/scripts/gds/seed-board-room-tasks.js +0 -196
  1686. package/scripts/gds/seed-bongos-app-tasks.js +0 -294
  1687. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +0 -81
  1688. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +0 -100
  1689. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +0 -307
  1690. package/scripts/gds/seed-bongos-module-system-tasks.js +0 -346
  1691. package/scripts/gds/seed-bongos-tasks.js +0 -214
  1692. package/scripts/gds/seed-bongos-v1-seo-tasks.js +0 -104
  1693. package/scripts/gds/seed-bv1-community-tasks.js +0 -131
  1694. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +0 -133
  1695. package/scripts/gds/seed-bv1-profile-page-tasks.js +0 -161
  1696. package/scripts/gds/seed-bv1-r01-delta-tasks.js +0 -154
  1697. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +0 -277
  1698. package/scripts/gds/seed-gds-v4-tasks.js +0 -624
  1699. package/scripts/gds/seed-governance-tasks.js +0 -340
  1700. package/scripts/gds/seed-medusa-tasks.js +0 -440
  1701. package/scripts/gds/seed-module-upstreaming.js +0 -219
  1702. package/scripts/gds/seed-productization-tasks.js +0 -235
  1703. package/scripts/gds/seed-project-admin-console-tasks.js +0 -88
  1704. package/scripts/gds/seed-provisioning-tasks.js +0 -83
  1705. package/scripts/gds/seed-strict-versioning-tasks.js +0 -275
  1706. package/scripts/gds/seed-v2-world-tasks.js +0 -283
  1707. package/scripts/gds/spike-task-map.js +0 -899
  1708. package/scripts/migrate_cost_ledger.sh +0 -178
  1709. package/scripts/status-probe.mjs +0 -213
  1710. package/src/bongos/uptime-poller.js +0 -93
  1711. package/tests/artifact_staleness.mjs +0 -207
  1712. package/tests/goal_names.mjs +0 -120
  1713. package/tests/government_fold_bench.mjs +0 -50
  1714. package/tests/spike_task_map.mjs +0 -422
  1715. package/tests/status-probe.mjs +0 -89
  1716. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1717. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1718. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1719. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -1,829 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ // scripts/gds/update-sweep.js — @bongos-forwarder (task 1004848). Generated by
3
+ // scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
+ // The real script is scripts/bongos/update-sweep.js. This forwarder keeps callers that still name
5
+ // the old path working, and warns once so they get repointed. Task 1003706 removes it.
2
6
  'use strict';
3
- // scripts/gds/update-sweep.js — the update-subscription sweep (task 2150, ADR 0136).
4
- //
5
- // WHERE IT LIVES (task 1004307). This was .claude/scheduled-tasks/core-update-subscription/subscribe.js,
6
- // and the core package ships no .claude/scheduled-tasks/. So a control plane ran whatever copy its
7
- // own checkout held: cloudbongos.com's sweep ran a checkout frozen at 2026-08-25, and every lane fix
8
- // after that never ran there. Under scripts/gds/ it ships in every release. A unit runs it straight
9
- // from the INSTALLED core (node <instance>/node_modules/@bongos/core/scripts/gds/update-sweep.js
10
- // --apply --instance <roster root>), and each upgrade it performs brings the next run current code.
11
- // It therefore requires its core siblings by relative path, which is right in both layouts. The one
12
- // thing it still resolves across layouts is the TARGET instance's own core (coreModulePathFrom below).
13
- // subscribe.js remains as a shim, so the routine's step and a hand run keep working.
14
- //
15
- // For each instance the operator has opted into config/update-subscriptions.json, ask the registry
16
- // what @bongos/core versions are published, resolve the newest one this instance's UPDATE CHANNEL
17
- // permits (patch-only by default; a major is never automatic), and — if that's newer than what's
18
- // installed — run `bongos upgrade --to <v> --registry` for it. Auto-rollback is ON by default (task
19
- // 2149), so a patch that fails install/migrate/health reverts itself before this returns.
20
- //
21
- // DRY-RUN by default (the box-sweep convention): it prints the plan and changes nothing. The
22
- // scheduled step passes --apply to actually upgrade. Double-gated in production: the routine is
23
- // requiresAutonomy:true + default OFF (config/scheduled-routines.json) AND the roster ships empty, so
24
- // nothing upgrades until an operator both arms autonomy and lists a target.
25
- //
26
- // This is the body of a `mode: deterministic` routine — it runs as plain node with NO model session.
27
- //
28
- // ── THE PIN (task 1003212) ───────────────────────────────────────────────────────────────────────
29
- // A successful upgrade rewrites package.json + package-lock.json. If those are left UNCOMMITTED the
30
- // lane sabotages itself two ways, and did so from the day it was armed:
31
- // 1. upgrade.js's clean-tree preflight is a bare `git status --porcelain`, so the NEXT sweep dies
32
- // "✖ working tree not clean" and exits 1 — a systemd failure nobody watches. Net effect: the
33
- // lane applies AT MOST ONE upgrade per manual pin commit.
34
- // 2. a pull-deploy `git reset --hard origin/main` REVERTS the bump and npm ci reinstalls the older
35
- // core. Live silently goes backwards, and every health check still passes.
36
- // Passing --commit-pin is necessary but NOT sufficient: this routine used to spawn the CONTROL
37
- // PLANE's vendored upgrade.js, which can be many releases behind (it was on core 1.19.2, ~305 back)
38
- // and whose parseArgs is a pure allowlist that SILENTLY IGNORES an unknown flag. Adding the flag
39
- // there would have changed nothing and still reported success — the same silent shape as the bug.
40
- // So this file now: (a) spawns the TARGET INSTANCE's own upgrade.js, which is by definition current,
41
- // (b) DETECTS --commit-pin support instead of assuming it, and (c) VERIFIES the end state and heals
42
- // it, because the only trustworthy signal is a clean tree — not an exit code.
43
- //
44
- // ── WHAT THE LANE ITSELF WROTE (task 1003968) ────────────────────────────────────────────────────
45
- // Every bump also re-materializes .claude/ and regenerates the API artifacts into the instance tree.
46
- // The guard below used to sort a dirty worktree two ways — "the pin" and "a human's work, halt" — and
47
- // the lane's own output has never been either. So on any run that does not commit it (pinMode
48
- // leave-dirty, whose whole premise is that the tree may stay dirty; or a core too old for the flags
49
- // that commit it) the sweep halted on its own exhaust, and halted there forever. pinState now sorts
50
- // THREE ways, and the third bucket is not a glob of paths that look generated: it is what the
51
- // instance's OWN core says this upgrade rewrites (laneGeneratedPaths). Anything outside that set is
52
- // still a human's, and still stops us.
53
- //
54
- // ── WHICH VERSIONS AN INSTANCE TAKES AT ALL (task 1004297, ADR 0360) ───────────────────────────────
55
- // Each roster entry has a FOLLOW beside its channel. `released` (the default) takes only versions at
56
- // or below the registry's `latest` label — what the owner has released to other projects; the
57
- // platform's own hall is set to `candidates` and takes every version as soon as it is published, so
58
- // Bongos runs each one before anyone else is offered it. An instance that follows releases and whose
59
- // released label cannot be read is SKIPPED, never upgraded on a guess.
60
- //
61
- // Usage:
62
- // node scripts/gds/update-sweep.js # dry-run (plan only)
63
- // node scripts/gds/update-sweep.js --apply # actually upgrade
64
- // …--only <slug> limit to one subscribed instance
65
- // …--instance <dir> where to read config/update-subscriptions.json (default: the working directory)
66
- //
67
- // Exit codes: 0 = clean (upgraded, or nothing to do), 1 = at least one instance's upgrade failed OR
68
- // ended with an uncommitted pin (an unhealed pin is a FAILURE — it wedges the next run).
69
-
70
- const fs = require('node:fs');
71
- const path = require('node:path');
72
- const { spawnSync } = require('node:child_process');
73
- const channel = require('./update-channel.js');
74
- const { readInstalledCoreVersion } = require('./upgrade.js');
75
-
76
- // Where a core file lives for a given instance: at its root (a monolith checkout), else inside each
77
- // installed core package. The same order and names as .claude/hooks/_core-resolve.js, which the core
78
- // package does not ship (it is topology-excluded), so this file cannot require it.
79
- // tests/update_sweep_home.mjs holds the two lists equal.
80
- const CORE_PKG_NAMES = ['@cloudbongos/core', '@bongos/core', 'cloudbongos'];
81
- function coreModulePathFrom(instanceRoot, relpath) {
82
- const bases = [instanceRoot, ...CORE_PKG_NAMES.map((n) => path.join(instanceRoot, 'node_modules', ...n.split('/')))];
83
- for (const base of bases) {
84
- try { return require.resolve(path.join(base, relpath)); } catch (_) { /* not in this base */ }
85
- }
86
- return null;
87
- }
88
-
89
- // Tiny argv helpers — kept inline so this cron companion pulls in no heavier CLI surface than it needs.
90
- const argv = process.argv.slice(2);
91
- const hasFlag = (name) => argv.includes(name);
92
- const argOf = (name) => { const i = argv.indexOf(name); return i >= 0 && i + 1 < argv.length ? argv[i + 1] : null; };
93
-
94
- // The two files a core bump rewrites. Nothing else may be auto-committed by this lane — a sweep that
95
- // commits whatever it happens to find is far more dangerous than one that stalls.
96
- const PIN_FILES = ['package.json', 'package-lock.json'];
97
-
98
- // ── pin plumbing ─────────────────────────────────────────────────────────────────────────────────
99
-
100
- function git(dir, args, run = spawnSync) {
101
- const r = run('git', ['-C', dir, ...args], { encoding: 'utf8' });
102
- const ok = !!r && !r.error && r.status === 0;
103
- return { ok, stdout: (r && r.stdout) || '', stderr: (r && r.stderr) || '', status: r ? r.status : null };
104
- }
105
-
106
- // The sweep's own materialize preview — the fallback for an instance core that predates it.
107
- function ownWillRewrite() { return require('./claude-materialize.js').materializeWillRewrite; }
108
-
109
- // The instance-relative paths THIS upgrade writes into the instance's own tree — the provenance
110
- // answer pinState's third bucket is sorted by.
111
- //
112
- // Asked of the TARGET INSTANCE's core, never the control plane's, for the reason resolveUpgradeScript
113
- // documents: the instance being upgraded is current by definition, while the control plane's vendored
114
- // copy is the plane nobody bumps (it sat ~305 releases behind, and that staleness is what silently
115
- // disabled --commit-pin for the whole lane). Two sources, each already the core's own answer to "what
116
- // does a bump rewrite here":
117
- // • upgrade.js API_ARTIFACT_FILES — the OpenAPI spec + typed client regenerated from the new core's
118
- // routes (task 1003926).
119
- // • claude-materialize.js materializeWillRewrite — a DRY RUN of the materialize step, so the set is
120
- // derived from the core actually installed here rather than guessed from a glob (task 1004122).
121
- // It is the same function upgrade.js's own clean-tree pre-flight waives dirt by, so the lane and
122
- // the bump it spawns agree on what "this upgrade rewrote" means.
123
- //
124
- // A CORE TOO OLD TO ANSWER (task 1004519). materializeWillRewrite shipped in 1.19.933, and the
125
- // wedge it exists for is exactly the one that strands an instance on an OLDER core: hoodify-finance
126
- // took one bump to 1.19.871, which materialized 33 skills and committed nothing, and its core then
127
- // could not say those files were its own — so the set came back empty and every sweep halted on
128
- // them, forever. When the instance's core ships claude-materialize.js but not the preview, the
129
- // preview is asked of the sweep's OWN copy instead, run over the instance's INSTALLED core. That is
130
- // still provenance, not a glob: the file set is walked off that core's .claude/, the very files its
131
- // own upgrade materializes. And the sweep's copy is no longer the stale one the paragraph above
132
- // warns about — it runs from the platform's installed core (task 1004307), always the newest here.
133
- //
134
- // FAIL-SOFT, and the direction is deliberate. An instance whose core ships no materialize at all,
135
- // whose installed core has no .claude/skills to walk, or whose materialize throws, yields nothing
136
- // here: every dirty path stays in `other` and the guard is exactly as strict as it was before this
137
- // function existed. The failure mode is "still wedged", never "committed a stranger's work".
138
- function laneGeneratedPaths(instDir, { resolveFrom = coreModulePathFrom, load = require, own = ownWillRewrite } = {}) {
139
- const out = new Set();
140
- try {
141
- const p = resolveFrom(instDir, 'scripts/gds/upgrade.js');
142
- if (p) for (const files of Object.values(load(p).API_ARTIFACT_FILES || {})) for (const f of files) out.add(f);
143
- } catch (_) { /* an older core, or one that will not load here — stay strict */ }
144
- try {
145
- const p = resolveFrom(instDir, 'scripts/gds/claude-materialize.js');
146
- if (p) {
147
- // coreRoot is derived from where the module RESOLVED (<core>/scripts/gds/x.js → <core>), not
148
- // from a package-name guess: an instance may carry the core under any of its published names,
149
- // and in the monolith layout the core root IS the instance root (where materialize no-ops).
150
- const coreRoot = path.resolve(path.dirname(p), '..', '..');
151
- const theirs = load(p).materializeWillRewrite;
152
- // Only fall back where there is a real .claude/ to walk — an empty source still "writes" the
153
- // provenance manifest, and that is a guess, not an answer.
154
- const willRewrite = theirs || (fs.existsSync(path.join(coreRoot, '.claude', 'skills')) ? own() : null);
155
- if (willRewrite) for (const f of willRewrite({ instanceDir: instDir, coreRoot }, () => {}) || []) out.add(f);
156
- }
157
- } catch (_) { /* same — a set we could not derive is an empty one, never a guessed one */ }
158
- return [...out];
159
- }
160
-
161
- // Split a dirty worktree into "the pin", "what this upgrade generated", and "everything else". The
162
- // distinction is the whole safety story, and it is THREE-way for a reason (task 1003968).
163
- //
164
- // Two buckets could not express what a bump actually leaves behind. Every upgrade re-materializes
165
- // .claude/ and regenerates the API artifacts, so on any run that does not commit them the lane's OWN
166
- // output landed in `other` — and `other` means "a human's work, halt". That wedged pinMode
167
- // leave-dirty against its own definition (a mode whose point is that the tree may stay dirty, stopped
168
- // by dirt), and wedged any instance on a core too old for the flags that commit it.
169
- //
170
- // `generated` is not an allow-list of paths that LOOK generated; it is what the instance's own core
171
- // says this upgrade rewrites. A path outside that set — an owner's edit, a hand-written skill, a
172
- // half-finished migration — is still `other` and still stops us, which is the property task 1003957
173
- // pinned and this must not spend.
174
- function pinState(dir, run = spawnSync, generated = []) {
175
- // -uall, not the default -unormal. A wholly-untracked DIRECTORY is collapsed to one entry —
176
- // '?? .claude/skills/new-in-785/' — so a skill the new core adds would never match a path in
177
- // `generated`, would land in `other`, and would wedge the lane in exactly the way this sorting
178
- // exists to prevent. Listing untracked files individually is what makes the buckets comparable.
179
- const r = git(dir, ['status', '--porcelain', '-uall'], run);
180
- if (!r.ok) return { repo: false };
181
- const ours = new Set(generated);
182
- const entries = r.stdout.split('\n').map((l) => l.trim()).filter(Boolean)
183
- .map((l) => ({ raw: l, file: l.slice(2).trim() }));
184
- const pin = entries.filter((e) => PIN_FILES.includes(e.file));
185
- const rest = entries.filter((e) => !PIN_FILES.includes(e.file));
186
- return {
187
- repo: true,
188
- clean: entries.length === 0,
189
- pin,
190
- generated: rest.filter((e) => ours.has(e.file)),
191
- other: rest.filter((e) => !ours.has(e.file)),
192
- };
193
- }
194
-
195
- // Commit + push ONLY the pin files. Returns a verdict rather than throwing: a sweep must survive one
196
- // instance's git trouble and keep going, but it must never call the result clean.
197
- //
198
- // `push: false` commits and STOPS — go-live's `local-commit` pin mode (task 1003521). On a
199
- // provisioned co-tenant the remote is the CUSTOMER's own repo: pushing there is wrong, and in
200
- // practice uncredentialed. Nothing reverts the pin either, because a co-tenant has no
201
- // pull-deploy timer, so a local commit is durable on its own.
202
- //
203
- // `generated` (task 1003968) is the paths THIS upgrade wrote — laneGeneratedPaths' answer. They are
204
- // committed alongside the pin and are NOT grounds to refuse: the upgrade overwrites them
205
- // unconditionally on every bump, so refusing on them protects nothing and stops every future sweep.
206
- // The refusal itself stays exactly where it was, keyed on everything else.
207
- function commitPin({ dir, message, remote = 'origin', push = true, generated = [] }, run = spawnSync, log = console.log, err = console.error) {
208
- const st = pinState(dir, run, generated);
209
- if (!st.repo) return { ok: true, action: 'not-a-repo' };
210
- if (st.other.length) {
211
- return {
212
- ok: false, action: 'refused',
213
- reason: `worktree carries changes that are neither the pin nor this upgrade's own output (${st.other.slice(0, 5).map((e) => e.file).join(', ')}) — refusing to auto-commit a human's work`,
214
- };
215
- }
216
- if (!st.pin.length && !st.generated.length) return { ok: true, action: 'already-clean' };
217
-
218
- // Stage the pin plus whatever of the upgrade's OWN output is dirty — never "everything dirty".
219
- // The refusal above is the guard that keeps an owner's edit out of an unattended commit, and it
220
- // stays keyed on a set the instance's core produced rather than on one this file invented.
221
- const add = git(dir, ['add', '--', ...PIN_FILES, ...st.generated.map((e) => e.file)], run);
222
- if (!add.ok) return { ok: false, action: 'add-failed', reason: add.stderr.trim().split('\n').pop() };
223
-
224
- const commit = git(dir, ['commit', '-m', message], run);
225
- if (!commit.ok) return { ok: false, action: 'commit-failed', reason: commit.stderr.trim().split('\n').pop() };
226
-
227
- const branch = git(dir, ['rev-parse', '--abbrev-ref', 'HEAD'], run);
228
- const target = branch.ok ? branch.stdout.trim() : 'main';
229
-
230
- if (!push) {
231
- log(' ✓ pin committed locally, not pushed (pinMode local-commit — the remote is not ours)');
232
- return { ok: true, action: 'committed-local', committed: true, branch: target };
233
- }
234
-
235
- const pushed = git(dir, ['push', remote, `HEAD:${target}`], run);
236
- if (!pushed.ok) {
237
- // Committed but not pushed is STILL doomed — deploy.sh resets to the REMOTE.
238
- return { ok: false, action: 'push-failed', reason: pushed.stderr.trim().split('\n').pop(), committed: true };
239
- }
240
- log(` ✓ pin committed + pushed to ${remote}/${target} — a pull-deploy reset can no longer revert it`);
241
- return { ok: true, action: 'committed', committed: true, branch: target };
242
- }
243
-
244
- // ── the deploy engine: go-live.js when the instance can support it ───────────────────────────────
245
-
246
- // Fields go-live.js REQUIRES to build a valid target. `ssh` is deliberately absent: the
247
- // routine runs ON the box, so the target is LOCAL and go-live drives a local shell.
248
- // `runAs` is absent too — this routine already runs as the instance owner, so no sudo
249
- // hop is needed and no secret has to be handed across a privilege boundary.
250
- // This list MIRRORS go-live.js's own REQUIRED_FIELDS — a second copy of someone else's
251
- // contract, so it drifts silently when that contract moves. It did: co-tenant mode
252
- // (task 1003521) made `deployTimer` optional there, and this copy kept requiring it, so
253
- // every provisioned co-tenant was told its roster entry "lacks deployTimer" and dropped to
254
- // the weaker direct-upgrade path forever.
255
- const GO_LIVE_REQUIRED = ['instanceDir', 'service', 'healthUrl', 'versionUrl'];
256
-
257
- // Read the roster entry STRAIGHT FROM DISK for the deploy-topology fields.
258
- //
259
- // loadSubscriptions() normalizes entries, and it comes from the CONTROL PLANE's core —
260
- // which is a separate plane nobody bumps (it sat on 1.19.2, ~305 releases behind). A
261
- // normalizer that predates a field silently drops it, so an instance can name
262
- // versionUrl + deployTimer and still be told "roster entry lacks versionUrl +
263
- // deployTimer" forever. That is the same stale-vendored-core trap that disabled
264
- // --commit-pin (task 1003212), wearing a different hat: do not let the oldest thing on
265
- // the box decide which features the newest thing may use.
266
- //
267
- // So the topology is read directly. Everything ELSE still comes from the normalizer —
268
- // this is a targeted supplement, not a second parser.
269
- function rawTopologyFor(instanceRoot, slug, { readFile = fs.readFileSync } = {}) {
270
- try {
271
- const raw = JSON.parse(readFile(path.join(instanceRoot, 'config', 'update-subscriptions.json'), 'utf8'));
272
- const row = (raw.instances || []).find((r) => r && (r.slug === slug || r.dir === slug));
273
- if (!row) return {};
274
- const out = {};
275
- for (const k of ['versionUrl', 'deployTimer', 'deployService', 'backupDb', 'backupDir', 'registryPackage', 'pinMode']) {
276
- if (typeof row[k] === 'string' && row[k]) out[k] = row[k];
277
- }
278
- return out;
279
- } catch (_) { return {}; }
280
- }
281
-
282
- // Map a roster entry onto a go-live target. Returns what is MISSING rather than a
283
- // half-built target: an invalid target would be rejected by go-live anyway, and the
284
- // point of checking here is to fall back cleanly instead of failing the sweep.
285
- function goLiveTargetFor(inst, extra = {}) {
286
- const e = { ...inst, ...extra };
287
- const t = {
288
- instanceDir: inst.dir,
289
- service: inst.service,
290
- healthUrl: inst.healthUrl,
291
- versionUrl: e.versionUrl,
292
- };
293
- // deployTimer belongs HERE, not above. The normalizer yields `null` for an absent field,
294
- // and an explicit `"deployTimer": null` survives JSON.stringify into --target-json, where
295
- // go-live's validateTarget runs isSafeToken(null) on it and rejects the whole target. The
296
- // optional loop drops falsy values, so a co-tenant simply omits the key — which is what
297
- // "no pull-deploy timer to stop" actually means.
298
- for (const [k, v] of Object.entries({
299
- deployTimer: e.deployTimer,
300
- deployService: e.deployService,
301
- backupDb: e.backupDb,
302
- backupDir: e.backupDir,
303
- registryPackage: e.registryPackage,
304
- pinMode: e.pinMode,
305
- env: e.env,
306
- })) if (v) t[k] = v;
307
-
308
- const missing = GO_LIVE_REQUIRED.filter((k) => !t[k]);
309
- return missing.length ? { ok: false, missing } : { ok: true, target: t };
310
- }
311
-
312
- // Does this target need CO-TENANT support from go-live.js? Two shapes do, and both are
313
- // rejected outright by a go-live.js predating task 1003521: a target with no `deployTimer`
314
- // fails its REQUIRED_FIELDS check, and one naming `pinMode` fails its unknown-field check.
315
- // Either way the run dies on a validation error instead of falling back — the failure mode
316
- // resolveGoLive exists to prevent.
317
- function needsCoTenantMode(target) {
318
- return !!target && (!target.deployTimer || !!target.pinMode);
319
- }
320
-
321
- // go-live's PIN_MODES, mirrored for the same reason GO_LIVE_REQUIRED is — the lane acts on the pin
322
- // both BEFORE go-live is called and AFTER it returns, so an absent or unknown mode has to mean the
323
- // same thing on both sides of that boundary.
324
- const PIN_MODES = ['push', 'local-commit', 'leave-dirty'];
325
- const DEFAULT_PIN_MODE = 'push';
326
-
327
- // The pin policy is read from the ROSTER ENTRY, which is the operator's DECLARED INTENT — it does
328
- // not change with which engine happens to run. Deriving it from the go-live target instead would
329
- // silently revert a co-tenant to `push` on exactly the runs that fall back to a direct upgrade,
330
- // which is the customer's own repo and the one place a push must never land.
331
- function pinModeOf(source) {
332
- const mode = (source && source.pinMode) || DEFAULT_PIN_MODE;
333
- return { mode, valid: PIN_MODES.includes(mode) };
334
- }
335
-
336
- // What to do about a dirty pin found BEFORE the upgrade runs.
337
- //
338
- // Extracted because this is the THIRD place the lane writes the instance's pin, and all three were
339
- // wrong in the same way: each decided whether to push without asking what mode it was in. A named
340
- // decision can be tested; an `if` inline in a 250-line loop cannot, which is why this one shipped
341
- // broken past a green suite.
342
- //
343
- // halt — dirty with changes that are neither the pin nor this upgrade's own output: a
344
- // human's work, never guess
345
- // by-design — `leave-dirty`, where an uncommitted pin IS the steady state, not a leftover
346
- // commit — an actual leftover; `push` says whether it may leave this machine
347
- //
348
- // The order — dirt BEFORE mode — is deliberate and stays that way (task 1003968). A human's edit must
349
- // halt even under `leave-dirty`, which licenses the LANE's dirt, not a stranger's. What made
350
- // `by-design` unreachable was never this order: it was `other` swallowing the lane's own output, so
351
- // every mode saw a human's work after every upgrade. pinState's third bucket is the fix, and with it
352
- // this reads the way it always claimed to.
353
- function healDecision(pre, pinMode) {
354
- if (!pre || !pre.repo || pre.clean) return { action: 'nothing' };
355
- if (pre.other && pre.other.length) return { action: 'halt' };
356
- if (pinMode === 'leave-dirty') return { action: 'by-design' };
357
- return { action: 'commit', push: pinMode !== 'local-commit' };
358
- }
359
-
360
- // Resolve go-live.js the same way upgrade.js is resolved — the INSTANCE's own core
361
- // first, because that one is current by definition. go-live.js only exists from core
362
- // 1.19.310, so its ABSENCE is normal on an older instance and must fall back rather
363
- // than break the lane (the fail-closed detection rule from task 1003212).
364
- function resolveGoLive(instDir, { resolveFrom = coreModulePathFrom, readFile = fs.readFileSync, needsCoTenant = false } = {}) {
365
- let p = null;
366
- try { p = resolveFrom(instDir, 'scripts/gds/go-live.js'); } catch (_) { return null; }
367
- if (!p) return null;
368
- // EXISTING IS NOT ENOUGH. go-live.js arrived in 1.19.310 but could only drive a
369
- // REMOTE box over ssh; the local mode this routine needs (--target-json + a target
370
- // with no ssh host) came later. Calling the older one from here would fail on an
371
- // unrecognised flag — so check for the capability, not the file. Same fail-closed
372
- // rule as supportsCommitPin, for the same reason.
373
- //
374
- // Co-tenant mode is a SECOND capability on the same file, arriving later still (task
375
- // 1003521), and it is probed ONLY when the target actually needs it — so an instance on a
376
- // mid-generation core keeps the go-live path it already has for ordinary targets.
377
- let src;
378
- try { src = readFile(p, 'utf8'); } catch (_) { return null; }
379
- if (!src.includes('--target-json')) return null;
380
- if (needsCoTenant && !src.includes('pinMode')) return null;
381
- return p;
382
- }
383
-
384
- // Pick the deploy engine for ONE instance, and say why when it is not go-live.
385
- //
386
- // Both callers — the dry run and the apply path — must agree, or the preview promises an
387
- // engine the real sweep will not use. They each re-derived it; the co-tenant probe gave them
388
- // a third thing to keep in step, so the decision lives here once. `raw` is returned because
389
- // the fallback branch reads the roster's versionUrl straight from it.
390
- function goLiveEngineFor(inst, instanceRoot, opts = {}) {
391
- const raw = rawTopologyFor(instanceRoot, inst.slug);
392
- const mapped = goLiveTargetFor(inst, raw);
393
- if (!mapped.ok) return { script: null, raw, mapped, coTenant: false, why: `roster entry lacks ${mapped.missing.join(' + ')}` };
394
- const coTenant = needsCoTenantMode(mapped.target);
395
- const script = resolveGoLive(inst.dir, { ...opts, needsCoTenant: coTenant });
396
- if (script) return { script, raw, mapped, coTenant, why: null };
397
- return {
398
- script: null, raw, mapped, coTenant,
399
- why: coTenant
400
- ? "this instance's core has no go-live.js with co-tenant support yet"
401
- : "this instance's core has no go-live.js with local-target support yet",
402
- };
403
- }
404
-
405
- // ── which upgrade.js to run ──────────────────────────────────────────────────────────────────────
406
-
407
- // Prefer the TARGET INSTANCE's own core over this control plane's vendored copy.
408
- //
409
- // The instance being upgraded always carries a current core (that is what "upgrade" means), whereas
410
- // the control plane's own pin is a separate plane that nobody bumps — it sat 305 releases behind and
411
- // that staleness silently disabled --commit-pin for the whole lane. Running the instance's own script
412
- // is also exactly what the manual runbook and scripts/gds/go-live.js do, so all three paths agree.
413
- function resolveUpgradeScript(instDir, { resolveFrom = coreModulePathFrom, fallback = null } = {}) {
414
- let own = null;
415
- try { own = resolveFrom(instDir, 'scripts/gds/upgrade.js'); } catch (_) { own = null; }
416
- if (own) return { script: own, source: 'instance' };
417
- if (fallback) return { script: fallback, source: 'control-plane' };
418
- return { script: null, source: 'none' };
419
- }
420
-
421
- // Detect the flag rather than assuming it. An unsupported flag is SILENTLY IGNORED here (parseArgs is
422
- // an allowlist reader), and "silently ignored" is precisely the failure being fixed — so assuming
423
- // support would reintroduce the bug on any instance whose core predates the flag.
424
- function supportsCommitPin(scriptPath, readFile = fs.readFileSync) {
425
- if (!scriptPath) return false;
426
- try { return readFile(scriptPath, 'utf8').includes('--commit-pin'); }
427
- catch (_) { return false; }
428
- }
429
-
430
- // The SECOND capability on the same file, probed separately and for a sharper reason than
431
- // supportsCommitPin's. On a co-tenant `--commit-pin` alone means commit AND PUSH, and the push
432
- // lands in the CUSTOMER's own repo — so a core old enough to have `--commit-pin` but not
433
- // `--pin-no-push` must not be handed the pair. An unsupported flag is silently ignored by
434
- // parseArgs, which would turn "commit locally" into exactly the push this mode forbids.
435
- function supportsPinNoPush(scriptPath, readFile = fs.readFileSync) {
436
- if (!scriptPath) return false;
437
- try { return readFile(scriptPath, 'utf8').includes('--pin-no-push'); }
438
- catch (_) { return false; }
439
- }
440
-
441
- // Which pin flags the direct-upgrade fallback hands `bongos upgrade` — the THIRD place the lane
442
- // decides its pin policy, named for the same reason healDecision is: an `if` inline in a 250-line
443
- // loop cannot be tested, and this one shipped broken past a green suite.
444
- //
445
- // THE BUG IT WAS (task 1004122). The branch withheld --commit-pin on every mode but `push`, on the
446
- // reasoning that --commit-pin also PUSHES and a co-tenant's remote is the customer's own repo. But
447
- // `--pin-no-push` is exactly the "commit, do not push" it wanted, go-live's upgradeCommand() had
448
- // been sending that pair for `local-commit` all along, and the comment here already CLAIMED parity
449
- // with go-live. Withholding the flag left the `.claude/` that upgrade.js materializes on every bump
450
- // uncommitted, and the lane's own net can stage nothing but PIN_FILES — so its post-upgrade
451
- // commitPin() refused the tree as "a human's work" and every later sweep halted on the same files.
452
- //
453
- // Mirrors go-live.js upgradeCommand() mode for mode; tests/update_subscription_engine.mjs pins the
454
- // two against each other. `--pin-no-push` is PROBED, never assumed: parseArgs silently ignores an
455
- // unknown flag, so handing the pair to a core that predates it would turn "commit locally" into the
456
- // one push this mode exists to forbid.
457
- function pinFlagsFor({ pinMode, canCommitPin, canPinNoPush }) {
458
- const noPush = pinMode !== 'push';
459
- // Both non-default modes turn on --pin-no-push, and a core that would silently ignore it must
460
- // be handed NOTHING — the pair degrades to a bare --commit-pin, which is the push into the
461
- // customer's repo this whole function exists to prevent.
462
- if (noPush && !canPinNoPush) return [];
463
- return [
464
- // leave-dirty commits nothing; --pin-no-push alone is what downgrades upgrade.js's
465
- // "PIN NOT COMMITTED" alarm to a note, which is go-live's reason for sending it there.
466
- ...(canCommitPin && pinMode !== 'leave-dirty' ? ['--commit-pin'] : []),
467
- ...(noPush ? ['--pin-no-push'] : []),
468
- ];
469
- }
470
-
471
- // The direct-upgrade fallback's CLEAN-TREE policy, which is a pin-mode decision like the flags above.
472
- //
473
- // Under `leave-dirty` the pin is left in the working tree BY DESIGN, so the second bump meets
474
- // upgrade.js's clean-tree pre-flight reading the first bump's own package.json as uncommitted work,
475
- // and refuses — the one-upgrade wedge again, from the other end of the lane. (The materialize waiver
476
- // that pre-flight gained in task 1004122 does not cover the pin files, and cannot: on every other
477
- // mode a dirty pin really is the thing that must stop a bump.) go-live.js's upgradeCommand() passes
478
- // --force on every mode for exactly this reason; the direct path needs it only where a dirty tree is
479
- // the operator's declared steady state, so that is the only place it goes.
480
- //
481
- // --force waives the clean-tree check and NOTHING else — module compatibility, the DB-identity
482
- // pre-check, the mandatory health check and auto-rollback all still run. The human-work guard is
483
- // upstream of this anyway: healDecision halts the instance before an upgrade is ever spawned when the
484
- // dirt is not the lane's.
485
- //
486
- // NOT probed, unlike --commit-pin and --pin-no-push, and the asymmetry is the point. parseArgs
487
- // silently ignores an unknown flag, so what matters is which way that silence fails: ignoring
488
- // --pin-no-push turns "commit locally" into a push into the customer's repo (a wrong ACTION, so it
489
- // must be probed), while ignoring --force leaves the bump refusing a dirty tree (a REFUSAL — loud,
490
- // and no worse than the status quo). Fail-closed means checking the flags whose absence would do
491
- // something, not every flag.
492
- function preflightFlagsFor(pinMode) {
493
- return pinMode === 'leave-dirty' ? ['--force'] : [];
494
- }
495
-
496
- // ── the sweep ────────────────────────────────────────────────────────────────────────────────────
497
-
498
- // ── A VERSION THAT FAILED HERE IS NOT RETRIED EVERY SWEEP (task 1004297, ADR 0360 D4) ─────────────
499
- // At a daily cadence a version that failed its health check was retried once a day. At the 15-minute
500
- // cadence the platform now runs, the same version would be installed, fail, restart the service and
501
- // roll back every quarter of an hour until something newer was published — an outage generator. So a
502
- // version whose upgrade failed here is HELD for a day for that instance: the sweep skips it and says
503
- // so, and any NEWER version is taken at once (it is the fix). The hold expires so a transient failure
504
- // (a registry blip, a full disk since cleared) is retried rather than refused forever.
505
- //
506
- // The record lives in the sweep's own config home, never in an instance's tree: a file written there
507
- // would be "a human's work" to pinState and wedge the lane it exists to protect.
508
- const REFUSAL_HOLD_MS = 24 * 60 * 60 * 1000;
509
- const REFUSALS_FILE = 'core-update-refused.json';
510
-
511
- function refusalsPath() {
512
- try { return path.join(require('../../src/instance-config.js').configHome(), REFUSALS_FILE); } catch { return null; }
513
- }
514
-
515
- function readRefusals(file, readFile = fs.readFileSync) {
516
- if (!file) return {};
517
- try {
518
- const j = JSON.parse(readFile(file, 'utf8'));
519
- return j && typeof j === 'object' && !Array.isArray(j) ? j : {};
520
- } catch { return {}; }
521
- }
522
-
523
- // The versions held for `slug` at `now`: a Map version → { at, reason }, only those still inside
524
- // the hold. PURE.
525
- function heldVersions(refusals, slug, now) {
526
- const out = new Map();
527
- const rows = refusals && Array.isArray(refusals[slug]) ? refusals[slug] : [];
528
- for (const r of rows) {
529
- const at = r && Date.parse(r.at);
530
- if (r && typeof r.version === 'string' && Number.isFinite(at) && now - at < REFUSAL_HOLD_MS) out.set(r.version, { at: r.at, reason: r.reason || null });
531
- }
532
- return out;
533
- }
534
-
535
- // Record that `version` failed on `slug`. Keeps only rows still inside the hold, so the file cannot
536
- // grow without bound. Best-effort: a record that cannot be written costs one retry, never the sweep.
537
- function recordRefusal({ file, slug, version, reason, now = Date.now(), readFile = fs.readFileSync, writeFile = fs.writeFileSync, mkdir = fs.mkdirSync } = {}) {
538
- if (!file || !slug || !version) return false;
539
- try {
540
- const all = readRefusals(file, readFile);
541
- const keep = [...heldVersions(all, slug, now)].filter(([v]) => v !== version).map(([v, x]) => ({ version: v, at: x.at, reason: x.reason }));
542
- all[slug] = [...keep, { version, at: new Date(now).toISOString(), reason: reason || null }];
543
- mkdir(path.dirname(file), { recursive: true });
544
- writeFile(file, JSON.stringify(all, null, 2) + '\n');
545
- return true;
546
- } catch { return false; }
547
- }
548
-
549
- // What this instance should move to, and under which follow (task 1004297, ADR 0360). The channel
550
- // bounds how far a jump may go; the follow bounds which published versions exist to jump to at all.
551
- //
552
- // `inst.follow` is absent only when the core this sweep resolved predates the axis. That core also
553
- // predates any split between candidates and releases, so every published version IS a release and
554
- // the old reading — all of them — is the right one. With the axis present, `released` asks the
555
- // registry which version carries the `latest` label and SKIPS the instance when it cannot say: an
556
- // instance that follows releases is never upgraded on a guess.
557
- //
558
- // Returns { follow, target } (target null = up to date) or { follow, skip: '<why>' }.
559
- function followTarget({ inst, installed, channel, versions, env, held = new Map() }) {
560
- const follow = inst.follow || 'candidates';
561
- let admitted = versions;
562
- if (follow === 'released' && typeof channel.readReleaseTags === 'function') {
563
- const tags = channel.readReleaseTags({ cwd: inst.dir, env });
564
- if (!tags.ok) return { follow, skip: `could not read which version is released (${tags.error})` };
565
- admitted = channel.versionsForFollow({ follow, available: admitted, released: tags.released });
566
- }
567
- const pick = (list) => channel.resolveChannelTarget({ installed, channel: inst.channel, available: list }) || null;
568
- const target = pick(admitted.filter((v) => !held.has(v)));
569
- // A hold is named only when it is what changed the answer: the version this instance would have
570
- // taken without it.
571
- const unheld = pick(admitted);
572
- return { follow, target, held: unheld && unheld !== target && held.has(unheld) ? { version: unheld, ...held.get(unheld) } : null };
573
- }
574
-
575
- // `instanceRoot` is the default roster root when no --instance is given: the subscribe.js shim passes
576
- // its own instance root; run directly, it is the working directory.
577
- function main({ instanceRoot: defaultRoot = process.cwd() } = {}) {
578
- const apply = hasFlag('--apply');
579
- const only = argOf('--only');
580
- const instanceRoot = path.resolve(argOf('--instance') || defaultRoot);
581
- const sweepingCoreUpgradeScript = path.join(__dirname, 'upgrade.js'); // fallback only: the upgrade.js of the core running this sweep
582
- // Says which core is doing the sweeping, every run, so "is the box running current code?" is
583
- // one journal line instead of an archaeology session (the gap task 1004307 was filed for).
584
- let selfVersion = 'unknown';
585
- try { selfVersion = require(path.join(__dirname, '..', '..', 'src', 'module-api.js')).CORE_VERSION || selfVersion; } catch (_) { /* a core without the doorway */ }
586
- console.log(`update-sweep · running from ${path.resolve(__dirname, '..', '..')} (core ${selfVersion}) · roster ${instanceRoot}`);
587
-
588
- const loaded = channel.loadSubscriptions({ instanceDir: instanceRoot });
589
- const { source, present, error } = loaded;
590
- if (error) console.error(` ! ${path.relative(instanceRoot, source) || source}: ${error} — treating roster as empty.`);
591
-
592
- // The rule set on /deploy wins over the roster's `channel` (task 1004468, ADR 0357). Read from the
593
- // CONTROL PLANE's database — this process's own env, never an entry's `env`, which points at that
594
- // instance's database. A core too old to carry the reader keeps the roster, as before.
595
- const db = typeof channel.readDbChannels === 'function' ? channel.readDbChannels({ env: process.env }) : null;
596
- const instances = db ? channel.applyDbChannels(loaded.instances, db) : loaded.instances;
597
- if (db && !db.ok && instances.length) console.log(` • update rules: read from the roster — ${db.reason}`);
598
-
599
- const roster = only ? instances.filter((i) => i.slug === only || i.dir === only) : instances;
600
- const mode = apply ? 'apply' : 'dry-run';
601
- console.log(`core-update-subscription (${mode}) — ${roster.length} subscribed instance(s)${present ? '' : ' [no roster file — nothing subscribed]'}`);
602
- for (const inst of roster) if (inst.channelNote) console.log(channel.channelLine(inst));
603
- if (only && roster.length === 0) console.error(` ! --only ${only} matched no subscribed instance`);
604
-
605
- let upgraded = 0, skipped = 0, failed = 0, upToDate = 0, healed = 0;
606
- const refusalsFile = refusalsPath();
607
- const refusals = readRefusals(refusalsFile);
608
-
609
- for (const inst of roster) {
610
- const label = inst.slug;
611
- if (inst.channel === 'pinned') { console.log(` • ${label}: pinned — skipped`); skipped++; continue; }
612
-
613
- const installed = readInstalledCoreVersion(inst.dir);
614
- if (!installed) { console.log(` • ${label}: installed core version unknown (no node_modules/@bongos/core at ${inst.dir}) — skipped`); skipped++; continue; }
615
-
616
- // Resolve the engine and the pin policy BEFORE anything touches the pin. Both are cheap and
617
- // pure (a disk read of the roster plus a source probe), and the HEAL step below is itself a
618
- // write to the instance's repo — so it has to know the policy it is writing under.
619
- const engine = goLiveEngineFor(inst, instanceRoot);
620
- const rawTopo = engine.raw;
621
- const pin = pinModeOf(rawTopo);
622
- if (!pin.valid) {
623
- console.error(` ! ${label}: roster entry names an unknown pinMode ${JSON.stringify(pin.mode)} (expected ${PIN_MODES.join(' | ')}) — skipped`);
624
- console.error(' Refusing rather than defaulting: every unknown value would fall through to the PUSH branch, and on a co-tenant that push lands in the customer\'s own repo.');
625
- skipped++; continue;
626
- }
627
- const pinMode = pin.mode;
628
-
629
- // HEAL FIRST. A pin left uncommitted by an earlier sweep would make upgrade.js's clean-tree
630
- // preflight abort this instance forever. Committing it here is what turns a permanent wedge into
631
- // a self-correcting lane. Anything OTHER than the pin dirty is a human's work — halt, don't guess.
632
- //
633
- // EXCEPT under `leave-dirty`, where a dirty pin is not a leftover at all: it is the STEADY STATE
634
- // this mode asks for. Healing it would commit and push the customer's own repo on the sweep after
635
- // every successful upgrade — reliably, not just after a crash. go-live's dirty-checkout halt reads
636
- // the CORE checkout, not the instance, so leaving it dirty wedges nothing.
637
- //
638
- // What THIS upgrade rewrites in this instance's tree, resolved once and threaded through every
639
- // pin decision below — the guard, the heal and the post-upgrade net must not disagree about which
640
- // paths the lane produced, which is exactly how they disagreed before (task 1003968).
641
- const generated = laneGeneratedPaths(inst.dir);
642
- const pre = pinState(inst.dir, spawnSync, generated);
643
- const heal = healDecision(pre, pinMode);
644
- if (heal.action === 'halt') {
645
- console.error(` ! ${label}: worktree not clean, and the changes are neither the pin nor this upgrade's own output (${pre.other.slice(0, 3).map((e) => e.file).join(', ')}) — skipped, a human needs to look`);
646
- skipped++; continue;
647
- }
648
- if (heal.action === 'by-design') {
649
- console.log(` • ${label}: pin is uncommitted by design (pinMode leave-dirty) — nothing to heal`);
650
- } else if (heal.action === 'commit') {
651
- if (!apply) {
652
- const leftover = [...pre.pin, ...pre.generated].map((e) => e.file);
653
- console.log(` → ${label}: would first commit a leftover uncommitted pin (${leftover.slice(0, 4).join(', ')}${leftover.length > 4 ? `, +${leftover.length - 4} more` : ''})`);
654
- } else {
655
- const r = commitPin({
656
- dir: inst.dir,
657
- message: `pin @bongos/core ${installed} (committed by the update lane — leftover from an earlier sweep)`,
658
- push: heal.push,
659
- generated,
660
- });
661
- if (!r.ok) {
662
- console.error(` ✖ ${label}: could not commit the leftover pin (${r.action}: ${r.reason}) — skipped; the next sweep will stall here too`);
663
- failed++; continue;
664
- }
665
- if (r.committed) { healed++; console.log(` ↺ ${label}: healed a leftover uncommitted pin from an earlier sweep`); }
666
- }
667
- }
668
-
669
- // Ask the registry. NO CREDENTIAL IS INVOLVED: @bongos/core is public (ADR 0283), and
670
- // fcea51ca deleted the env-fed .npmrc this line used to describe. Do not reintroduce one —
671
- // the private era is exactly how this sweep died silently on 2026-08-25, reporting failed=0
672
- // for three weeks because the unit passed no NPM_TOKEN, the .npmrc expanded to empty, and a
673
- // skip is not a failure in the accounting below. Still run from the instance dir, which now
674
- // only decides which registry config applies. Fail-soft: a registry error skips this
675
- // instance, not the sweep.
676
- const listed = channel.listAvailableVersions({ cwd: inst.dir, env: { ...process.env, ...inst.env } });
677
- if (!listed.ok) { console.error(` ! ${label}: could not list registry versions (${listed.error}) — skipped`); skipped++; continue; }
678
-
679
- const aim = followTarget({ inst, installed, channel, versions: listed.versions, env: { ...process.env, ...inst.env }, held: heldVersions(refusals, label, Date.now()) });
680
- if (aim.skip) { console.error(` ! ${label}: ${aim.skip} — skipped`); skipped++; continue; }
681
- if (aim.held) console.log(` • ${label}: ${aim.held.version} failed here at ${aim.held.at} — held for a day, or until a newer version is published`);
682
- const target = aim.target;
683
- const pace = `channel: ${inst.channel}, follows: ${aim.follow}`;
684
- if (!target) { console.log(` ✓ ${label}: up to date on ${installed} (${pace})`); upToDate++; continue; }
685
-
686
- const { script: upgradeScript, source: scriptSource } = resolveUpgradeScript(inst.dir, { fallback: sweepingCoreUpgradeScript });
687
- if (!upgradeScript) { console.error(` ! ${label}: no upgrade.js resolvable for this instance — skipped`); skipped++; continue; }
688
- const canCommitPin = supportsCommitPin(upgradeScript);
689
- const canPinNoPush = supportsPinNoPush(upgradeScript);
690
-
691
- if (!apply) {
692
- const dryEngine = engine.script
693
- ? `go-live.js (backup + ${engine.coTenant ? 'co-tenant pin mode' : 'deploy-timer guard'} + box-side read-back)`
694
- : `direct bongos upgrade — ${engine.why}`;
695
- // The pin flags come from the SAME function the apply path spreads, so the preview cannot
696
- // promise a policy the real sweep will not use (task 1004122). It read `canCommitPin` alone
697
- // before, and so said "--commit-pin" for a co-tenant that was never going to get it.
698
- const dryPinFlags = [...pinFlagsFor({ pinMode, canCommitPin, canPinNoPush }), ...preflightFlagsFor(pinMode)];
699
- console.log(` → ${label}: would upgrade ${installed} → ${target} (${pace}, registry, via the ${scriptSource} core${dryPinFlags.length ? `, ${dryPinFlags.join(' ')}` : ''})`);
700
- console.log(` engine: ${dryEngine}`);
701
- continue;
702
- }
703
-
704
- console.log(` ↑ ${label}: upgrading ${installed} → ${target} (channel: ${inst.channel}) …`);
705
-
706
- // PREFER go-live.js. Running `bongos upgrade` directly gets the bump but none of the
707
- // surrounding rigour: no pg_dump and no guard around the pull-deploy timer (which fires
708
- // every ~2 min doing `git reset --hard` and can revert a pin mid-flight). The machine
709
- // deploying unattended every night should not have weaker checks than a human deploying
710
- // by hand.
711
- // The read-back gap is CLOSED as of task 1002884: upgrade.js no longer treats a failed
712
- // restart as a warning, and it reads the live process's coreVersion back from /version
713
- // rather than trusting a health poll that the still-running OLD core would also answer
714
- // (idea 1000682). go-live is still preferred for the backup + timer guard.
715
- //
716
- // The CHANNEL decision stays here: go-live is told exactly which version to take, so
717
- // the patch-only policy still bounds what may be applied.
718
- let res;
719
- if (engine.script) {
720
- const glArgs = [engine.script, '--target-json', JSON.stringify(engine.mapped.target), '--to', target, '--apply', '--no-divergence'];
721
- res = spawnSync(process.execPath, glArgs, { stdio: 'inherit', env: { ...process.env, ...inst.env } });
722
- } else {
723
- console.log(` • falling back to a direct upgrade — ${engine.why}. No backup and no deploy-timer guard (the served-version read-back does run — task 1002884).`);
724
- const upArgs = [upgradeScript, '--to', target, '--registry', '--instance', inst.dir, '--note', `auto-subscription (${inst.channel})`];
725
- if (inst.service) upArgs.push('--service', inst.service);
726
- if (inst.healthUrl) upArgs.push('--health-url', inst.healthUrl);
727
- // task 1002884: hand the bump the same independent read-back go-live uses. upgrade.js now
728
- // derives /version from the health URL on its own, but the roster already carries the exact
729
- // endpoint — passing it makes the check STRICT (an unreadable endpoint fails the bump rather
730
- // than warning), which is the right posture for a lane nobody is watching.
731
- // Read it from rawTopo, NOT from the normalized `inst`. This branch is reached precisely
732
- // WHEN the normalizer came up short (`mapped.ok === false`, often for versionUrl itself), so
733
- // trusting `inst.versionUrl` here would drop strict mode in exactly the stale-control-plane
734
- // case the comment above rawTopologyFor() documents — the silent degradation this task exists
735
- // to remove. `inst` is kept as a fallback for a roster whose entry is keyed unusually.
736
- const versionUrl = rawTopo.versionUrl || inst.versionUrl;
737
- if (versionUrl) upArgs.push('--version-url', versionUrl);
738
- upArgs.push(...pinFlagsFor({ pinMode, canCommitPin, canPinNoPush }));
739
- // …and the clean-tree half of the same wiring: under leave-dirty the previous bump's pin is
740
- // still in the tree by design, and without this the second bump is refused by upgrade.js's
741
- // pre-flight. go-live.js sends --force on every mode; here it goes only where dirt is declared.
742
- upArgs.push(...preflightFlagsFor(pinMode));
743
- // Auto-rollback stays ON (do NOT pass --no-rollback-on-failure): a bad patch reverts itself.
744
- res = spawnSync(process.execPath, upArgs, { stdio: 'inherit', env: { ...process.env, ...inst.env } });
745
- }
746
-
747
- // RE-PROBE, rather than reusing the set from before the bump. The pre-upgrade answer came from
748
- // the core that was installed THEN, so a skill the NEW core adds — or one it withdraws — is absent
749
- // from it, would land in `other`, and would wedge the lane on the very next sweep: the same defect
750
- // one release later. After the bump the instance carries the core that actually wrote these files,
751
- // which is the only thing that can name them. (On a rolled-back bump the OLD core is back, and its
752
- // answer is the right one for the tree a rollback leaves.)
753
- //
754
- // What re-probing gives is the FILE SET, which materializeClaude walks off coreRoot at call time
755
- // — so this really is the newly-installed core's `.claude/`. What it does not give is the new
756
- // core's materialize CODE: node caches a module by resolved path, and the path did not change.
757
- // A materialize algorithm that changed shape mid-lane is a second-order gap, and closing it would
758
- // mean either a half-purged module graph (new file, old transitive deps) or a child process per
759
- // instance per sweep. The primary path is upgrade.js's own --commit-pin, which uses the real
760
- // post-install materialize result; this is the backstop under it.
761
- const generatedAfter = laneGeneratedPaths(inst.dir);
762
-
763
- if (res.status !== 0) {
764
- console.error(` ✖ ${label}: upgrade to ${target} exited ${res.status == null ? '(signal)' : res.status} — see output above (auto-rollback runs on install/migrate/health failure)`);
765
- // Hold the version unless it actually went in (a failure AFTER a good install, such as an
766
- // unpushed pin, is not the version's fault and must not stop it being retried).
767
- if (readInstalledCoreVersion(inst.dir) !== target) {
768
- const held = recordRefusal({ file: refusalsFile, slug: label, version: target, reason: `exit ${res.status == null ? 'signal' : res.status}` });
769
- console.error(` ${held ? `${target} is held for this instance for a day; a newer version is still taken at once.` : 'could not record the hold — the next sweep will try this version again.'}`);
770
- }
771
- // A rollback restores the OLD pin, which can itself leave the tree dirty. Tidy it so one bad
772
- // patch does not wedge every future sweep.
773
- const after = pinState(inst.dir, spawnSync, generatedAfter);
774
- if (after.repo && !after.clean && !after.other.length && pinMode !== 'leave-dirty') {
775
- commitPin({
776
- dir: inst.dir,
777
- message: `pin @bongos/core ${installed} (restored after a failed auto-upgrade to ${target})`,
778
- push: pinMode !== 'local-commit',
779
- generated: generatedAfter,
780
- });
781
- }
782
- failed++; continue;
783
- }
784
-
785
- // VERIFY THE END STATE. The exit code says the upgrade ran; only a clean tree says the bump will
786
- // SURVIVE. If --commit-pin did its job this is a no-op; if it silently did not, this is the net.
787
- //
788
- // But the net must not FIGHT the target's own pin policy (task 1003843). `leave-dirty` means the
789
- // bump lives in the working tree by design, and committing it here would be the net undoing the
790
- // very thing pinMode was added to express; `local-commit` means the pin may be committed but must
791
- // never reach the customer's own remote. Only the default `push` mode wants the full treatment —
792
- // and it is the only one with a pull-deploy timer waiting to revert an unpushed pin.
793
- if (pinMode === 'leave-dirty') {
794
- console.log(` ✓ ${label}: upgraded to ${target} (pin left in the working tree — pinMode leave-dirty)`);
795
- upgraded++; continue;
796
- }
797
-
798
- const post = commitPin({
799
- dir: inst.dir,
800
- message: `pin @bongos/core ${target} (was ${installed})`,
801
- push: pinMode !== 'local-commit',
802
- generated: generatedAfter,
803
- });
804
- if (!post.ok) {
805
- console.error(` ✖ ${label}: upgraded to ${target} BUT THE PIN IS NOT DURABLE (${post.action}: ${post.reason}).`);
806
- if (pinMode === 'local-commit') {
807
- console.error(' The bump lives only in this instance\'s working tree, and the next sweep will stall on it.');
808
- console.error(` Fix by hand: git -C ${inst.dir} add ${PIN_FILES.join(' ')} && git -C ${inst.dir} commit -m "pin @bongos/core ${target}"`);
809
- } else {
810
- console.error(' The next pull-deploy reset will revert this bump, and the next sweep will stall on the dirty tree.');
811
- console.error(` Fix by hand: git -C ${inst.dir} add ${PIN_FILES.join(' ')} && git -C ${inst.dir} commit -m "pin @bongos/core ${target}" && git -C ${inst.dir} push`);
812
- }
813
- failed++; continue;
814
- }
815
-
816
- console.log(` ✓ ${label}: upgraded to ${target}${post.committed ? ' (pin committed by the lane)' : ''}`);
817
- upgraded++;
818
- }
819
-
820
- console.log(`\ncore-update-subscription: upgraded=${upgraded} up-to-date=${upToDate} skipped=${skipped} failed=${failed}${healed ? ` healed=${healed}` : ''} (${mode})`);
821
- return failed > 0 ? 1 : 0;
822
- }
823
-
824
- if (require.main === module) {
825
- try { process.exit(main()); }
826
- catch (e) { console.error(`core-update-subscription: fatal — ${e && e.message ? e.message : e}`); process.exit(1); }
827
- }
828
-
829
- module.exports = { main, followTarget, heldVersions, recordRefusal, readRefusals, REFUSAL_HOLD_MS, coreModulePathFrom, CORE_PKG_NAMES, pinState, laneGeneratedPaths, commitPin, preflightFlagsFor, resolveUpgradeScript, supportsCommitPin, supportsPinNoPush, pinFlagsFor, goLiveTargetFor, resolveGoLive, goLiveEngineFor, needsCoTenantMode, pinModeOf, healDecision, rawTopologyFor, PIN_FILES, PIN_MODES, GO_LIVE_REQUIRED };
7
+ require('../bongos/forwarder.js').forward(module, 'update-sweep.js');