@bongos/core 1.21.175 → 1.21.176

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1739) hide show
  1. package/.bongos-core.json +3551 -1516
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +14 -14
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  58. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  59. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  60. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  61. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  62. package/docs/adr/README.md +2 -0
  63. package/docs/api/openapi.json +606 -44
  64. package/docs/api-reference.md +25 -12
  65. package/docs/architecture.md +8 -7
  66. package/docs/canonical-permissions.md +3 -3
  67. package/docs/copy-inventory.md +1370 -1411
  68. package/docs/copy-registry.json +2136 -2536
  69. package/docs/design/demonolith-plan.md +6 -6
  70. package/docs/design/modular-architecture/00-research-report.md +1 -1
  71. package/docs/design/project-startup-direction.md +2 -2
  72. package/docs/design/projects-hub-direction-v2.md +1 -1
  73. package/docs/design/reviews/hall-v2/README.md +2 -2
  74. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  75. package/docs/file-map.md +89 -88
  76. package/docs/handoff-template.md +4 -4
  77. package/docs/module-api-changelog.md +5 -3
  78. package/docs/modules-contract.md +8 -7
  79. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  80. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  81. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  82. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  83. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  84. package/docs/onboarding/diagrams/README.md +2 -2
  85. package/docs/onboarding/diagrams/assertions.json +2 -2
  86. package/docs/onboarding/slash-commands.md +2 -2
  87. package/docs/packs/artist.md +4 -4
  88. package/docs/packs/engineer.md +11 -10
  89. package/docs/packs/ideator.md +7 -7
  90. package/docs/page-inventory.json +20 -1
  91. package/docs/page-readings.json +4387 -4603
  92. package/docs/recipes/README.md +1 -1
  93. package/docs/recipes/audit-replay.md +4 -4
  94. package/docs/recipes/autobongos-windows-host.md +6 -6
  95. package/docs/recipes/bongos-cli-release.md +2 -2
  96. package/docs/recipes/claude-design-loop.md +7 -7
  97. package/docs/recipes/core-release-pipeline.md +19 -19
  98. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  99. package/docs/recipes/figma-design-loop.md +6 -6
  100. package/docs/recipes/gds-db-backup.md +9 -9
  101. package/docs/recipes/instance-deploy.md +3 -3
  102. package/docs/recipes/instance-first-run.md +1 -1
  103. package/docs/recipes/multi-builder-merge.md +2 -2
  104. package/docs/recipes/ops-gotchas.md +10 -9
  105. package/docs/recipes/packaging-the-core.md +6 -6
  106. package/docs/recipes/parallel-goal-waves.md +4 -4
  107. package/docs/recipes/private-npm-distribution.md +9 -9
  108. package/docs/recipes/redteam-patrol.md +5 -5
  109. package/docs/recipes/render-pilot.md +2 -2
  110. package/docs/recipes/reranking-a-goals-board.md +2 -2
  111. package/docs/recipes/search-index-ingestion.md +5 -5
  112. package/docs/recipes/self-host.md +1 -1
  113. package/docs/recipes/ship-and-regrade.md +4 -4
  114. package/docs/recipes/staging-environment.md +1 -1
  115. package/docs/recipes/standalone-live-docs.md +1 -1
  116. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  117. package/docs/recipes/upgrading-the-core.md +11 -11
  118. package/docs/recipes/windows-builders.md +18 -18
  119. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  120. package/docs/research/task-network-map-readability.md +3 -3
  121. package/migrations/core_278_builder_tester_tag.sql +18 -0
  122. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  123. package/modules/agents/lib/answer-hold.js +1 -1
  124. package/modules/agents/lib/gate.js +1 -1
  125. package/modules/agents/lib/validate.js +1 -1
  126. package/modules/autonomy/gauge.js +1 -1
  127. package/modules/autonomy/governor-docket.js +2 -2
  128. package/modules/autonomy/pollers/routine-timers.js +3 -3
  129. package/modules/autonomy/routes/autonomy.js +3 -3
  130. package/modules/builder-settings/interaction-prefs.js +1 -1
  131. package/modules/builder-settings/render-prefs.js +1 -1
  132. package/modules/builder-settings/routes/settings.js +1 -1
  133. package/modules/builder-settings/skill-prefs.js +2 -2
  134. package/modules/builder-settings/wandering-prefs.js +2 -2
  135. package/modules/copy-desk/module.json +2 -2
  136. package/modules/copy-desk/page-data.js +5 -5
  137. package/modules/copy-desk/page-decisions.js +13 -1
  138. package/modules/copy-desk/proposals.js +4 -4
  139. package/modules/copy-desk/registry.js +2 -2
  140. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  141. package/modules/copy-desk/routes/copy-desk.js +3 -12
  142. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  143. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  144. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  145. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  146. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  147. package/modules/design-styles/skills/README.md +4 -4
  148. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  149. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  150. package/modules/discord/bug-attachments.js +1 -1
  151. package/modules/discord/ship-broadcast.js +1 -1
  152. package/modules/economy/achievements.js +49 -7
  153. package/modules/economy/cost-classify.js +6 -6
  154. package/modules/economy/cost-report.js +1 -1
  155. package/modules/economy/cost.js +1 -1
  156. package/modules/economy/credits.js +2 -1
  157. package/modules/economy/idea-size.js +2 -2
  158. package/modules/economy/reward.js +2 -0
  159. package/modules/economy/routes/cost.js +1 -1
  160. package/modules/economy/streak.js +43 -4
  161. package/modules/government/asks.js +1 -1
  162. package/modules/government/board.js +19 -2
  163. package/modules/government/catalog.js +3 -0
  164. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  165. package/modules/government/protected-surfaces.json +48 -47
  166. package/modules/government/recommendations.js +6 -2
  167. package/modules/government/routes/government.js +1 -1
  168. package/modules/grading/generated-provenance.js +13 -5
  169. package/modules/grading/grade-engine.js +1 -1
  170. package/modules/grading/grader-rubric.json +1 -1
  171. package/modules/grading/grader-score.js +1 -1
  172. package/modules/grading/grader-workers/index.js +1 -1
  173. package/modules/grading/grader.js +1 -1
  174. package/modules/grading/routes/grade.js +1 -1
  175. package/modules/hall-ui/public/atlas.html +5 -7
  176. package/modules/hall-ui/public/atlas.js +1 -1
  177. package/modules/hall-ui/public/atlas.states.json +1 -1
  178. package/modules/hall-ui/public/blockers.css +9 -0
  179. package/modules/hall-ui/public/blockers.html +4 -4
  180. package/modules/hall-ui/public/blockers.js +29 -30
  181. package/modules/hall-ui/public/board-room.css +5 -17
  182. package/modules/hall-ui/public/board-room.html +5 -6
  183. package/modules/hall-ui/public/board-room.js +41 -23
  184. package/modules/hall-ui/public/board-room.states.json +1 -1
  185. package/modules/hall-ui/public/brand-apply.js +1 -1
  186. package/modules/hall-ui/public/brand-holes.js +1 -1
  187. package/modules/hall-ui/public/builders.js +40 -86
  188. package/modules/hall-ui/public/city-decide.js +18 -4
  189. package/modules/hall-ui/public/city.html +1 -1
  190. package/modules/hall-ui/public/collab.html +1 -1
  191. package/modules/hall-ui/public/commands.html +6 -9
  192. package/modules/hall-ui/public/copy-desk.html +1 -1
  193. package/modules/hall-ui/public/copy-desk.js +2 -2
  194. package/modules/hall-ui/public/craft-mode.js +4 -0
  195. package/modules/hall-ui/public/deploy.html +6 -2
  196. package/modules/hall-ui/public/deploy.js +21 -13
  197. package/modules/hall-ui/public/diagrams.css +1 -1
  198. package/modules/hall-ui/public/diagrams.html +5 -8
  199. package/modules/hall-ui/public/diagrams.states.json +1 -1
  200. package/modules/hall-ui/public/drachmae.html +3 -7
  201. package/modules/hall-ui/public/fleet.html +3 -2
  202. package/modules/hall-ui/public/fleet.js +0 -4
  203. package/modules/hall-ui/public/gate.html +7 -7
  204. package/modules/hall-ui/public/gate.js +58 -77
  205. package/modules/hall-ui/public/goal-map.html +1 -1
  206. package/modules/hall-ui/public/goals-page.js +5 -5
  207. package/modules/hall-ui/public/goals-render.js +10 -11
  208. package/modules/hall-ui/public/goals.css +10 -0
  209. package/modules/hall-ui/public/goals.html +14 -7
  210. package/modules/hall-ui/public/government.html +3 -5
  211. package/modules/hall-ui/public/government.js +1 -5
  212. package/modules/hall-ui/public/hall-render.js +117 -57
  213. package/modules/hall-ui/public/hall-widgets.js +11 -11
  214. package/modules/hall-ui/public/idea.html +1 -1
  215. package/modules/hall-ui/public/ideas.html +3 -1
  216. package/modules/hall-ui/public/ideas.js +1 -0
  217. package/modules/hall-ui/public/index.html +12 -6
  218. package/modules/hall-ui/public/index.states.json +1 -1
  219. package/modules/hall-ui/public/mine-lens.js +1 -1
  220. package/modules/hall-ui/public/modules.html +7 -10
  221. package/modules/hall-ui/public/modules.js +0 -2
  222. package/modules/hall-ui/public/my-agents.html +1 -1
  223. package/modules/hall-ui/public/palette.js +5 -5
  224. package/modules/hall-ui/public/primer.html +4 -9
  225. package/modules/hall-ui/public/profile-connections.js +10 -2
  226. package/modules/hall-ui/public/profile-roles.js +3 -10
  227. package/modules/hall-ui/public/profile.html +12 -10
  228. package/modules/hall-ui/public/profile.js +13 -17
  229. package/modules/hall-ui/public/project-settings.html +3 -4
  230. package/modules/hall-ui/public/project-settings.js +0 -3
  231. package/modules/hall-ui/public/ranks.html +5 -11
  232. package/modules/hall-ui/public/ranks.js +6 -8
  233. package/modules/hall-ui/public/roadmap.css +0 -2
  234. package/modules/hall-ui/public/roadmap.html +1 -1
  235. package/modules/hall-ui/public/roadmap.js +16 -51
  236. package/modules/hall-ui/public/roster.html +1 -1
  237. package/modules/hall-ui/public/sessions.html +6 -8
  238. package/modules/hall-ui/public/sessions.js +7 -7
  239. package/modules/hall-ui/public/settings.html +1 -1
  240. package/modules/hall-ui/public/shell-trail.js +1 -1
  241. package/modules/hall-ui/public/shell.js +17 -17
  242. package/modules/hall-ui/public/street-deck.css +2 -1
  243. package/modules/hall-ui/public/street-deck.js +10 -2
  244. package/modules/hall-ui/public/street-desk.js +16 -5
  245. package/modules/hall-ui/public/street.html +1 -1
  246. package/modules/hall-ui/public/studio-lib.js +4 -0
  247. package/modules/hall-ui/public/studio.css +2 -0
  248. package/modules/hall-ui/public/studio.html +1 -1
  249. package/modules/hall-ui/public/studio.js +27 -1
  250. package/modules/hall-ui/public/style.css +43 -26
  251. package/modules/hall-ui/public/task-detail.js +10 -7
  252. package/modules/hall-ui/public/task.css +2 -0
  253. package/modules/hall-ui/public/task.html +3 -1
  254. package/modules/hall-ui/public/task.js +23 -7
  255. package/modules/hall-ui/public/thinking.html +1 -1
  256. package/modules/hall-ui/public/tweak-editor.html +1 -1
  257. package/modules/hall-ui/public/vote-control.js +208 -0
  258. package/modules/hall-ui/public/watch.html +3 -5
  259. package/modules/hall-ui/public/watch.js +5 -4
  260. package/modules/hall-ui/public/welcome-boot.css +130 -0
  261. package/modules/hall-ui/public/welcome-boot.js +334 -0
  262. package/modules/hall-ui/public/welcome-day.webp +0 -0
  263. package/modules/hall-ui/public/welcome-night.webp +0 -0
  264. package/modules/hall-ui/public/work-summary.js +1 -1
  265. package/modules/hall-ui/public/work.css +1 -0
  266. package/modules/hall-ui/public/work.html +3 -1
  267. package/modules/hall-ui/public/work.js +2 -1
  268. package/modules/hall-ui/records/accomplishments.md +16 -0
  269. package/modules/hall-ui/records/hall-ask-card.md +9 -0
  270. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  271. package/modules/hall-ui/records/oversight-family.md +1 -1
  272. package/modules/hall-ui/records/profile-connections.md +2 -0
  273. package/modules/hall-ui/records/profile-roles.md +1 -1
  274. package/modules/hall-ui/records/reading-rooms.md +1 -1
  275. package/modules/hall-ui/records/welcome-tower.md +50 -0
  276. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  277. package/modules/ideas/projection.js +1 -1
  278. package/modules/ideas/routes/blockers.js +3 -3
  279. package/modules/ideas/routes/inbox.js +29 -1
  280. package/modules/ideas/routes/ratify-goal.js +1 -1
  281. package/modules/ideas/routing.js +1 -1
  282. package/modules/ideas/templates.js +1 -1
  283. package/modules/ideas/trail-descent.js +1 -1
  284. package/modules/ideas/trail-size.js +1 -1
  285. package/modules/ideas/votes.js +93 -0
  286. package/modules/lifecycle/abandon-leftovers.js +1 -1
  287. package/modules/lifecycle/cascade.js +1 -1
  288. package/modules/lifecycle/conflict-resolve.js +13 -21
  289. package/modules/lifecycle/criterion-ref.js +1 -1
  290. package/modules/lifecycle/db-analytics.js +57 -4
  291. package/modules/lifecycle/db-deps-criteria.js +1 -1
  292. package/modules/lifecycle/db-ship.js +2 -2
  293. package/modules/lifecycle/db-tasks.js +2 -2
  294. package/modules/lifecycle/db-versions.js +1 -1
  295. package/modules/lifecycle/db.js +2 -0
  296. package/modules/lifecycle/dead-deps.js +3 -3
  297. package/modules/lifecycle/dependency-advisory.js +3 -3
  298. package/modules/lifecycle/goal-category.js +1 -1
  299. package/modules/lifecycle/goal-forest.js +1 -1
  300. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  301. package/modules/lifecycle/kickoff-checklist.js +1 -1
  302. package/modules/lifecycle/kickoff-seed.js +1 -1
  303. package/modules/lifecycle/lifecycle.js +2 -0
  304. package/modules/lifecycle/merge-reach.js +29 -15
  305. package/modules/lifecycle/missing-dep-classify.js +3 -3
  306. package/modules/lifecycle/module.json +2 -1
  307. package/modules/lifecycle/page-tweak-approve.js +85 -1
  308. package/modules/lifecycle/page-tweak-hold.js +1 -1
  309. package/modules/lifecycle/publish-reconciler.js +1 -2
  310. package/modules/lifecycle/rot.js +1 -1
  311. package/modules/lifecycle/routes/artist-gate.js +1 -1
  312. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  313. package/modules/lifecycle/routes/goals.js +1 -1
  314. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  315. package/modules/lifecycle/routes/task-votes.js +54 -0
  316. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  317. package/modules/lifecycle/routes/tasks.js +2 -2
  318. package/modules/lifecycle/routes/versions.js +2 -2
  319. package/modules/lifecycle/ship-card.js +4 -4
  320. package/modules/lifecycle/ship-preflight.js +1 -1
  321. package/modules/lifecycle/task-classifier.js +1 -1
  322. package/modules/lifecycle/task-status.js +1 -1
  323. package/modules/lifecycle/task-visual-db.js +1 -1
  324. package/modules/memory/learnings.js +1 -1
  325. package/modules/memory/pollers/search-index.js +2 -2
  326. package/modules/memory/routes/learnings.js +1 -1
  327. package/modules/memory/routes/memory.js +1 -1
  328. package/modules/memory/search.js +2 -2
  329. package/modules/npm-release/release.js +1 -1
  330. package/modules/onboarding/howto-moments.js +1 -1
  331. package/modules/onboarding/newcomer-restock.js +3 -3
  332. package/modules/onboarding/onboarding.js +1 -1
  333. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  334. package/modules/platform-identity/origin-containment.js +1 -1
  335. package/modules/platform-identity/publish-gate.js +1 -1
  336. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  337. package/modules/provisioning/capacity.js +1 -1
  338. package/modules/provisioning/core-upgrade.js +15 -9
  339. package/modules/provisioning/credential-preflight.js +3 -3
  340. package/modules/provisioning/disconnect.js +1 -1
  341. package/modules/provisioning/dns-resolves.js +1 -1
  342. package/modules/provisioning/module.json +1 -1
  343. package/modules/provisioning/onboard-plan.js +1 -1
  344. package/modules/provisioning/paid-shape-gate.js +2 -2
  345. package/modules/provisioning/planet-physics.js +11 -2
  346. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  347. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  348. package/modules/provisioning/provisioning.js +2 -2
  349. package/modules/provisioning/render-lookup.js +1 -1
  350. package/modules/provisioning/render-standup.js +3 -3
  351. package/modules/provisioning/repo-private.js +1 -1
  352. package/modules/provisioning/routes/callback-page.js +1 -1
  353. package/modules/provisioning/routes/core-upgrade.js +23 -3
  354. package/modules/provisioning/routes/provisioning.js +2 -2
  355. package/modules/provisioning/routes/render-standup.js +1 -1
  356. package/modules/provisioning/routes/repo-private.js +1 -1
  357. package/modules/provisioning/soft-limits.js +1 -1
  358. package/modules/provisioning/starter-bundles.js +4 -2
  359. package/modules/provisioning/tests/provisioning.mjs +1 -1
  360. package/modules/public-landing/public/account.html +4 -6
  361. package/modules/public-landing/public/assets/cosmos.css +13 -6
  362. package/modules/public-landing/public/connections.html +4 -6
  363. package/modules/public-landing/public/contact.html +4 -6
  364. package/modules/public-landing/public/guild.html +4 -6
  365. package/modules/public-landing/public/index.html +11 -9
  366. package/modules/public-landing/public/invitations.html +4 -6
  367. package/modules/public-landing/public/privacy.html +4 -6
  368. package/modules/public-landing/public/projects.html +168 -46
  369. package/modules/public-landing/public/terms.html +4 -6
  370. package/modules/raise/content/copy.json +40 -0
  371. package/modules/raise/content/nda.html +39 -0
  372. package/modules/raise/content/settings.json +49 -0
  373. package/modules/raise/db.js +95 -0
  374. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  375. package/modules/raise/module.json +28 -0
  376. package/modules/raise/page.js +194 -0
  377. package/modules/raise/public/edit.js +152 -0
  378. package/modules/raise/public/favicon.svg +1 -0
  379. package/modules/raise/public/logo-ink.svg +1 -0
  380. package/modules/raise/public/logo-night.svg +1 -0
  381. package/modules/raise/public/mode.js +8 -0
  382. package/modules/raise/public/raise.css +234 -0
  383. package/modules/raise/public/raise.js +91 -0
  384. package/modules/raise/raise.js +174 -0
  385. package/modules/raise/routes/raise.js +152 -0
  386. package/modules/raise/views/gate.html +39 -0
  387. package/modules/raise/views/nda.html +21 -0
  388. package/modules/raise/views/page.html +133 -0
  389. package/modules/raise/web.js +72 -0
  390. package/modules/render-deploy/deploys.js +1 -1
  391. package/modules/render-deploy/render.js +2 -2
  392. package/modules/security/secret-scrub.js +3 -3
  393. package/modules/security/security.js +1 -1
  394. package/modules/security/tests/artifact_scan.mjs +1 -1
  395. package/modules/security/tests/mirror.mjs +1 -1
  396. package/modules/security/tests/scan_store.mjs +1 -1
  397. package/modules/sessions/db.js +2 -2
  398. package/modules/sessions/pulse.js +2 -2
  399. package/modules/sessions/routes/sessions.js +1 -1
  400. package/modules/specialities/specialities.js +1 -1
  401. package/modules/status-ui/public/README.md +3 -4
  402. package/modules/status-ui/public/index.html +5 -31
  403. package/modules/status-ui/public/status.js +6 -174
  404. package/modules/status-ui/public/style.css +4 -133
  405. package/modules/ui-design/docs/design-contract.md +3 -3
  406. package/modules/ui-design/kit/README.md +1 -1
  407. package/modules/ui-design/kit/serve.js +13 -4
  408. package/modules/ui-design/scripts/design-sync.js +1 -1
  409. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  410. package/modules/ui-design/scripts/validate-design.js +1 -1
  411. package/package-lock.json +27 -11
  412. package/package.json +2 -3
  413. package/release-notes.json +172 -0
  414. package/scripts/bongos/CLAUDE.md +15 -0
  415. package/scripts/bongos/abandon.js +137 -0
  416. package/scripts/bongos/accessibility-replay.js +195 -0
  417. package/scripts/bongos/address-park-sweep.sh +91 -0
  418. package/scripts/bongos/adopt-detect.js +123 -0
  419. package/scripts/bongos/adopt-import.js +111 -0
  420. package/scripts/bongos/adopt-preflight.js +187 -0
  421. package/scripts/bongos/adr-namespace.js +273 -0
  422. package/scripts/bongos/agent-invoke.js +689 -0
  423. package/scripts/bongos/agents-sync.js +502 -0
  424. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  425. package/scripts/bongos/api-artifacts.js +91 -0
  426. package/scripts/bongos/api.js +86 -0
  427. package/scripts/bongos/api.ps1 +26 -0
  428. package/scripts/bongos/architect-audit.js +294 -0
  429. package/scripts/bongos/artifact-audit.js +326 -0
  430. package/scripts/bongos/artifact-format.js +203 -0
  431. package/scripts/bongos/artifact-staleness.js +267 -0
  432. package/scripts/bongos/ask.js +231 -0
  433. package/scripts/bongos/audit-authorship.sh +329 -0
  434. package/scripts/bongos/audit-deps.js +189 -0
  435. package/scripts/bongos/audit-gate.js +121 -0
  436. package/scripts/bongos/audit-rank-roles.js +172 -0
  437. package/scripts/bongos/audit-replay.sh +205 -0
  438. package/scripts/bongos/autobongos-digest.js +123 -0
  439. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  440. package/scripts/bongos/autobongos-loop.js +210 -0
  441. package/scripts/bongos/autobongos-run.js +1361 -0
  442. package/scripts/bongos/autobongos-service.cmd +50 -0
  443. package/scripts/bongos/autobongos-service.ps1 +270 -0
  444. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  445. package/scripts/bongos/autobongos-verify.js +618 -0
  446. package/scripts/bongos/autonomy-gate.js +135 -0
  447. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  448. package/scripts/bongos/autonomy-gauge.js +84 -0
  449. package/scripts/bongos/backfill-cost.js +176 -0
  450. package/scripts/bongos/backfill-disciplines.js +144 -0
  451. package/scripts/bongos/backfill-session-earnings.js +123 -0
  452. package/scripts/bongos/backfill-session-types.js +87 -0
  453. package/scripts/bongos/backfill-sessions.js +411 -0
  454. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  455. package/scripts/bongos/backfill-task-rewards.js +413 -0
  456. package/scripts/bongos/backlog-review.js +399 -0
  457. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  458. package/scripts/bongos/backup.js +116 -0
  459. package/scripts/bongos/baseline-staleness.js +217 -0
  460. package/scripts/bongos/bfg-principal-token.js +65 -0
  461. package/scripts/bongos/bug-attachment-audit.js +149 -0
  462. package/scripts/bongos/bug-attachment-recover.js +198 -0
  463. package/scripts/bongos/bug-triage.js +292 -0
  464. package/scripts/bongos/build-bongos.js +94 -0
  465. package/scripts/bongos/bump-version.js +221 -0
  466. package/scripts/bongos/capture.js +481 -0
  467. package/scripts/bongos/category-advisory-guard.js +206 -0
  468. package/scripts/bongos/ci-grade.js +82 -0
  469. package/scripts/bongos/claim-recall.js +112 -0
  470. package/scripts/bongos/claim.js +789 -0
  471. package/scripts/bongos/classify-discipline.js +153 -0
  472. package/scripts/bongos/claude-materialize.js +1200 -0
  473. package/scripts/bongos/claude-md-template.js +142 -0
  474. package/scripts/bongos/cleanup-orphans.js +74 -0
  475. package/scripts/bongos/cli-lib.js +1226 -0
  476. package/scripts/bongos/client-baseurl-guard.js +116 -0
  477. package/scripts/bongos/codemod-rename-scripts-gds.js +381 -0
  478. package/scripts/bongos/codemod-rename-src-gds.js +145 -0
  479. package/scripts/bongos/conductor-dispatch.js +535 -0
  480. package/scripts/bongos/context-pack.js +326 -0
  481. package/scripts/bongos/control-manifest.js +199 -0
  482. package/scripts/bongos/copy-apply.js +758 -0
  483. package/scripts/bongos/copy-inventory.js +571 -0
  484. package/scripts/bongos/core-origin-follow.js +185 -0
  485. package/scripts/bongos/core-pin-sync.js +260 -0
  486. package/scripts/bongos/coreB-carve-proof.sh +725 -0
  487. package/scripts/bongos/cost-report.js +63 -0
  488. package/scripts/bongos/cost.js +47 -0
  489. package/scripts/bongos/credential-presence.js +296 -0
  490. package/scripts/bongos/cutover-codemod.js +240 -0
  491. package/scripts/bongos/db-backup-nightly.sh +232 -0
  492. package/scripts/bongos/db-backup-offsite.sh +267 -0
  493. package/scripts/bongos/demote.js +45 -0
  494. package/scripts/bongos/deploy-divergence.js +454 -0
  495. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  496. package/scripts/bongos/design-sync.js +12 -0
  497. package/scripts/bongos/dev-box-guard.js +166 -0
  498. package/scripts/bongos/dev-lib.js +722 -0
  499. package/scripts/bongos/dev.js +645 -0
  500. package/scripts/bongos/device-flow-help.js +72 -0
  501. package/scripts/bongos/diagnose-achievements.js +118 -0
  502. package/scripts/bongos/diagram-facts.js +355 -0
  503. package/scripts/bongos/discord-channels.js +77 -0
  504. package/scripts/bongos/do-api.js +109 -0
  505. package/scripts/bongos/doc-cli-guard.js +274 -0
  506. package/scripts/bongos/doc-comment-coverage.js +139 -0
  507. package/scripts/bongos/doc-control-claims.js +170 -0
  508. package/scripts/bongos/docs-entropy.js +453 -0
  509. package/scripts/bongos/doctor.js +493 -0
  510. package/scripts/bongos/enroll-control-plane.js +101 -0
  511. package/scripts/bongos/exec-path-guard.js +564 -0
  512. package/scripts/bongos/feedback-send.js +249 -0
  513. package/scripts/bongos/fetch-art-key.js +106 -0
  514. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  515. package/scripts/bongos/figma-design-sync.js +11 -0
  516. package/scripts/bongos/find-untested.js +371 -0
  517. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  518. package/scripts/bongos/fitness-checks-identity.js +343 -0
  519. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  520. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  521. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  522. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  523. package/scripts/bongos/fitness-lib.js +127 -0
  524. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  525. package/scripts/bongos/fitness-ratchets.js +594 -0
  526. package/scripts/bongos/fitness.js +1498 -0
  527. package/scripts/bongos/forwarder.js +80 -0
  528. package/scripts/bongos/gate-review.js +330 -0
  529. package/scripts/bongos/gating.js +348 -0
  530. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  531. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  532. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  533. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  534. package/scripts/bongos/gds-literal-scan.js +196 -0
  535. package/scripts/bongos/gen-api-client.js +576 -0
  536. package/scripts/bongos/gen-api-docs.js +1111 -0
  537. package/scripts/bongos/gen-atlas.js +366 -0
  538. package/scripts/bongos/gen-diagrams.js +608 -0
  539. package/scripts/bongos/gen-file-map.js +337 -0
  540. package/scripts/bongos/gen-freshness.js +32 -0
  541. package/scripts/bongos/gen-interaction-posture.js +122 -0
  542. package/scripts/bongos/gen-repo-map.js +540 -0
  543. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  544. package/scripts/bongos/gen-session-index.js +243 -0
  545. package/scripts/bongos/gen-sounds.js +176 -0
  546. package/scripts/bongos/git-merge-regen.js +254 -0
  547. package/scripts/bongos/go-live.js +1071 -0
  548. package/scripts/bongos/goal-names.js +102 -0
  549. package/scripts/bongos/goal.js +272 -0
  550. package/scripts/bongos/government-walk.js +1477 -0
  551. package/scripts/bongos/grade-correlation-audit.js +310 -0
  552. package/scripts/bongos/grade-replay.js +237 -0
  553. package/scripts/bongos/grade-smoke.js +205 -0
  554. package/scripts/bongos/home-isolation-guard.js +126 -0
  555. package/scripts/bongos/hooks/pre-push.js +211 -0
  556. package/scripts/bongos/howto.js +145 -0
  557. package/scripts/bongos/http-api-client.js +81 -0
  558. package/scripts/bongos/identity-strip.js +75 -0
  559. package/scripts/bongos/init.js +1159 -0
  560. package/scripts/bongos/install-git-hooks.js +200 -0
  561. package/scripts/bongos/instance-apex.js +38 -0
  562. package/scripts/bongos/intent-retry.js +52 -0
  563. package/scripts/bongos/key-card.js +222 -0
  564. package/scripts/bongos/key-status.js +126 -0
  565. package/scripts/bongos/land-watch.js +201 -0
  566. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  567. package/scripts/bongos/learning-capture.js +145 -0
  568. package/scripts/bongos/lib.sh +74 -0
  569. package/scripts/bongos/linkify-refs.js +655 -0
  570. package/scripts/bongos/lint-infra-exec.js +70 -0
  571. package/scripts/bongos/lint-migrations.js +102 -0
  572. package/scripts/bongos/lint-workflow-exec.js +63 -0
  573. package/scripts/bongos/local-preview-lib.js +128 -0
  574. package/scripts/bongos/local-preview.js +82 -0
  575. package/scripts/bongos/login.js +360 -0
  576. package/scripts/bongos/main-audit.js +625 -0
  577. package/scripts/bongos/me.js +97 -0
  578. package/scripts/bongos/memory-map.js +176 -0
  579. package/scripts/bongos/merge-lock.js +71 -0
  580. package/scripts/bongos/migration-namespace.js +313 -0
  581. package/scripts/bongos/mirror-lineage-check.js +343 -0
  582. package/scripts/bongos/mirror-redact.js +350 -0
  583. package/scripts/bongos/module-artifact.js +289 -0
  584. package/scripts/bongos/module-assess-docs.js +238 -0
  585. package/scripts/bongos/module-assess-installs.js +228 -0
  586. package/scripts/bongos/module-assess-score.js +111 -0
  587. package/scripts/bongos/module-assess-security.js +252 -0
  588. package/scripts/bongos/module-assess-tests.js +278 -0
  589. package/scripts/bongos/module-assess-version.js +92 -0
  590. package/scripts/bongos/module-error-report.js +148 -0
  591. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  592. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  593. package/scripts/bongos/module-test-runner.js +414 -0
  594. package/scripts/bongos/module.js +1376 -0
  595. package/scripts/bongos/move-escalation.js +141 -0
  596. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  597. package/scripts/bongos/newcomer-floor.js +421 -0
  598. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  599. package/scripts/bongos/newcomer-floor.test.js +235 -0
  600. package/scripts/bongos/next-number.js +163 -0
  601. package/scripts/bongos/oauth-secret.js +202 -0
  602. package/scripts/bongos/onboard.js +267 -0
  603. package/scripts/bongos/onboarding-analyze.js +226 -0
  604. package/scripts/bongos/onboarding-config.js +179 -0
  605. package/scripts/bongos/onboarding-ship.js +92 -0
  606. package/scripts/bongos/pack-env-prefix.js +73 -0
  607. package/scripts/bongos/package-core.js +1200 -0
  608. package/scripts/bongos/page-inventory.js +348 -0
  609. package/scripts/bongos/page-reader.js +722 -0
  610. package/scripts/bongos/paste-token.js +212 -0
  611. package/scripts/bongos/plain-cards.js +351 -0
  612. package/scripts/bongos/portability-smoke-art.sh +85 -0
  613. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  614. package/scripts/bongos/preflight.js +214 -0
  615. package/scripts/bongos/probe-cache.js +246 -0
  616. package/scripts/bongos/prove-strict-versioning.js +284 -0
  617. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  618. package/scripts/bongos/provision-byo-host.js +68 -0
  619. package/scripts/bongos/provision-capacity.js +79 -0
  620. package/scripts/bongos/provision-caps.js +63 -0
  621. package/scripts/bongos/provision-config.js +233 -0
  622. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  623. package/scripts/bongos/provision-disconnect.js +88 -0
  624. package/scripts/bongos/provision-github-setup.js +168 -0
  625. package/scripts/bongos/provision-net.js +357 -0
  626. package/scripts/bongos/provision-pin-key.js +176 -0
  627. package/scripts/bongos/provision-pin-replay.js +126 -0
  628. package/scripts/bongos/provision-process.js +170 -0
  629. package/scripts/bongos/provision-render.js +201 -0
  630. package/scripts/bongos/provision-repo-auth.js +164 -0
  631. package/scripts/bongos/provision-repo-private.js +98 -0
  632. package/scripts/bongos/provision-repo.js +1337 -0
  633. package/scripts/bongos/provision-teardown.js +106 -0
  634. package/scripts/bongos/provision-units.js +469 -0
  635. package/scripts/bongos/provision.js +1479 -0
  636. package/scripts/bongos/publish-credential-check.js +66 -0
  637. package/scripts/bongos/publish-integration-gate.js +142 -0
  638. package/scripts/bongos/publish-manifest.js +440 -0
  639. package/scripts/bongos/publish-watch.js +268 -0
  640. package/scripts/bongos/pulse.js +336 -0
  641. package/scripts/bongos/push-main.js +56 -0
  642. package/scripts/bongos/push-path-brief.js +100 -0
  643. package/scripts/bongos/read-session-export.js +359 -0
  644. package/scripts/bongos/reauth.js +155 -0
  645. package/scripts/bongos/recall.js +183 -0
  646. package/scripts/bongos/redteam-patrol.js +437 -0
  647. package/scripts/bongos/regen-instance-docs.js +47 -0
  648. package/scripts/bongos/release-core.js +80 -0
  649. package/scripts/bongos/release-notes.js +271 -0
  650. package/scripts/bongos/release.js +139 -0
  651. package/scripts/bongos/rename-goals.js +109 -0
  652. package/scripts/bongos/rename-history-check.js +369 -0
  653. package/scripts/bongos/rename-ledger-prose.js +482 -0
  654. package/scripts/bongos/render-api.js +197 -0
  655. package/scripts/bongos/render-check.js +206 -0
  656. package/scripts/bongos/render-ideas.js +226 -0
  657. package/scripts/bongos/render-payload.js +85 -0
  658. package/scripts/bongos/repo-metrics.js +363 -0
  659. package/scripts/bongos/review-sheet.js +108 -0
  660. package/scripts/bongos/role-pack-guard.js +142 -0
  661. package/scripts/bongos/route-shadow-guard.js +175 -0
  662. package/scripts/bongos/routine-schedule.js +283 -0
  663. package/scripts/bongos/run-routine.js +257 -0
  664. package/scripts/bongos/run-unit-tests.js +654 -0
  665. package/scripts/bongos/runner-drift.js +151 -0
  666. package/scripts/bongos/sandbox-stage.js +459 -0
  667. package/scripts/bongos/scope-map-guard.js +300 -0
  668. package/scripts/bongos/scope-roster-guard.js +118 -0
  669. package/scripts/bongos/seam-wiring-guard.js +275 -0
  670. package/scripts/bongos/search-ingest-db.js +288 -0
  671. package/scripts/bongos/search-ingest-md.js +269 -0
  672. package/scripts/bongos/seed-adopt-tasks.js +75 -0
  673. package/scripts/bongos/seed-api-contract-goal-tasks.js +141 -0
  674. package/scripts/bongos/seed-board-room-tasks.js +196 -0
  675. package/scripts/bongos/seed-bongos-app-tasks.js +294 -0
  676. package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +81 -0
  677. package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +100 -0
  678. package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +307 -0
  679. package/scripts/bongos/seed-bongos-module-system-tasks.js +346 -0
  680. package/scripts/bongos/seed-bongos-tasks.js +214 -0
  681. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  682. package/scripts/bongos/seed-bongos-v1-seo-tasks.js +104 -0
  683. package/scripts/bongos/seed-bv1-community-tasks.js +131 -0
  684. package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +133 -0
  685. package/scripts/bongos/seed-bv1-profile-page-tasks.js +161 -0
  686. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  687. package/scripts/bongos/seed-bv1-r01-delta-tasks.js +154 -0
  688. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  689. package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +277 -0
  690. package/scripts/bongos/seed-gds-v4-tasks.js +624 -0
  691. package/scripts/bongos/seed-governance-tasks.js +340 -0
  692. package/scripts/bongos/seed-medusa-tasks.js +440 -0
  693. package/scripts/bongos/seed-module-upstreaming.js +219 -0
  694. package/scripts/bongos/seed-productization-tasks.js +235 -0
  695. package/scripts/bongos/seed-project-admin-console-tasks.js +88 -0
  696. package/scripts/bongos/seed-provisioning-tasks.js +83 -0
  697. package/scripts/bongos/seed-staging.sh +117 -0
  698. package/scripts/bongos/seed-strict-versioning-tasks.js +275 -0
  699. package/scripts/bongos/seed-v2-world-tasks.js +283 -0
  700. package/scripts/bongos/seed-verify-criteria.js +124 -0
  701. package/scripts/bongos/sequence.js +597 -0
  702. package/scripts/bongos/session-cost.js +430 -0
  703. package/scripts/bongos/session-digest-build.js +293 -0
  704. package/scripts/bongos/session-digest.js +200 -0
  705. package/scripts/bongos/session-eval.js +631 -0
  706. package/scripts/bongos/session-transcript-build.js +155 -0
  707. package/scripts/bongos/session-transcript-upload.js +29 -0
  708. package/scripts/bongos/session.js +404 -0
  709. package/scripts/bongos/setup.js +646 -0
  710. package/scripts/bongos/ship-check.js +89 -0
  711. package/scripts/bongos/ship-deploy-target.js +393 -0
  712. package/scripts/bongos/ship-escalation.js +167 -0
  713. package/scripts/bongos/ship-finish.js +420 -0
  714. package/scripts/bongos/ship-flow.js +1217 -0
  715. package/scripts/bongos/ship-git.js +100 -0
  716. package/scripts/bongos/ship-grade-steps.js +547 -0
  717. package/scripts/bongos/ship-grade.js +426 -0
  718. package/scripts/bongos/ship-honesty.js +314 -0
  719. package/scripts/bongos/ship-io.js +139 -0
  720. package/scripts/bongos/ship-land.js +1130 -0
  721. package/scripts/bongos/ship-memory-sync.js +249 -0
  722. package/scripts/bongos/ship-merge-gate.js +225 -0
  723. package/scripts/bongos/ship-merge.js +466 -0
  724. package/scripts/bongos/ship-mode-ask.js +138 -0
  725. package/scripts/bongos/ship-mode-manual.js +54 -0
  726. package/scripts/bongos/ship-preflight-steps.js +399 -0
  727. package/scripts/bongos/ship-regen.js +292 -0
  728. package/scripts/bongos/ship-resume.js +201 -0
  729. package/scripts/bongos/ship-session-upload.js +313 -0
  730. package/scripts/bongos/ship-state.js +110 -0
  731. package/scripts/bongos/ship-surprise.js +84 -0
  732. package/scripts/bongos/ship-visual.js +75 -0
  733. package/scripts/bongos/ship.js +382 -0
  734. package/scripts/bongos/shipping-mode.js +71 -0
  735. package/scripts/bongos/skill-lint.js +250 -0
  736. package/scripts/bongos/skill-preflight.js +361 -0
  737. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  738. package/scripts/bongos/smoke-batch-release.sh +316 -0
  739. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  740. package/scripts/bongos/smoke-dependencies.sh +143 -0
  741. package/scripts/bongos/smoke-gds.js +256 -0
  742. package/scripts/bongos/smoke-write.sh +275 -0
  743. package/scripts/bongos/source-text-test-scan.js +106 -0
  744. package/scripts/bongos/spark.js +294 -0
  745. package/scripts/bongos/stale-worktrees.js +212 -0
  746. package/scripts/bongos/start-goals.js +102 -0
  747. package/scripts/bongos/start.js +1090 -0
  748. package/scripts/bongos/status.js +545 -0
  749. package/scripts/bongos/strand-watch.js +315 -0
  750. package/scripts/bongos/stranded-rows.js +200 -0
  751. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  752. package/scripts/bongos/surface.js +101 -0
  753. package/scripts/bongos/task.js +273 -0
  754. package/scripts/bongos/test-path-guard.js +99 -0
  755. package/scripts/bongos/triage.js +742 -0
  756. package/scripts/bongos/turn-end-sound.js +74 -0
  757. package/scripts/bongos/tweak-halt.js +70 -0
  758. package/scripts/bongos/tweak-renders.js +200 -0
  759. package/scripts/bongos/uat.js +120 -0
  760. package/scripts/bongos/ui-kit-transform.js +43 -0
  761. package/scripts/bongos/update-channel.js +512 -0
  762. package/scripts/bongos/update-sweep.js +829 -0
  763. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  764. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  765. package/scripts/bongos/upgrade-migrate.js +224 -0
  766. package/scripts/bongos/upgrade-operator.js +73 -0
  767. package/scripts/bongos/upgrade-outcome.js +174 -0
  768. package/scripts/bongos/upgrade.js +1499 -0
  769. package/scripts/bongos/validate-design.js +12 -0
  770. package/scripts/bongos/version-close.js +621 -0
  771. package/scripts/bongos/version-literal-guard.js +140 -0
  772. package/scripts/bongos/version-select.js +79 -0
  773. package/scripts/bongos/visual-review-nudge.js +39 -0
  774. package/scripts/bongos/wedge-remedy.js +174 -0
  775. package/scripts/bongos/worktree-claim-guard.js +130 -0
  776. package/scripts/bongos/worktree.js +449 -0
  777. package/scripts/discord/post.js +1 -1
  778. package/scripts/gds/README.md +9 -0
  779. package/scripts/gds/abandon.js +6 -136
  780. package/scripts/gds/accessibility-replay.js +5 -194
  781. package/scripts/gds/address-park-sweep.sh +7 -90
  782. package/scripts/gds/adopt-detect.js +5 -121
  783. package/scripts/gds/adopt-import.js +5 -109
  784. package/scripts/gds/adopt-preflight.js +5 -185
  785. package/scripts/gds/adr-namespace.js +5 -271
  786. package/scripts/gds/agent-invoke.js +5 -687
  787. package/scripts/gds/agents-sync.js +5 -500
  788. package/scripts/gds/api-alias-caller-scan.js +5 -255
  789. package/scripts/gds/api-artifacts.js +6 -0
  790. package/scripts/gds/api.js +6 -85
  791. package/scripts/gds/api.ps1 +8 -26
  792. package/scripts/gds/architect-audit.js +6 -293
  793. package/scripts/gds/artifact-audit.js +5 -324
  794. package/scripts/gds/artifact-format.js +6 -203
  795. package/scripts/gds/artifact-staleness.js +5 -265
  796. package/scripts/gds/ask.js +5 -229
  797. package/scripts/gds/audit-authorship.sh +7 -328
  798. package/scripts/gds/audit-deps.js +6 -188
  799. package/scripts/gds/audit-gate.js +5 -119
  800. package/scripts/gds/audit-rank-roles.js +6 -171
  801. package/scripts/gds/audit-replay.sh +7 -204
  802. package/scripts/gds/autobongos-digest.js +5 -121
  803. package/scripts/gds/autobongos-grade-cap.js +5 -186
  804. package/scripts/gds/autobongos-loop.js +5 -208
  805. package/scripts/gds/autobongos-run.js +5 -1359
  806. package/scripts/gds/autobongos-service.cmd +8 -49
  807. package/scripts/gds/autobongos-service.ps1 +8 -270
  808. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  809. package/scripts/gds/autobongos-verify.js +5 -616
  810. package/scripts/gds/autonomy-gate.js +5 -133
  811. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  812. package/scripts/gds/autonomy-gauge.js +5 -82
  813. package/scripts/gds/backfill-cost.js +6 -175
  814. package/scripts/gds/backfill-disciplines.js +5 -142
  815. package/scripts/gds/backfill-session-earnings.js +5 -121
  816. package/scripts/gds/backfill-session-types.js +5 -85
  817. package/scripts/gds/backfill-sessions.js +5 -409
  818. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  819. package/scripts/gds/backfill-task-rewards.js +5 -411
  820. package/scripts/gds/backlog-review.js +6 -398
  821. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  822. package/scripts/gds/backup.js +6 -115
  823. package/scripts/gds/baseline-staleness.js +5 -215
  824. package/scripts/gds/bfg-principal-token.js +6 -64
  825. package/scripts/gds/bug-attachment-audit.js +5 -147
  826. package/scripts/gds/bug-attachment-recover.js +5 -196
  827. package/scripts/gds/bug-triage.js +6 -291
  828. package/scripts/gds/build-bongos.js +5 -92
  829. package/scripts/gds/bump-version.js +5 -219
  830. package/scripts/gds/capture.js +6 -480
  831. package/scripts/gds/category-advisory-guard.js +5 -205
  832. package/scripts/gds/ci-grade.js +6 -81
  833. package/scripts/gds/claim-recall.js +6 -111
  834. package/scripts/gds/claim.js +6 -788
  835. package/scripts/gds/classify-discipline.js +6 -152
  836. package/scripts/gds/claude-materialize.js +5 -1198
  837. package/scripts/gds/claude-md-template.js +5 -140
  838. package/scripts/gds/cleanup-orphans.js +6 -73
  839. package/scripts/gds/cli-lib.js +6 -1204
  840. package/scripts/gds/client-baseurl-guard.js +5 -114
  841. package/scripts/gds/codemod-rename-src-gds.js +6 -144
  842. package/scripts/gds/conductor-dispatch.js +6 -534
  843. package/scripts/gds/context-pack.js +6 -325
  844. package/scripts/gds/control-manifest.js +5 -197
  845. package/scripts/gds/copy-apply.js +5 -756
  846. package/scripts/gds/copy-inventory.js +5 -569
  847. package/scripts/gds/core-origin-follow.js +5 -184
  848. package/scripts/gds/core-pin-sync.js +5 -258
  849. package/scripts/gds/coreB-carve-proof.sh +7 -724
  850. package/scripts/gds/cost-report.js +6 -62
  851. package/scripts/gds/cost.js +6 -46
  852. package/scripts/gds/credential-presence.js +5 -294
  853. package/scripts/gds/cutover-codemod.js +5 -239
  854. package/scripts/gds/db-backup-nightly.sh +7 -231
  855. package/scripts/gds/db-backup-offsite.sh +7 -266
  856. package/scripts/gds/demote.js +6 -44
  857. package/scripts/gds/deploy-divergence.js +6 -445
  858. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  859. package/scripts/gds/design-sync.js +5 -10
  860. package/scripts/gds/dev-box-guard.js +5 -164
  861. package/scripts/gds/dev-lib.js +5 -721
  862. package/scripts/gds/dev.js +5 -643
  863. package/scripts/gds/device-flow-help.js +5 -70
  864. package/scripts/gds/diagnose-achievements.js +5 -116
  865. package/scripts/gds/diagram-facts.js +6 -355
  866. package/scripts/gds/discord-channels.js +5 -75
  867. package/scripts/gds/do-api.js +6 -109
  868. package/scripts/gds/doc-cli-guard.js +5 -266
  869. package/scripts/gds/doc-comment-coverage.js +5 -137
  870. package/scripts/gds/doc-control-claims.js +5 -166
  871. package/scripts/gds/docs-entropy.js +5 -443
  872. package/scripts/gds/doctor.js +6 -492
  873. package/scripts/gds/enroll-control-plane.js +5 -99
  874. package/scripts/gds/exec-path-guard.js +5 -562
  875. package/scripts/gds/feedback-send.js +5 -247
  876. package/scripts/gds/fetch-art-key.js +5 -104
  877. package/scripts/gds/fetch-sound-prefs.js +5 -124
  878. package/scripts/gds/figma-design-sync.js +5 -9
  879. package/scripts/gds/find-untested.js +5 -369
  880. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  881. package/scripts/gds/fitness-checks-identity.js +5 -342
  882. package/scripts/gds/fitness-checks-packaging.js +5 -131
  883. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  884. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  885. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  886. package/scripts/gds/fitness-lib.js +5 -126
  887. package/scripts/gds/fitness-migration-contraction.js +5 -49
  888. package/scripts/gds/fitness-ratchets.js +5 -563
  889. package/scripts/gds/fitness.js +5 -1493
  890. package/scripts/gds/gate-review.js +5 -328
  891. package/scripts/gds/gating.js +5 -346
  892. package/scripts/gds/gds-literal-scan.js +5 -194
  893. package/scripts/gds/gen-api-client.js +5 -555
  894. package/scripts/gds/gen-api-docs.js +5 -1100
  895. package/scripts/gds/gen-atlas.js +5 -364
  896. package/scripts/gds/gen-diagrams.js +6 -607
  897. package/scripts/gds/gen-file-map.js +5 -335
  898. package/scripts/gds/gen-freshness.js +5 -31
  899. package/scripts/gds/gen-interaction-posture.js +5 -120
  900. package/scripts/gds/gen-repo-map.js +5 -538
  901. package/scripts/gds/gen-role-responsibilities.js +5 -133
  902. package/scripts/gds/gen-session-index.js +5 -241
  903. package/scripts/gds/gen-sounds.js +5 -174
  904. package/scripts/gds/git-merge-regen.js +6 -291
  905. package/scripts/gds/go-live.js +5 -1069
  906. package/scripts/gds/goal-names.js +5 -100
  907. package/scripts/gds/goal.js +6 -271
  908. package/scripts/gds/government-walk.js +5 -1475
  909. package/scripts/gds/grade-correlation-audit.js +5 -308
  910. package/scripts/gds/grade-replay.js +5 -235
  911. package/scripts/gds/grade-smoke.js +6 -204
  912. package/scripts/gds/home-isolation-guard.js +5 -125
  913. package/scripts/gds/hooks/pre-push.js +5 -209
  914. package/scripts/gds/howto.js +5 -143
  915. package/scripts/gds/http-api-client.js +6 -81
  916. package/scripts/gds/identity-strip.js +5 -74
  917. package/scripts/gds/init.js +5 -1157
  918. package/scripts/gds/install-git-hooks.js +5 -198
  919. package/scripts/gds/instance-apex.js +5 -37
  920. package/scripts/gds/intent-retry.js +5 -51
  921. package/scripts/gds/key-card.js +6 -221
  922. package/scripts/gds/key-status.js +5 -124
  923. package/scripts/gds/land-watch.js +5 -199
  924. package/scripts/gds/leak-scan-allowlist.js +5 -291
  925. package/scripts/gds/learning-capture.js +6 -144
  926. package/scripts/gds/lib.sh +7 -73
  927. package/scripts/gds/linkify-refs.js +6 -654
  928. package/scripts/gds/lint-infra-exec.js +5 -68
  929. package/scripts/gds/lint-migrations.js +5 -100
  930. package/scripts/gds/lint-workflow-exec.js +5 -61
  931. package/scripts/gds/local-preview-lib.js +6 -128
  932. package/scripts/gds/local-preview.js +6 -81
  933. package/scripts/gds/login.js +5 -358
  934. package/scripts/gds/main-audit.js +5 -623
  935. package/scripts/gds/me.js +6 -96
  936. package/scripts/gds/memory-map.js +5 -174
  937. package/scripts/gds/merge-lock.js +6 -70
  938. package/scripts/gds/migration-namespace.js +5 -311
  939. package/scripts/gds/mirror-lineage-check.js +5 -341
  940. package/scripts/gds/mirror-redact.js +5 -348
  941. package/scripts/gds/module-artifact.js +6 -289
  942. package/scripts/gds/module-assess-docs.js +6 -237
  943. package/scripts/gds/module-assess-installs.js +6 -227
  944. package/scripts/gds/module-assess-score.js +6 -110
  945. package/scripts/gds/module-assess-security.js +6 -251
  946. package/scripts/gds/module-assess-tests.js +6 -277
  947. package/scripts/gds/module-assess-version.js +6 -91
  948. package/scripts/gds/module-error-report.js +5 -146
  949. package/scripts/gds/module-test-runner.js +6 -413
  950. package/scripts/gds/module.js +5 -1374
  951. package/scripts/gds/move-escalation.js +5 -140
  952. package/scripts/gds/newcomer-floor.js +6 -420
  953. package/scripts/gds/newcomer-floor.test.js +6 -234
  954. package/scripts/gds/next-number.js +6 -162
  955. package/scripts/gds/oauth-secret.js +5 -200
  956. package/scripts/gds/onboard.js +5 -265
  957. package/scripts/gds/onboarding-analyze.js +6 -225
  958. package/scripts/gds/onboarding-config.js +6 -179
  959. package/scripts/gds/onboarding-ship.js +6 -91
  960. package/scripts/gds/pack-env-prefix.js +5 -72
  961. package/scripts/gds/package-core.js +5 -1102
  962. package/scripts/gds/page-inventory.js +5 -346
  963. package/scripts/gds/page-reader.js +5 -720
  964. package/scripts/gds/paste-token.js +6 -211
  965. package/scripts/gds/plain-cards.js +5 -350
  966. package/scripts/gds/portability-smoke-art.sh +7 -84
  967. package/scripts/gds/portability-smoke-memory.sh +7 -175
  968. package/scripts/gds/preflight.js +5 -212
  969. package/scripts/gds/probe-cache.js +5 -244
  970. package/scripts/gds/prove-strict-versioning.js +6 -283
  971. package/scripts/gds/provision-auto-upgrade.js +5 -161
  972. package/scripts/gds/provision-byo-host.js +5 -67
  973. package/scripts/gds/provision-capacity.js +5 -78
  974. package/scripts/gds/provision-caps.js +5 -62
  975. package/scripts/gds/provision-config.js +5 -232
  976. package/scripts/gds/provision-core-upgrade.js +5 -1165
  977. package/scripts/gds/provision-disconnect.js +5 -87
  978. package/scripts/gds/provision-github-setup.js +5 -167
  979. package/scripts/gds/provision-net.js +5 -356
  980. package/scripts/gds/provision-pin-key.js +5 -175
  981. package/scripts/gds/provision-pin-replay.js +5 -125
  982. package/scripts/gds/provision-process.js +5 -169
  983. package/scripts/gds/provision-render.js +5 -200
  984. package/scripts/gds/provision-repo-auth.js +5 -163
  985. package/scripts/gds/provision-repo-private.js +5 -97
  986. package/scripts/gds/provision-repo.js +5 -1336
  987. package/scripts/gds/provision-teardown.js +5 -105
  988. package/scripts/gds/provision-units.js +5 -468
  989. package/scripts/gds/provision.js +5 -1477
  990. package/scripts/gds/publish-credential-check.js +6 -65
  991. package/scripts/gds/publish-integration-gate.js +5 -140
  992. package/scripts/gds/publish-manifest.js +5 -437
  993. package/scripts/gds/publish-watch.js +5 -266
  994. package/scripts/gds/pulse.js +6 -335
  995. package/scripts/gds/push-main.js +5 -54
  996. package/scripts/gds/push-path-brief.js +5 -98
  997. package/scripts/gds/read-session-export.js +5 -357
  998. package/scripts/gds/reauth.js +6 -154
  999. package/scripts/gds/recall.js +6 -182
  1000. package/scripts/gds/redteam-patrol.js +5 -435
  1001. package/scripts/gds/regen-instance-docs.js +5 -45
  1002. package/scripts/gds/release-core.js +5 -78
  1003. package/scripts/gds/release-notes.js +5 -270
  1004. package/scripts/gds/release.js +6 -138
  1005. package/scripts/gds/rename-goals.js +5 -107
  1006. package/scripts/gds/rename-history-check.js +5 -367
  1007. package/scripts/gds/rename-ledger-prose.js +5 -480
  1008. package/scripts/gds/render-api.js +5 -196
  1009. package/scripts/gds/render-check.js +5 -204
  1010. package/scripts/gds/render-ideas.js +6 -225
  1011. package/scripts/gds/render-payload.js +5 -84
  1012. package/scripts/gds/repo-metrics.js +6 -362
  1013. package/scripts/gds/review-sheet.js +5 -106
  1014. package/scripts/gds/role-pack-guard.js +5 -141
  1015. package/scripts/gds/route-shadow-guard.js +5 -173
  1016. package/scripts/gds/routine-schedule.js +5 -281
  1017. package/scripts/gds/run-routine.js +5 -255
  1018. package/scripts/gds/run-unit-tests.js +6 -659
  1019. package/scripts/gds/runner-drift.js +5 -149
  1020. package/scripts/gds/sandbox-stage.js +6 -458
  1021. package/scripts/gds/scope-map-guard.js +5 -299
  1022. package/scripts/gds/scope-roster-guard.js +5 -117
  1023. package/scripts/gds/seam-wiring-guard.js +5 -274
  1024. package/scripts/gds/search-ingest-db.js +6 -287
  1025. package/scripts/gds/search-ingest-md.js +6 -268
  1026. package/scripts/gds/seed-adopt-tasks.js +6 -74
  1027. package/scripts/gds/seed-api-contract-goal-tasks.js +6 -140
  1028. package/scripts/gds/seed-board-room-tasks.js +6 -196
  1029. package/scripts/gds/seed-bongos-app-tasks.js +6 -293
  1030. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +6 -80
  1031. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +6 -99
  1032. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +6 -306
  1033. package/scripts/gds/seed-bongos-module-system-tasks.js +6 -345
  1034. package/scripts/gds/seed-bongos-tasks.js +6 -213
  1035. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  1036. package/scripts/gds/seed-bongos-v1-seo-tasks.js +6 -104
  1037. package/scripts/gds/seed-bv1-community-tasks.js +6 -131
  1038. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +6 -133
  1039. package/scripts/gds/seed-bv1-profile-page-tasks.js +6 -161
  1040. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1041. package/scripts/gds/seed-bv1-r01-delta-tasks.js +6 -154
  1042. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1043. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +6 -277
  1044. package/scripts/gds/seed-gds-v4-tasks.js +6 -623
  1045. package/scripts/gds/seed-governance-tasks.js +6 -339
  1046. package/scripts/gds/seed-medusa-tasks.js +6 -439
  1047. package/scripts/gds/seed-module-upstreaming.js +5 -217
  1048. package/scripts/gds/seed-productization-tasks.js +6 -234
  1049. package/scripts/gds/seed-project-admin-console-tasks.js +6 -88
  1050. package/scripts/gds/seed-provisioning-tasks.js +6 -82
  1051. package/scripts/gds/seed-staging.sh +7 -116
  1052. package/scripts/gds/seed-strict-versioning-tasks.js +6 -274
  1053. package/scripts/gds/seed-v2-world-tasks.js +6 -282
  1054. package/scripts/gds/seed-verify-criteria.js +6 -124
  1055. package/scripts/gds/sequence.js +6 -596
  1056. package/scripts/gds/session-cost.js +6 -429
  1057. package/scripts/gds/session-digest-build.js +6 -293
  1058. package/scripts/gds/session-digest.js +6 -199
  1059. package/scripts/gds/session-eval.js +6 -630
  1060. package/scripts/gds/session-transcript-build.js +6 -155
  1061. package/scripts/gds/session-transcript-upload.js +6 -29
  1062. package/scripts/gds/session.js +6 -403
  1063. package/scripts/gds/setup.js +6 -645
  1064. package/scripts/gds/ship-check.js +5 -85
  1065. package/scripts/gds/ship-deploy-target.js +5 -392
  1066. package/scripts/gds/ship-escalation.js +5 -166
  1067. package/scripts/gds/ship-finish.js +5 -419
  1068. package/scripts/gds/ship-flow.js +5 -1216
  1069. package/scripts/gds/ship-git.js +5 -99
  1070. package/scripts/gds/ship-grade-steps.js +5 -546
  1071. package/scripts/gds/ship-grade.js +5 -425
  1072. package/scripts/gds/ship-honesty.js +5 -312
  1073. package/scripts/gds/ship-io.js +5 -138
  1074. package/scripts/gds/ship-land.js +5 -1129
  1075. package/scripts/gds/ship-memory-sync.js +5 -248
  1076. package/scripts/gds/ship-merge-gate.js +5 -224
  1077. package/scripts/gds/ship-merge.js +5 -465
  1078. package/scripts/gds/ship-mode-ask.js +5 -137
  1079. package/scripts/gds/ship-mode-manual.js +5 -53
  1080. package/scripts/gds/ship-preflight-steps.js +5 -398
  1081. package/scripts/gds/ship-regen.js +5 -313
  1082. package/scripts/gds/ship-resume.js +5 -200
  1083. package/scripts/gds/ship-session-upload.js +5 -312
  1084. package/scripts/gds/ship-state.js +5 -109
  1085. package/scripts/gds/ship-surprise.js +5 -83
  1086. package/scripts/gds/ship-visual.js +5 -74
  1087. package/scripts/gds/ship.js +5 -380
  1088. package/scripts/gds/shipping-mode.js +5 -69
  1089. package/scripts/gds/skill-lint.js +5 -248
  1090. package/scripts/gds/skill-preflight.js +5 -359
  1091. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1092. package/scripts/gds/smoke-batch-release.sh +7 -315
  1093. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1094. package/scripts/gds/smoke-dependencies.sh +7 -142
  1095. package/scripts/gds/smoke-gds.js +6 -255
  1096. package/scripts/gds/smoke-write.sh +7 -274
  1097. package/scripts/gds/source-text-test-scan.js +7 -0
  1098. package/scripts/gds/spark.js +6 -293
  1099. package/scripts/gds/stale-worktrees.js +5 -210
  1100. package/scripts/gds/start-goals.js +5 -101
  1101. package/scripts/gds/start.js +6 -1089
  1102. package/scripts/gds/status.js +6 -544
  1103. package/scripts/gds/strand-watch.js +5 -313
  1104. package/scripts/gds/stranded-rows.js +5 -198
  1105. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1106. package/scripts/gds/surface.js +5 -100
  1107. package/scripts/gds/task.js +6 -272
  1108. package/scripts/gds/test-path-guard.js +5 -97
  1109. package/scripts/gds/triage.js +6 -741
  1110. package/scripts/gds/turn-end-sound.js +5 -72
  1111. package/scripts/gds/tweak-halt.js +5 -68
  1112. package/scripts/gds/tweak-renders.js +5 -198
  1113. package/scripts/gds/uat.js +6 -119
  1114. package/scripts/gds/ui-kit-transform.js +5 -41
  1115. package/scripts/gds/update-channel.js +5 -510
  1116. package/scripts/gds/update-sweep.js +5 -827
  1117. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1118. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1119. package/scripts/gds/upgrade-migrate.js +5 -223
  1120. package/scripts/gds/upgrade-operator.js +6 -73
  1121. package/scripts/gds/upgrade-outcome.js +5 -173
  1122. package/scripts/gds/upgrade.js +5 -1497
  1123. package/scripts/gds/validate-design.js +5 -10
  1124. package/scripts/gds/version-close.js +6 -620
  1125. package/scripts/gds/version-literal-guard.js +5 -138
  1126. package/scripts/gds/version-select.js +5 -77
  1127. package/scripts/gds/visual-review-nudge.js +5 -38
  1128. package/scripts/gds/wedge-remedy.js +5 -173
  1129. package/scripts/gds/worktree-claim-guard.js +5 -129
  1130. package/scripts/gds/worktree.js +6 -448
  1131. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1132. package/scripts/hall-preview/server.js +2 -2
  1133. package/scripts/migrate.sh +3 -3
  1134. package/scripts/public-mirror-export.js +3 -3
  1135. package/scripts/setup-builder.js +7 -7
  1136. package/src/bongos/api-errors.js +1 -0
  1137. package/src/bongos/api-prefix.js +1 -1
  1138. package/src/bongos/auth-github.js +19 -3
  1139. package/src/bongos/auth-idp.js +7 -0
  1140. package/src/bongos/claim-attribution.js +2 -2
  1141. package/src/bongos/core-moves.js +1 -1
  1142. package/src/bongos/core-update.js +3 -3
  1143. package/src/bongos/craft-mode.js +2 -2
  1144. package/src/bongos/db-kernel.js +15 -3
  1145. package/src/bongos/db.js +30 -4
  1146. package/src/bongos/github-repos.js +1 -1
  1147. package/src/bongos/llm-cache.js +1 -1
  1148. package/src/bongos/llm-pricing.js +1 -1
  1149. package/src/bongos/metrics.js +1 -1
  1150. package/src/bongos/middleware/rate-limit.js +2 -2
  1151. package/src/bongos/module-listing.js +93 -1
  1152. package/src/bongos/module-scope-map.js +90 -85
  1153. package/src/bongos/module-store.js +1 -1
  1154. package/src/bongos/module-submissions.js +1 -1
  1155. package/src/bongos/optimizer.js +1 -1
  1156. package/src/bongos/package-registry.js +1 -1
  1157. package/src/bongos/path-match.js +1 -1
  1158. package/src/bongos/permission-path-check.js +3 -3
  1159. package/src/bongos/platform-visibility-gate.js +3 -5
  1160. package/src/bongos/prelaunch-gate.js +7 -6
  1161. package/src/bongos/route-rank-check.js +2 -2
  1162. package/src/bongos/routes/auth.js +15 -2
  1163. package/src/bongos/routes/backup.js +1 -1
  1164. package/src/bongos/routes/builders.js +29 -1
  1165. package/src/bongos/routes/me.js +49 -18
  1166. package/src/bongos/routes/modules.js +29 -9
  1167. package/src/bongos/routes/public.js +3 -72
  1168. package/src/bongos/schema-lag.js +1 -1
  1169. package/src/bongos/sensitive-surfaces.js +1 -1
  1170. package/src/bongos/serve-internal.js +65 -16
  1171. package/src/bongos/software-update.js +2 -2
  1172. package/src/bongos/upgrade-hold.js +3 -3
  1173. package/src/hall-look.js +6 -5
  1174. package/src/module-api.js +3 -3
  1175. package/src/module-loader/catalog.js +1 -1
  1176. package/src/module-loader/error-tally.js +3 -3
  1177. package/src/module-loader/manifest-schema.js +3 -3
  1178. package/src/platform-server.js +10 -0
  1179. package/src/role-responsibilities.js +1 -1
  1180. package/src/stale-timer.js +2 -2
  1181. package/tests/accessibility_replay.mjs +1 -1
  1182. package/tests/activity_rollup_order_db.mjs +1 -1
  1183. package/tests/activity_snapshots_db.mjs +1 -1
  1184. package/tests/adopt_detect.mjs +1 -1
  1185. package/tests/adopt_import.mjs +1 -1
  1186. package/tests/adopt_preflight.mjs +1 -1
  1187. package/tests/adr_0089_scope.mjs +10 -7
  1188. package/tests/adr_0162_citation.mjs +1 -1
  1189. package/tests/adr_0162_gate_citation.mjs +1 -1
  1190. package/tests/agent_invoke.mjs +1 -1
  1191. package/tests/agent_invoke_live.mjs +3 -3
  1192. package/tests/agents_cron_trigger.mjs +2 -2
  1193. package/tests/agents_roster.mjs +1 -1
  1194. package/tests/agents_sync.mjs +4 -4
  1195. package/tests/allow_rule_guard.mjs +20 -20
  1196. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1197. package/tests/api_alias_exceptions.mjs +7 -6
  1198. package/tests/api_artifacts.mjs +214 -0
  1199. package/tests/api_cli_flags.mjs +3 -3
  1200. package/tests/api_client.mjs +56 -54
  1201. package/tests/api_docs.mjs +30 -9
  1202. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1203. package/tests/api_msys_path_repair.mjs +2 -2
  1204. package/tests/architect.mjs +1 -1
  1205. package/tests/art_stage.mjs +2 -2
  1206. package/tests/artifact_audit.mjs +2 -2
  1207. package/tests/artifact_staleness.mjs +9 -9
  1208. package/tests/atlas.mjs +1 -1
  1209. package/tests/audit_deps.mjs +1 -1
  1210. package/tests/audit_gate.mjs +1 -1
  1211. package/tests/auth_flow_slice1.mjs +3 -3
  1212. package/tests/auth_inactive_builder.mjs +43 -5
  1213. package/tests/auth_session_expiry_db.mjs +16 -4
  1214. package/tests/auth_session_ttl.mjs +23 -0
  1215. package/tests/authorship_audit.mjs +2 -2
  1216. package/tests/autobongos_cadence.mjs +1 -1
  1217. package/tests/autobongos_fence.mjs +1 -1
  1218. package/tests/autobongos_grade_cap.mjs +2 -2
  1219. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1220. package/tests/autobongos_host_access.mjs +3 -3
  1221. package/tests/autobongos_loop.mjs +17 -17
  1222. package/tests/autobongos_service_ps1.mjs +3 -3
  1223. package/tests/autobongos_tweak_lane.mjs +2 -2
  1224. package/tests/autobongos_verify.mjs +2 -2
  1225. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1226. package/tests/autonomy_config_idle.mjs +1 -1
  1227. package/tests/autonomy_digest.mjs +1 -1
  1228. package/tests/autonomy_gate.mjs +1 -1
  1229. package/tests/autonomy_gauge.mjs +2 -2
  1230. package/tests/autonomy_runner_identity.mjs +1 -1
  1231. package/tests/backfill_sessions.mjs +8 -8
  1232. package/tests/backfill_subagent_rewards.mjs +1 -1
  1233. package/tests/backfill_task_rewards.mjs +2 -2
  1234. package/tests/backlog_review.mjs +3 -3
  1235. package/tests/baseline_staleness.mjs +2 -2
  1236. package/tests/bfg.mjs +11 -5
  1237. package/tests/bfg_write.mjs +20 -11
  1238. package/tests/blockers_hall.mjs +14 -4
  1239. package/tests/blockers_page_ui.mjs +56 -12
  1240. package/tests/bongos_dispatch.mjs +5 -5
  1241. package/tests/bongos_login.mjs +2 -2
  1242. package/tests/bug_attachment_audit.mjs +1 -1
  1243. package/tests/bug_attachment_recover.mjs +2 -2
  1244. package/tests/bug_triage.mjs +3 -3
  1245. package/tests/build_info.mjs +1 -1
  1246. package/tests/builder_tester_tag.mjs +184 -0
  1247. package/tests/bump_version.mjs +3 -3
  1248. package/tests/canonical_profile_url.mjs +1 -1
  1249. package/tests/capture_error_format.mjs +1 -1
  1250. package/tests/capture_goal_routing.mjs +2 -2
  1251. package/tests/category_advisory_guard.mjs +3 -3
  1252. package/tests/claim_error_surface.mjs +2 -2
  1253. package/tests/claim_from_task_and_home.mjs +1 -1
  1254. package/tests/claim_gate_open_blocker.mjs +7 -4
  1255. package/tests/claim_gate_rebase.mjs +12 -8
  1256. package/tests/claim_recall.mjs +4 -4
  1257. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1258. package/tests/claude_materialize.mjs +58 -58
  1259. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1260. package/tests/cli_allowlist_permissions.mjs +11 -11
  1261. package/tests/cli_dispatcher.mjs +2 -2
  1262. package/tests/cli_err_code.mjs +6 -6
  1263. package/tests/cli_exit_no_abort.mjs +7 -7
  1264. package/tests/cli_lib_formatters.mjs +2 -2
  1265. package/tests/cli_sessions.mjs +5 -5
  1266. package/tests/cli_surface.mjs +15 -15
  1267. package/tests/cli_token_reissue.mjs +2 -2
  1268. package/tests/client_baseurl_guard.mjs +1 -1
  1269. package/tests/client_bundle_route.mjs +35 -4
  1270. package/tests/cloud_bongos_pack.mjs +1 -1
  1271. package/tests/community_leaderboard_db.mjs +1 -1
  1272. package/tests/conductor.mjs +18 -18
  1273. package/tests/conflict_resolve.mjs +14 -16
  1274. package/tests/consumer_layout_boot.mjs +12 -12
  1275. package/tests/context_pack.mjs +6 -6
  1276. package/tests/control_manifest.mjs +4 -4
  1277. package/tests/copy_desk_page_reads.mjs +1 -1
  1278. package/tests/copy_desk_page_release.mjs +192 -0
  1279. package/tests/copy_inventory.mjs +2 -2
  1280. package/tests/core_auto_upgrade.mjs +1 -1
  1281. package/tests/core_move_notice.mjs +2 -2
  1282. package/tests/core_origin_follow.mjs +7 -7
  1283. package/tests/core_pin_sync.mjs +3 -3
  1284. package/tests/core_upgrade_door.mjs +2 -2
  1285. package/tests/core_upgrade_owner_door.mjs +34 -1
  1286. package/tests/core_upgrade_runner.mjs +19 -19
  1287. package/tests/credential_presence.mjs +2 -2
  1288. package/tests/credit_grant.mjs +3 -3
  1289. package/tests/credit_log_single_writer.mjs +5 -5
  1290. package/tests/criterion_ref_status.mjs +2 -2
  1291. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1292. package/tests/cutover_codemod.mjs +2 -4
  1293. package/tests/db_backup_nightly.mjs +1 -1
  1294. package/tests/db_backup_offsite.mjs +1 -1
  1295. package/tests/db_ownership_handover.mjs +2 -2
  1296. package/tests/dead_deps.mjs +3 -3
  1297. package/tests/dependency_advisory.mjs +1 -1
  1298. package/tests/deploy_audit_gate.mjs +4 -4
  1299. package/tests/deploy_divergence_line.mjs +36 -16
  1300. package/tests/deploy_page_projects.mjs +35 -4
  1301. package/tests/dev_lib.mjs +2 -2
  1302. package/tests/dev_windows.mjs +2 -2
  1303. package/tests/diagram_facts_offset.mjs +1 -1
  1304. package/tests/diagram_repo_slug.mjs +1 -1
  1305. package/tests/diff_derived_signals.mjs +2 -2
  1306. package/tests/dns_preflight.mjs +2 -2
  1307. package/tests/do_api.mjs +3 -3
  1308. package/tests/doc_cli_guard.mjs +28 -28
  1309. package/tests/doc_comment_coverage.mjs +1 -1
  1310. package/tests/doc_control_claims.mjs +11 -11
  1311. package/tests/docs_entropy.mjs +2 -2
  1312. package/tests/docs_openapi_route.mjs +8 -6
  1313. package/tests/doctor_hooks.mjs +1 -1
  1314. package/tests/edit_hints.mjs +3 -2
  1315. package/tests/effective_visibility_predicate.mjs +3 -3
  1316. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1317. package/tests/exec_path_guard.mjs +4 -4
  1318. package/tests/executed_closure.mjs +18 -12
  1319. package/tests/file_map.mjs +1 -1
  1320. package/tests/find_untested.mjs +13 -13
  1321. package/tests/first_admin_bootstrap.mjs +1 -1
  1322. package/tests/fitness.mjs +16 -16
  1323. package/tests/fitness_gds_ratchet.mjs +2 -2
  1324. package/tests/fitness_installed_core.mjs +3 -3
  1325. package/tests/fitness_no_raw_nul.mjs +1 -1
  1326. package/tests/fitness_ratchets.mjs +3 -3
  1327. package/tests/fitness_scope_roster.mjs +2 -2
  1328. package/tests/fitness_two_root.mjs +8 -8
  1329. package/tests/fixtures/accessibility-replay.json +5 -5
  1330. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1331. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1332. package/tests/fixtures/page-ledger.mjs +22 -0
  1333. package/tests/fixtures/session-506-digest.json +5 -5
  1334. package/tests/gate_approvals.mjs +50 -0
  1335. package/tests/gate_review.mjs +8 -8
  1336. package/tests/gating_review_retired.mjs +2 -2
  1337. package/tests/gen_freshness.mjs +3 -3
  1338. package/tests/git_guard.mjs +3 -3
  1339. package/tests/git_merge_regen.mjs +41 -65
  1340. package/tests/github_one_trip.mjs +4 -4
  1341. package/tests/github_pick_up.mjs +2 -2
  1342. package/tests/github_push_merge_driver.mjs +1 -1
  1343. package/tests/go_live.mjs +3 -2
  1344. package/tests/goal_category.mjs +1 -1
  1345. package/tests/goal_cli.mjs +2 -2
  1346. package/tests/goal_create_spec_entry.mjs +1 -1
  1347. package/tests/goal_invite_consent.mjs +3 -1
  1348. package/tests/goal_move.mjs +1 -1
  1349. package/tests/goal_names.mjs +2 -2
  1350. package/tests/goal_working_area.mjs +1 -1
  1351. package/tests/government_agent_asks.mjs +7 -7
  1352. package/tests/government_board_room_copy.mjs +6 -1
  1353. package/tests/government_board_view.mjs +39 -0
  1354. package/tests/government_board_vote_ui.mjs +39 -1
  1355. package/tests/government_config.mjs +2 -2
  1356. package/tests/government_live_proof_shape.mjs +1 -1
  1357. package/tests/government_protected_surfaces.mjs +54 -53
  1358. package/tests/government_require_permission.mjs +9 -1
  1359. package/tests/government_vanilla_boot.mjs +1 -1
  1360. package/tests/government_vocabulary.mjs +2 -2
  1361. package/tests/government_walk.mjs +2 -2
  1362. package/tests/grade_body_limit.mjs +6 -4
  1363. package/tests/grade_correlation_audit.mjs +3 -3
  1364. package/tests/grade_diff_hash.mjs +1 -1
  1365. package/tests/grade_engine_replay.mjs +2 -2
  1366. package/tests/grade_server_authoritative.mjs +1 -1
  1367. package/tests/grade_unavailable_display.mjs +1 -1
  1368. package/tests/grader.mjs +8 -24
  1369. package/tests/grader_generated_provenance.mjs +14 -14
  1370. package/tests/grader_no_artifact.mjs +1 -1
  1371. package/tests/grader_prompt_fencing.mjs +1 -1
  1372. package/tests/grader_quality_window_overflow.mjs +1 -1
  1373. package/tests/grader_reader_lens.mjs +3 -3
  1374. package/tests/grader_regrade_delta.mjs +1 -1
  1375. package/tests/grader_unbacked_score.mjs +2 -2
  1376. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1377. package/tests/hall_asset_cache.mjs +127 -0
  1378. package/tests/hall_audit.mjs +63 -0
  1379. package/tests/hall_board_world.mjs +20 -0
  1380. package/tests/hall_city_card_words.mjs +61 -0
  1381. package/tests/hall_client_request_shape.mjs +5 -1
  1382. package/tests/hall_home_ships_bounded.mjs +160 -0
  1383. package/tests/hall_landing_boot.mjs +15 -2
  1384. package/tests/hall_nav.mjs +33 -0
  1385. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1386. package/tests/hall_oversight_world.mjs +44 -4
  1387. package/tests/hall_palette.mjs +12 -9
  1388. package/tests/hall_preview_security.mjs +1 -1
  1389. package/tests/hall_profile_world.mjs +17 -0
  1390. package/tests/hall_reading_world.mjs +16 -1
  1391. package/tests/hall_roster_world.mjs +2 -1
  1392. package/tests/hall_studio_world.mjs +4 -1
  1393. package/tests/hall_work_history_id.mjs +39 -0
  1394. package/tests/held_tweak_reporting.mjs +4 -4
  1395. package/tests/helpers.mjs +3 -3
  1396. package/tests/home_bounded_reads.mjs +1 -1
  1397. package/tests/home_isolation_guard.mjs +1 -1
  1398. package/tests/hook_core_resolve.mjs +7 -7
  1399. package/tests/hook_user_agents.mjs +1 -1
  1400. package/tests/hooks_drain.mjs +2 -2
  1401. package/tests/host_topology_skips.mjs +1 -1
  1402. package/tests/howto_guide.mjs +1 -1
  1403. package/tests/howto_moments.mjs +3 -3
  1404. package/tests/hub_account_page.mjs +1 -1
  1405. package/tests/idea_capture_grades.mjs +2 -2
  1406. package/tests/idea_develop_spark.mjs +1 -1
  1407. package/tests/idea_filed_via.mjs +2 -2
  1408. package/tests/idea_ideate_full.mjs +1 -1
  1409. package/tests/idea_spark_mark.mjs +1 -1
  1410. package/tests/idea_spark_queue.mjs +1 -1
  1411. package/tests/idea_triage.mjs +1 -1
  1412. package/tests/idea_triage_grade.mjs +3 -3
  1413. package/tests/idea_vote_permission.mjs +113 -0
  1414. package/tests/idea_votes_fold_db.mjs +123 -0
  1415. package/tests/infra_exec_paths.mjs +12 -12
  1416. package/tests/init.mjs +2 -2
  1417. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1418. package/tests/instance_feedback.mjs +9 -9
  1419. package/tests/instance_mismatch_guard.mjs +2 -2
  1420. package/tests/integration_parked_ratchet.mjs +24 -2
  1421. package/tests/intent_retry.mjs +1 -1
  1422. package/tests/interaction_posture.mjs +3 -3
  1423. package/tests/invite_expiry_db.mjs +1 -1
  1424. package/tests/joinability_invite_only.mjs +1 -1
  1425. package/tests/karma_vote_lists.mjs +270 -0
  1426. package/tests/key-card.mjs +2 -2
  1427. package/tests/key-status.mjs +2 -2
  1428. package/tests/knip_ratchet_ambient.mjs +2 -2
  1429. package/tests/known_failing_ratchet.mjs +1 -1
  1430. package/tests/land_watch.mjs +2 -2
  1431. package/tests/landing_legal_pages.mjs +1 -1
  1432. package/tests/landing_page.mjs +2 -2
  1433. package/tests/leaderboard_roles.mjs +4 -1
  1434. package/tests/leak_scan_allowlist.mjs +8 -8
  1435. package/tests/leak_scan_fail_closed.mjs +1 -1
  1436. package/tests/lib_sh_resolution.mjs +9 -9
  1437. package/tests/lifecycle-card.mjs +7 -7
  1438. package/tests/linkify_check.mjs +2 -2
  1439. package/tests/linkify_refs.mjs +1 -1
  1440. package/tests/llm-cache-route.mjs +1 -1
  1441. package/tests/local_preview.mjs +2 -2
  1442. package/tests/main_audit.mjs +3 -3
  1443. package/tests/main_audit_attestation.mjs +1 -1
  1444. package/tests/main_audit_db_roster.mjs +2 -2
  1445. package/tests/main_worktree_busy_reason.mjs +3 -3
  1446. package/tests/markdown_line_endings.mjs +2 -2
  1447. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1448. package/tests/membership_kind_lockstep.mjs +1 -1
  1449. package/tests/memory_isolation.mjs +16 -8
  1450. package/tests/memory_map.mjs +2 -2
  1451. package/tests/memory_pull.mjs +33 -25
  1452. package/tests/merge_driver_register.mjs +3 -3
  1453. package/tests/migration_allocation.mjs +2 -2
  1454. package/tests/migration_namespace.mjs +1 -1
  1455. package/tests/migrations_forward_safe.mjs +1 -1
  1456. package/tests/mingle.mjs +1 -1
  1457. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1458. package/tests/mirror_lineage_proof.mjs +2 -2
  1459. package/tests/mirror_redact.mjs +4 -4
  1460. package/tests/missing_dep_classify.mjs +3 -3
  1461. package/tests/module-scope-map.mjs +22 -22
  1462. package/tests/module_api_lazy.mjs +1 -1
  1463. package/tests/module_assess_docs.mjs +2 -2
  1464. package/tests/module_assess_installs.mjs +3 -3
  1465. package/tests/module_assess_price_parity.mjs +5 -5
  1466. package/tests/module_assess_score.mjs +5 -5
  1467. package/tests/module_assess_security.mjs +4 -4
  1468. package/tests/module_assess_tests.mjs +3 -3
  1469. package/tests/module_assessments_migration.mjs +1 -1
  1470. package/tests/module_catalog.mjs +2 -2
  1471. package/tests/module_cli.mjs +3 -3
  1472. package/tests/module_entitlements.mjs +1 -1
  1473. package/tests/module_error_counts.mjs +1 -1
  1474. package/tests/module_install.mjs +4 -4
  1475. package/tests/module_loader.mjs +3 -1
  1476. package/tests/module_owned_tests.mjs +1 -1
  1477. package/tests/module_release_channels.mjs +1 -1
  1478. package/tests/module_store_howto.mjs +3 -3
  1479. package/tests/module_store_listing.mjs +139 -2
  1480. package/tests/module_store_publish.mjs +4 -4
  1481. package/tests/module_store_publish_route.mjs +1 -1
  1482. package/tests/module_store_reassess.mjs +1 -1
  1483. package/tests/module_store_registry_migration.mjs +1 -1
  1484. package/tests/module_test_runner.mjs +3 -3
  1485. package/tests/module_update.mjs +4 -4
  1486. package/tests/module_upgrade_updates.mjs +1 -1
  1487. package/tests/move_escalation.mjs +2 -2
  1488. package/tests/nav_permission_atoms.mjs +3 -2
  1489. package/tests/needs_rebase.mjs +7 -3
  1490. package/tests/newcomer_floor.mjs +1 -1
  1491. package/tests/newcomer_generator.mjs +48 -0
  1492. package/tests/next_number.mjs +1 -1
  1493. package/tests/no_artifact_escalation.mjs +3 -3
  1494. package/tests/npm_release_where.mjs +1 -1
  1495. package/tests/oauth_secret.mjs +2 -2
  1496. package/tests/onboard.mjs +6 -6
  1497. package/tests/onboarding_gate.mjs +2 -2
  1498. package/tests/opt_in_skill_modules.mjs +3 -3
  1499. package/tests/own_scope_guard.mjs +1 -1
  1500. package/tests/own_session_revoke.mjs +4 -1
  1501. package/tests/package_core.mjs +10 -11
  1502. package/tests/page_inventory.mjs +5 -5
  1503. package/tests/page_reader.mjs +7 -7
  1504. package/tests/page_tweak_hold.mjs +6 -6
  1505. package/tests/parallel-load.mjs +1 -1
  1506. package/tests/paste_token_api_base.mjs +1 -1
  1507. package/tests/paste_token_session_store.mjs +2 -2
  1508. package/tests/pending_invite_purge_db.mjs +1 -1
  1509. package/tests/permission_path.mjs +1 -1
  1510. package/tests/pin_replay.mjs +1 -1
  1511. package/tests/pin_write_key.mjs +7 -7
  1512. package/tests/plain_cards.mjs +15 -15
  1513. package/tests/pr_assign.mjs +1 -1
  1514. package/tests/pre_push_hook.mjs +3 -3
  1515. package/tests/preflight_checks.mjs +2 -2
  1516. package/tests/prelaunch_gate.mjs +1 -1
  1517. package/tests/privacy_matrix.mjs +1 -1
  1518. package/tests/probe_cache.mjs +6 -6
  1519. package/tests/profile_connections_ui.mjs +4 -3
  1520. package/tests/profile_fields.mjs +11 -1
  1521. package/tests/profile_privacy_owner_view.mjs +1 -1
  1522. package/tests/profile_role_headline.mjs +10 -9
  1523. package/tests/project_admin_console_model.mjs +1 -1
  1524. package/tests/projects_hub.mjs +1 -1
  1525. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1526. package/tests/promote_goal_id.mjs +6 -6
  1527. package/tests/promotion_sweep.mjs +1 -1
  1528. package/tests/provision.mjs +24 -24
  1529. package/tests/provision_account_identity.mjs +2 -2
  1530. package/tests/provision_byo_host.mjs +1 -1
  1531. package/tests/provision_caddy_wiring.mjs +2 -2
  1532. package/tests/provision_disconnect.mjs +2 -2
  1533. package/tests/provision_dns_first.mjs +1 -1
  1534. package/tests/provision_render.mjs +9 -9
  1535. package/tests/provision_repo_private.mjs +3 -3
  1536. package/tests/provision_resource_caps.mjs +5 -5
  1537. package/tests/provision_restart.mjs +3 -3
  1538. package/tests/provision_settings_apply.mjs +7 -7
  1539. package/tests/provision_teardown_address.mjs +2 -2
  1540. package/tests/provisioning_capacity.mjs +5 -5
  1541. package/tests/provisioning_credential_preflight.mjs +1 -1
  1542. package/tests/provisioning_disconnect.mjs +1 -1
  1543. package/tests/provisioning_error_note_scope.mjs +4 -4
  1544. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1545. package/tests/provisioning_planet_physics.mjs +16 -0
  1546. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1547. package/tests/provisioning_settings_env.mjs +1 -1
  1548. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1549. package/tests/public_mirror_export.mjs +1 -1
  1550. package/tests/publish_integration_gate.mjs +2 -2
  1551. package/tests/publish_manifest.mjs +6 -6
  1552. package/tests/publish_watch.mjs +1 -1
  1553. package/tests/push_path_brief.mjs +2 -2
  1554. package/tests/raise.mjs +248 -0
  1555. package/tests/rank_roles_audit.mjs +1 -1
  1556. package/tests/rank_tier_single_source.mjs +2 -2
  1557. package/tests/rate_limit_public.mjs +1 -1
  1558. package/tests/read_default_meter.mjs +2 -2
  1559. package/tests/read_session_export.mjs +1 -1
  1560. package/tests/rebase_gate_set_aside.mjs +1 -1
  1561. package/tests/recall_cli.mjs +1 -1
  1562. package/tests/recall_corpus_health.mjs +3 -2
  1563. package/tests/recall_hints.mjs +1 -1
  1564. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1565. package/tests/redteam_patrol.mjs +2 -2
  1566. package/tests/regrade_actual_minutes.mjs +2 -2
  1567. package/tests/regrade_eligibility.mjs +2 -2
  1568. package/tests/release_core.mjs +2 -2
  1569. package/tests/release_notes.mjs +4 -4
  1570. package/tests/rename_history_restraint.mjs +3 -3
  1571. package/tests/rename_ledger_prose.mjs +6 -6
  1572. package/tests/render_api.mjs +1 -1
  1573. package/tests/render_check.mjs +4 -4
  1574. package/tests/render_deploy.mjs +1 -1
  1575. package/tests/repo_info_binding.mjs +1 -1
  1576. package/tests/repo_map.mjs +5 -5
  1577. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1578. package/tests/reward_mode_surfacing.mjs +1 -1
  1579. package/tests/role_responsibilities.mjs +1 -1
  1580. package/tests/route_permission_check.mjs +1 -1
  1581. package/tests/route_shadow_guard.mjs +1 -1
  1582. package/tests/route_validation.mjs +1 -1
  1583. package/tests/routine_capture_kind.mjs +6 -6
  1584. package/tests/routine_schedule.mjs +9 -9
  1585. package/tests/run_routine.mjs +5 -5
  1586. package/tests/run_routine_two_root.mjs +5 -5
  1587. package/tests/runner_drift.mjs +17 -17
  1588. package/tests/sandbox_stage.mjs +5 -5
  1589. package/tests/scope_map_guard.mjs +7 -7
  1590. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1591. package/tests/scripts_gds_forwarders.mjs +224 -0
  1592. package/tests/scrubber_corpus.mjs +2 -2
  1593. package/tests/seam_wiring_guard.mjs +1 -1
  1594. package/tests/search_ingest.mjs +2 -2
  1595. package/tests/search_ingest_db.mjs +1 -1
  1596. package/tests/search_ingest_nul.mjs +6 -6
  1597. package/tests/seed_verify_criteria.mjs +3 -3
  1598. package/tests/sequence.mjs +3 -3
  1599. package/tests/served_paths_shipped.mjs +3 -3
  1600. package/tests/session_506_regression.mjs +1 -1
  1601. package/tests/session_accessibility.mjs +1 -1
  1602. package/tests/session_caps.mjs +1 -1
  1603. package/tests/session_cost.mjs +1 -1
  1604. package/tests/session_digest.mjs +2 -2
  1605. package/tests/session_eval.mjs +6 -6
  1606. package/tests/session_index.mjs +1 -1
  1607. package/tests/session_records.mjs +4 -4
  1608. package/tests/session_rename_fallback.mjs +2 -2
  1609. package/tests/session_reward_on_land.mjs +7 -149
  1610. package/tests/session_reward_on_land_db.mjs +191 -0
  1611. package/tests/session_reward_reconcile.mjs +6 -88
  1612. package/tests/session_reward_reconcile_db.mjs +132 -0
  1613. package/tests/session_transcript.mjs +1 -1
  1614. package/tests/sessions_kit_pager.mjs +2 -1
  1615. package/tests/setup_device_flow_fallback.mjs +2 -2
  1616. package/tests/setup_smoke.mjs +12 -5
  1617. package/tests/setup_status_facts.mjs +54 -12
  1618. package/tests/ship_autolinkify.mjs +2 -2
  1619. package/tests/ship_automerge_injection.mjs +1 -1
  1620. package/tests/ship_base_flag.mjs +1 -1
  1621. package/tests/ship_broadcast_routing.mjs +1 -1
  1622. package/tests/ship_broadcast_server.mjs +2 -2
  1623. package/tests/ship_builder_model.mjs +1 -1
  1624. package/tests/ship_cannot_lie.mjs +9 -9
  1625. package/tests/ship_card.mjs +2 -2
  1626. package/tests/ship_ci_deploy.mjs +7 -7
  1627. package/tests/ship_error_shape.mjs +1 -1
  1628. package/tests/ship_land_ci_not_started.mjs +3 -3
  1629. package/tests/ship_land_conflict.mjs +3 -3
  1630. package/tests/ship_land_proof.mjs +3 -3
  1631. package/tests/ship_land_red_pr.mjs +5 -5
  1632. package/tests/ship_merge_gate.mjs +14 -14
  1633. package/tests/ship_mode.mjs +1 -1
  1634. package/tests/ship_mode_first_ship.mjs +4 -4
  1635. package/tests/ship_mode_hands_off.mjs +8 -8
  1636. package/tests/ship_post_land_verify.mjs +1 -1
  1637. package/tests/ship_preflight.mjs +19 -19
  1638. package/tests/ship_premerge.mjs +1 -1
  1639. package/tests/ship_publish_error.mjs +2 -2
  1640. package/tests/ship_push_diagnosis.mjs +1 -1
  1641. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1642. package/tests/ship_resume.mjs +4 -4
  1643. package/tests/ship_smoke_gate.mjs +1 -1
  1644. package/tests/ship_upload_skip.mjs +1 -1
  1645. package/tests/ship_upstream_deletion.mjs +1 -1
  1646. package/tests/ship_vendored_instance.mjs +8 -8
  1647. package/tests/ship_visual_regrade.mjs +3 -3
  1648. package/tests/ship_zero_commit.mjs +1 -1
  1649. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1650. package/tests/skill_friction_kind.mjs +1 -1
  1651. package/tests/skill_grade_recover.mjs +1 -1
  1652. package/tests/skill_grader_health.mjs +1 -1
  1653. package/tests/skill_lint.mjs +1 -1
  1654. package/tests/skill_menu_ruling.mjs +1 -1
  1655. package/tests/skill_preflight.mjs +7 -7
  1656. package/tests/skip_is_not_pass.mjs +22 -1
  1657. package/tests/smoke_dependencies_witness.mjs +2 -2
  1658. package/tests/smoke_preflight.mjs +1 -1
  1659. package/tests/smoke_target.mjs +2 -2
  1660. package/tests/smoke_write_contract.mjs +2 -2
  1661. package/tests/sound_player.mjs +8 -8
  1662. package/tests/source_text_test_ratchet.mjs +97 -0
  1663. package/tests/speciality_corpus_scope.mjs +1 -1
  1664. package/tests/speciality_session_skills.mjs +1 -1
  1665. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1666. package/tests/stale_timer.mjs +3 -3
  1667. package/tests/stale_worktrees.mjs +1 -1
  1668. package/tests/start_env_guard.mjs +1 -1
  1669. package/tests/start_goal_first.mjs +3 -3
  1670. package/tests/start_inbox_count.mjs +1 -1
  1671. package/tests/start_rebase_warning.mjs +1 -1
  1672. package/tests/status_default_version.mjs +3 -3
  1673. package/tests/status_mirror_sync.mjs +1 -1
  1674. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1675. package/tests/stop_refcheck.mjs +1 -1
  1676. package/tests/strand_watch.mjs +1 -1
  1677. package/tests/stranded_rows.mjs +1 -1
  1678. package/tests/stuck_detector.mjs +14 -14
  1679. package/tests/sweep_app_account.mjs +3 -3
  1680. package/tests/task_cli.mjs +2 -2
  1681. package/tests/task_detail_ui.mjs +11 -1
  1682. package/tests/task_discipline_required.mjs +2 -2
  1683. package/tests/task_list_paging.mjs +1 -1
  1684. package/tests/task_visual_slots.mjs +2 -2
  1685. package/tests/terms_acceptance.mjs +1 -1
  1686. package/tests/terms_grandfather_db.mjs +1 -1
  1687. package/tests/test_path_guard.mjs +1 -1
  1688. package/tests/triage_development.mjs +1 -1
  1689. package/tests/tweak_batch_apply.mjs +2 -2
  1690. package/tests/tweak_land_heal.mjs +3 -3
  1691. package/tests/tweak_unattended.mjs +3 -3
  1692. package/tests/ui_design_skills.mjs +2 -2
  1693. package/tests/unit_report_status.mjs +2 -2
  1694. package/tests/unit_runner_serial.mjs +2 -2
  1695. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1696. package/tests/update_channel.mjs +2 -2
  1697. package/tests/update_channel_db.mjs +4 -4
  1698. package/tests/update_subscription_engine.mjs +26 -26
  1699. package/tests/update_sweep_home.mjs +14 -14
  1700. package/tests/upgrade.mjs +11 -11
  1701. package/tests/upgrade_artist_gate.mjs +4 -4
  1702. package/tests/upgrade_commit_identity.mjs +2 -2
  1703. package/tests/upgrade_migrate.mjs +7 -7
  1704. package/tests/upgrade_operator.mjs +2 -2
  1705. package/tests/upgrade_outcome.mjs +2 -2
  1706. package/tests/upgrade_persist_pin.mjs +5 -5
  1707. package/tests/upkeep_home.mjs +1 -1
  1708. package/tests/version_close.mjs +2 -2
  1709. package/tests/version_close_cli.mjs +2 -2
  1710. package/tests/version_close_route.mjs +1 -1
  1711. package/tests/version_literals.mjs +23 -23
  1712. package/tests/visual_review.mjs +5 -5
  1713. package/tests/wedge_remedy.mjs +5 -5
  1714. package/tests/welcome_boot.mjs +116 -0
  1715. package/tests/welcome_boot_browser.mjs +271 -0
  1716. package/tests/wizard_born_first_board.mjs +3 -3
  1717. package/tests/wizard_demo.mjs +1 -1
  1718. package/tests/wizard_one_page.mjs +4 -3
  1719. package/tests/wizard_physics.mjs +3 -1
  1720. package/tests/wizard_physics_more.mjs +42 -3
  1721. package/tests/work_title_wrap.mjs +1 -1
  1722. package/tests/workflow_exec_paths.mjs +6 -6
  1723. package/tests/worktree_claim_guard.mjs +1 -1
  1724. package/tests/worktree_helper.mjs +2 -2
  1725. package/tests/write_validation_gaps.mjs +3 -3
  1726. package/scripts/gds/api.sh +0 -6
  1727. package/scripts/gds/audit-exports.js +0 -128
  1728. package/scripts/gds/resolve-skill-model.js +0 -57
  1729. package/scripts/gds/security-baseline-check.sh +0 -180
  1730. package/scripts/gds/spike-task-map.js +0 -899
  1731. package/scripts/status-probe.mjs +0 -213
  1732. package/src/bongos/uptime-poller.js +0 -93
  1733. package/tests/government_fold_bench.mjs +0 -50
  1734. package/tests/spike_task_map.mjs +0 -422
  1735. package/tests/status-probe.mjs +0 -89
  1736. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1737. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1738. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1739. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -0,0 +1,1376 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ //
4
+ // scripts/bongos/module.js — `bongos module new <key>` (scaffolder) + `bongos upgrade`
5
+ // (coreVersion pre-check). BONGOS-V1 · BV1.R50 · task 1419 (ADR 0083 / design 04§2).
6
+ //
7
+ // Two halves of "operating the module system from the terminal":
8
+ //
9
+ // bongos module new <key>
10
+ // Scaffolds modules/<key>/ — a VALID, loader-discoverable module.json (M03),
11
+ // the dir skeleton (routes/, migrations/, ui/), a sample route factory, a
12
+ // HOWTO.md template for the store page (ADR 0347), and a nested CLAUDE.md — with NO edit to any core file. The loader
13
+ // (src/module-loader/loader.js) discovers it; enabling it (config/modules.json
14
+ // or env) mounts its routes behind the kernel's auth — the strangler endgame
15
+ // where adding a feature is "drop a directory," not "edit routes.js + modules.js".
16
+ //
17
+ // bongos upgrade
18
+ // A fail-closed pre-flight: every ENABLED discovered module declares the
19
+ // src/module-api.js CORE_VERSION range (`coreVersion`) it supports. This
20
+ // reports each module's compatibility and REFUSES (exit 1) if an enabled
21
+ // module no longer satisfies the current core — the loud, ahead-of-time
22
+ // version of the loader's silent coreVersion SKIP (which would just drop the
23
+ // module at boot). Disabled mismatches are warnings, not blockers.
24
+ //
25
+ // bongos module list [--catalog] [--search <q>] [--json]
26
+ // ADR 0107 §2/§3 (task 1001772) — the BROWSABLE CATALOG from the terminal:
27
+ // every module this instance can enable, each with its author + origin
28
+ // credit, its enabled state, and who maintains it. `--catalog` narrows to
29
+ // the CORE-shipped modules (the shared catalog an instance opts into, §6);
30
+ // without it you also see the instance's own modules. It renders the same
31
+ // model as the hall's Modules tab (src/module-loader/catalog.js), so the two
32
+ // surfaces cannot disagree about who built what.
33
+ //
34
+ // bongos module check <key>
35
+ // ADR 0107 §4 — the submit-time pre-check a module must clear before it can
36
+ // be upstreamed into the shared core catalog. REUSES (never re-types) the
37
+ // public-mirror publish boundary (scripts/bongos/publish-manifest.js): every
38
+ // file the module carries is classified as if it already lived at its
39
+ // canonical modules/<key>/ location, and anything the DENYLIST forbids
40
+ // (game content, pixel art, copyrighted reference material, instance
41
+ // secrets, deploy/CI topology) fails the check with a clear reason — this
42
+ // is deliberately the DENY half only, not the full isPublishable() gate,
43
+ // because a brand-new module is never on the ALLOWLIST until it is
44
+ // accepted (§6); that omission must not read as "denied content." Also
45
+ // requires the manifest to declare an AGPL-3.0 license (inbound = outbound,
46
+ // ADR 0107 §4 — no CLA) and a `maintenance` posture (ADR 0107 §7 / ADR
47
+ // 0166 — core-maintained, or maintained by a named maintainer; a module
48
+ // already deprecated/orphaned cannot be submitted INTO the catalog).
49
+ // On a pass, `--sign-off "Name <email>"` records a
50
+ // lightweight DCO-style affirmation (own work, licensed AGPL-3.0 — never a
51
+ // copyright-assignment CLA) to modules/<key>/.upstream-signoff.json.
52
+ //
53
+ // This is build tooling (scripts/), so — unlike a module — it may freely require
54
+ // the core (src/*). It makes NO API/network calls: it is pure local fs + config
55
+ // resolution, so it runs anywhere (a box, CI, a laptop) with no GDS session.
56
+ //
57
+ // Usage:
58
+ // bongos module new <key> scaffold modules/<key>/
59
+ // bongos module new <key> --force overwrite an existing modules/<key>/
60
+ // bongos module list [--catalog] browse the module catalog (author + origin credit)
61
+ // bongos upgrade [--no-store] pre-check enabled modules vs the core version + list store updates
62
+ // bongos module check <key> [--sign-off "Name <email>"] AGPL/publish pre-check + DCO sign-off
63
+ // bongos module install <key> [--version X.Y.Z] acquire from the store, verify, place (not enabled)
64
+ // bongos module update <key> [--version X.Y.Z] move an installed store module forward
65
+
66
+ const fs = require('node:fs');
67
+ const path = require('node:path');
68
+
69
+ const REPO_ROOT = path.resolve(__dirname, '..', '..');
70
+ const MODULES_DIR = path.join(REPO_ROOT, 'modules');
71
+
72
+ const { validateManifest, assertValidManifest, KEY_RE, SUNSET_STATUSES } = require('../../src/module-loader/manifest-schema');
73
+ const { parseVersion, cmp } = require('../../src/module-loader/semver');
74
+ const loader = require('../../src/module-loader/loader');
75
+ const catalog = require('../../src/module-loader/catalog');
76
+ const { resolveModules, MODULE_REGISTRY, NEUTRAL_PATH, INSTANCE_PATH } = require('../../src/modules');
77
+ // The public-mirror publish boundary (ADR 0098) — REUSED, never re-typed, for
78
+ // the ADR 0107 §4 upstreaming pre-check. Only matchesDeny is used (not the full
79
+ // isPublishable), because a brand-new module is never on the ALLOWLIST until
80
+ // accepted (§6) — gating on the allowlist here would reject every legitimate
81
+ // new module. The denylist is the copyright/content classification we want.
82
+ const { matchesDeny } = require('./publish-manifest');
83
+
84
+ // CORE_VERSION via the doorway, lazily + fail-soft (mirrors loader.coreVersion):
85
+ // requiring src/module-api pulls auth/pool, so a tooling context with no DB still
86
+ // resolves to the known initial version rather than crashing.
87
+ function coreVersion() {
88
+ try { return require('../../src/module-api').CORE_VERSION; }
89
+ catch { return '1.0.0'; }
90
+ }
91
+
92
+ function readJson(p) {
93
+ try { return JSON.parse(fs.readFileSync(p, 'utf8')); }
94
+ catch (e) { if (e.code === 'ENOENT') return null; throw e; }
95
+ }
96
+
97
+ // A text file's contents, or null when it does not exist.
98
+ function readText(p) {
99
+ try { return fs.readFileSync(p, 'utf8'); }
100
+ catch (e) { if (e.code === 'ENOENT') return null; throw e; }
101
+ }
102
+
103
+ function envPrefix() {
104
+ const { FALLBACK_ENV_PREFIX } = require('../../src/instance-config');
105
+ try { return require('../../src/branding').branding().envPrefix || FALLBACK_ENV_PREFIX; }
106
+ catch { return FALLBACK_ENV_PREFIX; }
107
+ }
108
+
109
+ // ---------------------------------------------------------------------------
110
+ // Pure builders (exported for tests — no I/O, no network)
111
+ // ---------------------------------------------------------------------------
112
+
113
+ // art-pipeline -> "Art Pipeline"; economy -> "Economy". A readable default title.
114
+ function titleize(key) {
115
+ return String(key).split(/[-_]+/).filter(Boolean)
116
+ .map((w) => w[0].toUpperCase() + w.slice(1)).join(' ');
117
+ }
118
+ // art-pipeline -> artPipeline (for the generated route-factory function name).
119
+ function camel(key) {
120
+ return String(key).replace(/[-_]+(.)/g, (_, c) => c.toUpperCase());
121
+ }
122
+
123
+ // The minimal-but-valid manifest a fresh module starts from. coreVersion is a
124
+ // caret on the CURRENT core, so the module supports this core + its future
125
+ // minors; it declares one sample route so the scaffold mounts something real.
126
+ // The four attribution fields (ADR 0107 §2) are stamped as TODO placeholders —
127
+ // non-empty so they self-validate — so authorship travels with the module from
128
+ // the start rather than being an afterthought bolted on at upstream-submit time.
129
+ // `license` defaults to the core's own license (AGPL-3.0, ADR 0065) since
130
+ // inbound = outbound is the project's default posture; override if different.
131
+ function buildManifest(key, { core = coreVersion() } = {}) {
132
+ return {
133
+ key,
134
+ title: titleize(key),
135
+ description: `TODO: one sentence describing the ${key} module.`,
136
+ // The module's own version (task 1003781). A fresh scaffold is pre-release.
137
+ version: '0.1.0',
138
+ coreVersion: `^${core}`,
139
+ default: false,
140
+ author: 'TODO: your name or builder handle',
141
+ origin: 'TODO: the instance/project this module was built in',
142
+ license: 'AGPL-3.0',
143
+ maintainer: 'TODO: who to credit/contact if this module is upstreamed',
144
+ // Upkeep posture (ADR 0107 §7 / ADR 0166). Scaffolded as `maintained`
145
+ // because a brand-new module's author IS its maintainer — the honest
146
+ // default. Change it to `core-maintained` only if the core team has agreed
147
+ // to own it, and to `deprecated`/`orphaned` (with a path) when that changes.
148
+ maintenance: { status: 'maintained' },
149
+ contributes: { routes: [key] },
150
+ };
151
+ }
152
+
153
+ function routeTemplate(key) {
154
+ const fn = `${camel(key)}Routes`;
155
+ return `// modules/${key}/routes/${key}.js — sample route factory for the "${key}" module.
156
+ //
157
+ // A route factory is \`() => express.Router()\`. The loader (src/module-loader)
158
+ // mounts it behind the kernel's auth + audit when this module is enabled — you
159
+ // never edit the core to add a route. Reach core capabilities ONLY through the
160
+ // published doorway src/module-api.js; never deep-import core internals or a
161
+ // sibling module (the one-way rule, ADR 0083).
162
+ 'use strict';
163
+
164
+ const express = require('express');
165
+ const api = require('../../../src/module-api');
166
+
167
+ module.exports = function ${fn}() {
168
+ const router = express.Router();
169
+
170
+ // Read routes need no rank gate. EVERY write route MUST be rank-gated — list
171
+ // every rank allowed; ('metic', 'archon') means Metic-and-above, e.g.:
172
+ // router.post('/${key}/thing', api.requireRank('metic', 'archon'), (req, res) => { ... });
173
+ // the BV1.R44 fitness check fails the build on an ungated module write route.
174
+ router.get('/${key}/health', (req, res) => {
175
+ res.json({ module: '${key}', ok: true, coreVersion: api.CORE_VERSION });
176
+ });
177
+
178
+ return router;
179
+ };
180
+ `;
181
+ }
182
+
183
+ function claudeMdTemplate(key, manifest) {
184
+ const ENVKEY = key.toUpperCase().replace(/-/g, '_');
185
+ return `# ${manifest.title} module (\`modules/${key}/\`)
186
+
187
+ > A Cloud Bongos feature module. It contributes routes / rooms / migrations / UI
188
+ > to the host **only** through its \`module.json\` manifest + the published doorway
189
+ > \`src/module-api.js\`. The core never imports it; it never imports core internals
190
+ > or a sibling module (the one-way rule, ADR 0083).
191
+
192
+ ## Manifest (\`module.json\`)
193
+ - \`key\` — must equal this directory name (\`${key}\`).
194
+ - \`coreVersion\` — the \`src/module-api.js\` CORE_VERSION range this module supports.
195
+ \`bongos upgrade\` refuses to advance the core if an enabled module no longer
196
+ satisfies it; the loader silently skips a mismatched module at boot.
197
+ - \`contributes\` — what mounts: \`routes\`, \`rooms\`, \`pollers\`, \`disciplines\`,
198
+ \`skills\`, \`uiSections\`, \`migrations\`. An empty \`{}\` is valid (mounts nothing).
199
+ - \`default\` — fail-safe enablement when no config names the module (keep \`false\`).
200
+ - \`author\` / \`origin\` / \`license\` / \`maintainer\` — attribution (ADR 0107 §2).
201
+ Optional but scaffolded as TODOs — fill them in now so credit travels with the
202
+ module if it's ever upstreamed to core. Portable metadata, not a cross-GDS link.
203
+
204
+ ## Enable it
205
+ This module is OFF until an instance turns it on, via \`config/modules.json\`
206
+ (\`{ "modules": { "${key}": true } }\`) or env (\`<PREFIX>_MODULE_${ENVKEY}=1\`). The
207
+ loader then discovers and mounts it — no core edit.
208
+
209
+ ## Add a route
210
+ \`contributes.routes: ["${key}"]\` → \`routes/${key}.js\` exports \`() => express.Router()\`.
211
+ Gate every write route with \`api.requireRank('metic', 'archon')\` (Metic-and-above —
212
+ list every allowed rank; BV1.R44 enforces this).
213
+
214
+ ## Add a migration
215
+ Put \`NNN_*.sql\` under \`migrations/\` and set \`contributes.migrations: true\`
216
+ (BV1.R46). Own only your \`${key}_*\` tables.
217
+
218
+ ## The one-way rule
219
+ \`require('../../../src/module-api')\` — the doorway — is the ONLY core import
220
+ allowed. No deep core imports, no sibling-module imports; cooperate through
221
+ kernel seams (\`api.registerProvider\` / \`api.resolve\` / \`api.on\` / \`api.emit\`).
222
+
223
+ ## The how-to (\`HOWTO.md\`)
224
+ This CLAUDE.md is for AI sessions working *inside* the module. \`HOWTO.md\` is for the
225
+ person who installs it — the store shows it as the module's page (ADR 0347). It is
226
+ plain Markdown, so any AI or person can write it. \`bongos module publish\` refuses
227
+ the module until each of its five sections has some text; replace the prompts in
228
+ \`<!-- -->\` with real answers. An optional \`howto.artifactUrl\` in module.json can
229
+ link a Claude page as an extra — never instead of the file.
230
+ `;
231
+ }
232
+
233
+ // The HOWTO.md a fresh module starts from (ADR 0347 D2): every required section as a
234
+ // heading, with its prompt in an HTML comment. checkHowto strips comments, so an
235
+ // untouched scaffold fails the publish gate until the author writes each section.
236
+ function howtoTemplate(key, manifest) {
237
+ const { HOWTO_SECTIONS } = require('./module-artifact');
238
+ const prompts = {
239
+ 'What it does': 'A few sentences: what this module adds, and who it is for.',
240
+ 'Install and enable': `How to get it (\`bongos module install ${key}\`) and switch it on (hall Modules tab).`,
241
+ 'How to use it': 'Its commands, routes and hall surfaces, with one worked example.',
242
+ 'Configuration': 'Env vars and settings, with their defaults. "None." is a fine answer.',
243
+ 'Limits and known issues': 'What it does not do, and anything known to go wrong. "None known." is a fine answer.',
244
+ };
245
+ const sections = HOWTO_SECTIONS.map((name) => `## ${name}\n\n<!-- ${prompts[name]} -->\n`).join('\n');
246
+ return `# ${manifest.title} — how to use it
247
+
248
+ <!-- Written for the person who installs this module, or for any AI helping them.
249
+ The store shows this file as the module's page. Every section below must have
250
+ some text before \`bongos module publish\` will accept the module (ADR 0347). -->
251
+
252
+ ${sections}`;
253
+ }
254
+
255
+ // Has the core advanced past a deprecated module's declared removal version?
256
+ // `removeAfter: "1.12.0"` means "may be deleted once core is ABOVE 1.12.0".
257
+ function isPastRemoveAfter(maintenance, core) {
258
+ const after = maintenance && maintenance.removeAfter;
259
+ const a = parseVersion(after);
260
+ const c = parseVersion(core);
261
+ return !!(a && c && cmp(c, a) > 0);
262
+ }
263
+
264
+ // One line of "who do I chase about this?" for a row, from its maintenance block
265
+ // (ADR 0166). Shared by cmdUpgrade and upgrade.js's real-bump pre-flight so both
266
+ // surfaces say the same thing about the same module.
267
+ function formatMaintenanceHint(row = {}) {
268
+ const m = row.maintenance;
269
+ if (!m || !m.status) {
270
+ return 'no maintenance declared — nobody is on the hook for this module (ADR 0166: declare a `maintenance` block)';
271
+ }
272
+ const parts = [`maintenance: ${m.status}`];
273
+ if (m.status === 'maintained') parts.push(`maintainer ${row.maintainer || '(unnamed!)'}`);
274
+ if (m.status === 'core-maintained') parts.push('core-maintained — fixing this is the core\'s job');
275
+ if (m.successor) parts.push(`superseded by "${m.successor}"`);
276
+ if (m.removeAfter) parts.push(`removable after core ${m.removeAfter}`);
277
+ if (m.note) parts.push(m.note);
278
+ return parts.join('; ');
279
+ }
280
+
281
+ // Decide compatibility from rows (pure — tests drive it with injected rows).
282
+ // A row: { key, coreVersion, enabled, satisfied, maintenance?, maintainer? }.
283
+ //
284
+ // BLOCKING = an enabled module that does not satisfy the core (fail-closed).
285
+ // WARNINGS = a DISABLED mismatch. These are not cosmetic: an accepted catalog
286
+ // module ships `default: false` (ADR 0107 §6), so EVERY rotted catalog entry
287
+ // lands in this bucket. Dropping warnings on the floor is exactly how "the
288
+ // catalog fills with silently-broken entries" happens (ADR 0107 §7) — every
289
+ // caller must surface them, even though none of them block.
290
+ // DEPRECATIONS = modules whose own manifest says they are on the way out;
291
+ // EXPIRED = deprecated modules the core has already advanced past `removeAfter`
292
+ // (they are due for deletion, not just a label).
293
+ function evaluateUpgrade({ rows = [], errors = [], core } = {}) {
294
+ const blocking = rows.filter((r) => r.enabled && !r.satisfied);
295
+ const warnings = rows.filter((r) => !r.enabled && !r.satisfied);
296
+ const deprecations = rows.filter((r) => r.maintenance && SUNSET_STATUSES.includes(r.maintenance.status));
297
+ const expired = deprecations.filter((r) => isPastRemoveAfter(r.maintenance, core));
298
+ const undeclared = rows.filter((r) => !r.maintenance || !r.maintenance.status);
299
+ return { ok: blocking.length === 0, blocking, warnings, deprecations, expired, undeclared, rows, errors, core };
300
+ }
301
+
302
+ // ---------------------------------------------------------------------------
303
+ // Scaffolder (fs)
304
+ // ---------------------------------------------------------------------------
305
+
306
+ function scaffoldModule({ key, modulesDir = MODULES_DIR, core = coreVersion(), force = false } = {}) {
307
+ if (!key || !KEY_RE.test(key)) {
308
+ throw new Error(`invalid module key "${key}" — must match ${KEY_RE} (lowercase kebab-case, e.g. "art-pipeline")`);
309
+ }
310
+ const dir = path.join(modulesDir, key);
311
+ if (fs.existsSync(dir) && !force) {
312
+ throw new Error(`${path.relative(REPO_ROOT, dir)} already exists — use --force to overwrite, or pick another key.`);
313
+ }
314
+ const manifest = buildManifest(key, { core });
315
+ // self-check: a scaffolder that emits an INVALID manifest is a bug, not a typo.
316
+ assertValidManifest(manifest, `generated modules/${key}/module.json`);
317
+
318
+ const files = {
319
+ 'module.json': JSON.stringify(manifest, null, 2) + '\n',
320
+ [`routes/${key}.js`]: routeTemplate(key),
321
+ 'CLAUDE.md': claudeMdTemplate(key, manifest),
322
+ 'HOWTO.md': howtoTemplate(key, manifest),
323
+ // git does not track empty dirs — keep the rest of the skeleton with placeholders.
324
+ 'migrations/.gitkeep': '',
325
+ 'ui/.gitkeep': '',
326
+ };
327
+ for (const [relp, content] of Object.entries(files)) {
328
+ const fp = path.join(dir, relp);
329
+ fs.mkdirSync(path.dirname(fp), { recursive: true });
330
+ fs.writeFileSync(fp, content);
331
+ }
332
+ return { dir, files: Object.keys(files), manifest };
333
+ }
334
+
335
+ // Gather the live compatibility state from disk + config (the I/O half of upgrade).
336
+ function gatherUpgrade({ modulesDir = MODULES_DIR, core = coreVersion(), env = process.env, neutral, instance, prefix } = {}) {
337
+ neutral = neutral || readJson(NEUTRAL_PATH) || {};
338
+ instance = instance || readJson(INSTANCE_PATH) || {};
339
+ prefix = prefix || envPrefix();
340
+
341
+ const { loaded, skipped, errors } = loader.discoverModules({ roots: [modulesDir], core });
342
+ // the loader drops skipped manifests; re-read them so we can show coreVersion + default.
343
+ const skippedFull = skipped.map((s) => {
344
+ let manifest = null;
345
+ try { manifest = JSON.parse(fs.readFileSync(path.join(s.dir, 'module.json'), 'utf8')); } catch { /* gone/garbled */ }
346
+ return { ...s, manifest };
347
+ });
348
+
349
+ // resolveModules throws on an unknown key, so the registry MUST span every
350
+ // discovered key (loaded + skipped) — built-in entries plus a synthesized
351
+ // {default} for each discovered module.
352
+ const registry = { ...MODULE_REGISTRY };
353
+ for (const { key, manifest } of loaded) {
354
+ if (!(key in registry)) registry[key] = { default: manifest.default === true, contributes: manifest.contributes || {} };
355
+ }
356
+ for (const { key, manifest } of skippedFull) {
357
+ if (key && !(key in registry)) registry[key] = { default: manifest && manifest.default === true, contributes: (manifest && manifest.contributes) || {} };
358
+ }
359
+
360
+ let enabled = {};
361
+ try { enabled = resolveModules({ neutral, instance, env, envPrefix: prefix, registry }); }
362
+ catch { /* a malformed config shouldn't crash the pre-check; treat all as disabled */ }
363
+
364
+ // Maintenance posture travels with the row (ADR 0166) so both the pre-check
365
+ // printout and the real bump can say WHO owns a module that no longer fits —
366
+ // an incompatibility with no owner named is the orphaning failure itself.
367
+ const upkeep = (manifest) => ({
368
+ maintenance: (manifest && manifest.maintenance) || null,
369
+ maintainer: (manifest && manifest.maintainer) || null,
370
+ });
371
+
372
+ const rows = [];
373
+ for (const { key, manifest } of loaded) {
374
+ rows.push({ key, version: manifest.version || null, coreVersion: manifest.coreVersion, enabled: enabled[key] === true, satisfied: true, ...upkeep(manifest) });
375
+ }
376
+ for (const { key, manifest, reason } of skippedFull) {
377
+ rows.push({ key, version: (manifest && manifest.version) || null, coreVersion: manifest ? manifest.coreVersion : null, enabled: enabled[key] === true, satisfied: false, reason, ...upkeep(manifest) });
378
+ }
379
+ rows.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
380
+ return { rows, errors, core };
381
+ }
382
+
383
+ // ---------------------------------------------------------------------------
384
+ // bongos module list — ADR 0107 §2/§3 the browsable catalog (task 1001772)
385
+ // ---------------------------------------------------------------------------
386
+
387
+ // The live catalog off disk + config. Unlike gatherUpgrade (which scans ONE
388
+ // modulesDir because it is answering a question about this checkout's own
389
+ // modules), this uses the loader's DEFAULT roots so a split instance sees both
390
+ // trees — the core package's modules/ AND its own (ADR 0108 §1). That two-root
391
+ // scan is what makes "core-shipped vs. built here" a structural fact here
392
+ // rather than a guess.
393
+ function gatherCatalog({ roots, core = coreVersion(), env = process.env, neutral, instance, prefix } = {}) {
394
+ neutral = neutral || readJson(NEUTRAL_PATH) || {};
395
+ instance = instance || readJson(INSTANCE_PATH) || {};
396
+ prefix = prefix || envPrefix();
397
+
398
+ const { loaded, skipped, errors } = loader.discoverModules(roots ? { roots, core } : { core });
399
+
400
+ // Same registry-spanning rule as gatherUpgrade: resolveModules throws on an
401
+ // unknown key, so every discovered key must be in the registry it is given.
402
+ const registry = { ...MODULE_REGISTRY };
403
+ for (const { key, manifest } of loaded) {
404
+ if (!(key in registry)) registry[key] = { default: manifest.default === true, contributes: manifest.contributes || {} };
405
+ }
406
+ for (const { key } of skipped) {
407
+ if (key && !(key in registry)) registry[key] = { default: false, contributes: {} };
408
+ }
409
+
410
+ let enabled = {};
411
+ try { enabled = resolveModules({ neutral, instance, env, envPrefix: prefix, registry }); }
412
+ catch { /* a malformed config must not blank the catalog — show it all as disabled */ }
413
+
414
+ const { coreRoot, instanceRoot, coreCheckout } = catalog.detectRoots();
415
+ const rows = catalog.buildCatalog({
416
+ loaded, enabled, coreRoot, instanceRoot, coreCheckout, ownProjectName: ownProjectName(),
417
+ });
418
+ return { rows, skipped, errors, core };
419
+ }
420
+
421
+ // The instance's own product name, for the credit axis (deriveProvenance).
422
+ // Fail-soft: no brand pack resolvable → null, which makes provenance fall back
423
+ // to "own-built" rather than guessing (provenance.js's documented behaviour).
424
+ function ownProjectName() {
425
+ try { return require('../../src/branding').branding().identity.productName; } catch { return null; }
426
+ }
427
+
428
+ function pad(s, n) { return String(s == null ? '' : s).padEnd(n); }
429
+ function clip(s, n) {
430
+ const v = String(s == null ? '' : s);
431
+ return v.length > n ? `${v.slice(0, n - 1)}…` : v;
432
+ }
433
+
434
+ // Pure renderer — every input arrives as a parameter (the tests pass catalog
435
+ // rows straight in), so it touches no disk and no config.
436
+ function formatCatalog(rows, { catalogOnly = false, query = '', core = null, delisted = new Set() } = {}) {
437
+ const scoped = catalogOnly ? catalog.catalogRows(rows) : rows;
438
+ const shown = catalog.searchCatalog(scoped, query);
439
+ const counts = catalog.summarize(rows);
440
+ const out = [];
441
+
442
+ out.push(catalogOnly
443
+ ? 'bongos module list --catalog — core modules this instance can enable (ADR 0107 §6: opt-in, default-off)'
444
+ : 'bongos module list — every module on disk, with author + origin credit (ADR 0107 §2)');
445
+ if (core) out.push(` core (src/module-api.js CORE_VERSION): ${core}`);
446
+ out.push(` ${counts.catalog} in the core catalog (${counts.catalog_enabled} enabled) · ${counts.instance} built here · ${counts.total} total`);
447
+ if (query) out.push(` filter "${query}" — ${shown.length} match(es)`);
448
+ out.push('');
449
+
450
+ if (!shown.length) {
451
+ out.push(query ? ' no module matches that filter.' : ' no modules discovered.');
452
+ return out.join('\n');
453
+ }
454
+
455
+ out.push(` ${pad('', 5)}${pad('KEY', 20)}${pad('VERSION', 9)}${pad('SOURCE', 10)}${pad('CATEGORY', 28)}${pad('AUTHOR', 20)}${pad('ORIGIN', 26)}${pad('LICENSE', 12)}UPKEEP`);
456
+ for (const r of shown) {
457
+ const mark = r.enabled ? '[x]' : '[ ]';
458
+ // An inferred credit is marked so it never reads as something the author
459
+ // typed — the catalog's whole job is honest attribution (ADR 0107 §2).
460
+ const suffix = r.credit.inferred ? '*' : '';
461
+ const upkeep = ((r.maintenance && r.maintenance.status) || 'undeclared') + (delisted.has(r.key) ? ' · DELISTED' : '');
462
+ // The parent key, plus the sub-category once one is approved (ADR 0342).
463
+ const cat = r.category ? r.category.parent + (r.category.sub ? `/${r.category.sub}` : '') : '—';
464
+ out.push(` ${pad(mark, 5)}${pad(clip(r.key, 19), 20)}${pad(clip(r.version || '—', 8), 9)}${pad(r.source, 10)}${pad(clip(cat, 27), 28)}${pad(clip((r.credit.author || '—') + suffix, 19), 20)}${pad(clip((r.credit.origin || '—') + suffix, 25), 26)}${pad(clip(r.license || '—', 11), 12)}${upkeep}`);
465
+ }
466
+ out.push('');
467
+ out.push(' [x] enabled here · [ ] available, not enabled');
468
+ if (shown.some((r) => delisted.has(r.key))) {
469
+ out.push(' DELISTED = taken out of the store: your copy keeps working, but no more versions will come.');
470
+ }
471
+ if (shown.some((r) => r.credit.inferred)) {
472
+ out.push(` * credit not declared in module.json — shown as the platform (${catalog.CORE_PROJECT_NAME}), which ships it.`);
473
+ }
474
+ out.push(' enable one: add it to config/modules.json, or use the hall\'s Modules tab (Metic+).');
475
+ return out.join('\n');
476
+ }
477
+
478
+ // Which installed store modules the store has delisted (task 1003797). Only modules
479
+ // built into this instance's tree can be store installs, so a core checkout asks
480
+ // nothing. Fail-soft like the upgrade check: offline, or no session, lists as before.
481
+ async function gatherDelisted(rows, { checkStore = gatherUpdates } = {}) {
482
+ const held = rows.filter((r) => r.source === 'instance');
483
+ if (!held.length) return new Set();
484
+ const found = await checkStore(held);
485
+ if (!found.checked) return new Set();
486
+ return new Set(Object.keys(found.latest).filter((k) => found.latest[k] && found.latest[k].status === 'delisted'));
487
+ }
488
+
489
+ async function cmdList(args, { log = console.log, errlog = console.error, gather = gatherCatalog, checkStore = gatherUpdates } = {}) {
490
+ const catalogOnly = args.includes('--catalog');
491
+ const json = args.includes('--json');
492
+ const sIdx = args.indexOf('--search');
493
+ const query = sIdx !== -1 ? (args[sIdx + 1] || '') : '';
494
+ if (sIdx !== -1 && (!args[sIdx + 1] || args[sIdx + 1].startsWith('--'))) {
495
+ errlog('usage: bongos module list [--catalog] [--search <text>] [--json]');
496
+ return 2;
497
+ }
498
+
499
+ let data;
500
+ try { data = gather(); }
501
+ catch (e) { errlog(`bongos module list: ${e.message}`); return 1; }
502
+
503
+ const delisted = await gatherDelisted(data.rows, { checkStore });
504
+
505
+ if (json) {
506
+ const scoped = catalogOnly ? catalog.catalogRows(data.rows) : data.rows;
507
+ const modules = catalog.searchCatalog(scoped, query).map((m) => ({ ...m, store_delisted: delisted.has(m.key) }));
508
+ log(JSON.stringify({ core: data.core, summary: catalog.summarize(data.rows), modules }, null, 2));
509
+ return 0;
510
+ }
511
+
512
+ log(formatCatalog(data.rows, { catalogOnly, query, core: data.core, delisted }));
513
+ for (const s of data.skipped) {
514
+ errlog(` ! ${s.key}: not listed — ${s.reason}`);
515
+ }
516
+ for (const e of data.errors) errlog(` ! ${e.dir}: ${(e.errors || []).join('; ')}`);
517
+ return 0;
518
+ }
519
+
520
+ // ---------------------------------------------------------------------------
521
+ // bongos module check <key> — ADR 0107 §4 upstreaming pre-check + DCO sign-off
522
+ // ---------------------------------------------------------------------------
523
+
524
+ // The DCO-style affirmation recorded on a pass. Deliberately NOT a
525
+ // copyright-assignment CLA (ADR 0065 rejects relicensing-as-capture; ADR 0107
526
+ // §4 "inbound = outbound") — the contributor affirms and RETAINS copyright.
527
+ const DCO_STATEMENT =
528
+ 'I affirm that this contribution is my own original work, or that I have the right to ' +
529
+ 'submit it, and that I license it under AGPL-3.0. This is a Developer Certificate of ' +
530
+ 'Origin-style affirmation, not a copyright-assignment CLA — I retain my copyright.';
531
+
532
+ // Recursively list files under dir (skip VCS/dependency noise no module should ship).
533
+ function listModuleFiles(dir) {
534
+ const out = [];
535
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
536
+ if (entry.name === 'node_modules' || entry.name === '.git') continue;
537
+ const full = path.join(dir, entry.name);
538
+ if (entry.isDirectory()) out.push(...listModuleFiles(full));
539
+ else out.push(full);
540
+ }
541
+ return out;
542
+ }
543
+
544
+ // Pure(ish) — reads modules/<key>/ off disk, no network. Returns
545
+ // { key, ok, findings[], files[] }. findings are { kind, detail } — kind is
546
+ // 'manifest' | 'license' | 'content'.
547
+ function checkModulePublishability(key, { modulesDir = MODULES_DIR } = {}) {
548
+ const dir = path.join(modulesDir, key);
549
+ if (!fs.existsSync(dir)) {
550
+ throw new Error(`modules/${key} does not exist under ${path.relative(REPO_ROOT, modulesDir) || '.'}`);
551
+ }
552
+
553
+ const findings = [];
554
+ const manifestRaw = readJson(path.join(dir, 'module.json'));
555
+ if (!manifestRaw) {
556
+ findings.push({ kind: 'manifest', detail: 'module.json missing or unreadable' });
557
+ } else {
558
+ const { valid, errors } = validateManifest(manifestRaw);
559
+ if (!valid) findings.push({ kind: 'manifest', detail: `module.json invalid: ${errors.join('; ')}` });
560
+ const license = manifestRaw.license;
561
+ if (!license || !/^AGPL-3\.0/.test(license)) {
562
+ findings.push({
563
+ kind: 'license',
564
+ detail: `module.json license is ${license ? JSON.stringify(license) : 'unset'} — upstreaming requires ` +
565
+ 'AGPL-3.0 (inbound = outbound, ADR 0107 §4)',
566
+ });
567
+ }
568
+
569
+ // ADR 0107 §7 / ADR 0166 — the maintenance gate. Acceptance into the shared
570
+ // catalog is a commitment to keep the module true as the core advances, so
571
+ // the module must SAY who is committing before it can be filed for review.
572
+ // The shape is already schema-validated above (a `maintained` module must
573
+ // name a maintainer; a sunset one must state its path); what this adds is
574
+ // that the block cannot simply be absent. Refusing here — at submit time —
575
+ // is what keeps the catalog from filling with entries nobody owns.
576
+ const maint = manifestRaw.maintenance;
577
+ if (!maint || !maint.status) {
578
+ findings.push({
579
+ kind: 'maintenance',
580
+ detail: 'module.json declares no `maintenance.status` — an upstreamed module must state its upkeep ' +
581
+ 'posture (ADR 0107 §7): "core-maintained" (the core team owns it) or "maintained" with a named ' +
582
+ '`maintainer`. A module nobody owns rots silently as the core advances.',
583
+ });
584
+ } else if (SUNSET_STATUSES.includes(maint.status)) {
585
+ findings.push({
586
+ kind: 'maintenance',
587
+ detail: `module.json declares maintenance.status "${maint.status}" — a module already on its way out ` +
588
+ 'cannot be submitted INTO the catalog. Upstream a maintained module, or its successor.',
589
+ });
590
+ }
591
+ }
592
+
593
+ // Classify every file AS IF it already lived at its canonical modules/<key>/
594
+ // path — this is what makes the check hermetically testable against a temp
595
+ // modulesDir while still reusing the REAL repo-wide denylist.
596
+ const files = listModuleFiles(dir)
597
+ .map((abs) => `modules/${key}/${path.relative(dir, abs).split(path.sep).join('/')}`)
598
+ .sort();
599
+ const denied = files.filter((f) => matchesDeny(f));
600
+ if (denied.length) {
601
+ findings.push({
602
+ kind: 'content',
603
+ detail: 'contains content the AGPL core publish boundary denies (game content, pixel art, ' +
604
+ `copyrighted reference material, or instance/topology secrets): ${denied.join(', ')}`,
605
+ });
606
+ }
607
+
608
+ return { key, ok: findings.length === 0, findings, files, denied };
609
+ }
610
+
611
+ // Records the sign-off ONLY once the content/license check has passed —
612
+ // there is nothing to affirm over rejected content.
613
+ function recordSignOff(key, signedBy, { modulesDir = MODULES_DIR } = {}) {
614
+ const dir = path.join(modulesDir, key);
615
+ const now = new Date().toISOString();
616
+ const record = { module: key, checkedAt: now, statement: DCO_STATEMENT, signOff: { signedBy, date: now } };
617
+ const file = path.join(dir, '.upstream-signoff.json');
618
+ fs.writeFileSync(file, JSON.stringify(record, null, 2) + '\n');
619
+ return { ...record, path: path.relative(REPO_ROOT, file) };
620
+ }
621
+
622
+ // Reads a previously-recorded sign-off (recordSignOff above), or null if the
623
+ // module has never been signed off. Never throws on a missing/garbled file —
624
+ // "no sign-off yet" is the expected common case, not an error.
625
+ function readSignOff(key, { modulesDir = MODULES_DIR } = {}) {
626
+ return readJson(path.join(modulesDir, key, '.upstream-signoff.json'));
627
+ }
628
+
629
+ // ---------------------------------------------------------------------------
630
+ // bongos module submit <key> — ADR 0107 §1 upstreaming submission
631
+ // ---------------------------------------------------------------------------
632
+
633
+ // Packages a module for the upstreaming queue: its manifest + a full file
634
+ // snapshot (base64, so binary assets round-trip identically) + whatever
635
+ // sign-off is on disk. Pure fs read — no pre-check, no network; the caller
636
+ // (cmdSubmit locally, the POST /modules/:key/submit route server-side) is
637
+ // responsible for having already run checkModulePublishability() and for
638
+ // deciding whether a missing sign-off is fatal.
639
+ function packageModuleForSubmission(key, { modulesDir = MODULES_DIR } = {}) {
640
+ const dir = path.join(modulesDir, key);
641
+ const manifest = readJson(path.join(dir, 'module.json'));
642
+ if (!manifest) throw new Error(`modules/${key}/module.json missing or unreadable`);
643
+ let totalBytes = 0;
644
+ const files = listModuleFiles(dir)
645
+ .map((abs) => {
646
+ const rel = path.relative(dir, abs).split(path.sep).join('/');
647
+ const buf = fs.readFileSync(abs);
648
+ totalBytes += buf.length;
649
+ return { path: rel, contentBase64: buf.toString('base64'), bytes: buf.length };
650
+ })
651
+ .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
652
+ const signOff = readSignOff(key, { modulesDir });
653
+ return { key, manifest, files, totalBytes, signOff };
654
+ }
655
+
656
+ // ---------------------------------------------------------------------------
657
+ // Commands
658
+ // ---------------------------------------------------------------------------
659
+
660
+ function cmdNew(args, { log = console.log, errlog = console.error } = {}) {
661
+ const key = args.find((a) => !a.startsWith('-'));
662
+ const force = args.includes('--force');
663
+ if (!key) {
664
+ errlog('usage: bongos module new <key> (e.g. bongos module new economy)');
665
+ return 2;
666
+ }
667
+ let res;
668
+ try { res = scaffoldModule({ key, force }); }
669
+ catch (e) { errlog(`bongos module new: ${e.message}`); return 1; }
670
+
671
+ log(`Scaffolded module "${key}" at modules/${key}/ (no core edit needed):`);
672
+ for (const f of res.files) log(` ✓ modules/${key}/${f}`);
673
+ const ENVKEY = key.toUpperCase().replace(/-/g, '_');
674
+ log('\nNext:');
675
+ log(` • describe it — edit modules/${key}/module.json (title + description)`);
676
+ log(` • credit it — fill in author/origin/maintainer in module.json (license defaults to AGPL-3.0)`);
677
+ log(` • enable it — add "${key}": true to config/modules.json (or set <PREFIX>_MODULE_${ENVKEY}=1)`);
678
+ log(` • build it — fill routes/${key}.js; add migrations/ + ui/ (see modules/${key}/CLAUDE.md)`);
679
+ log(` • explain it — fill in every section of modules/${key}/HOWTO.md (publish refuses it until you do)`);
680
+ log(' • verify — bongos upgrade (checks coreVersion compatibility)');
681
+ return 0;
682
+ }
683
+
684
+ // ---------------------------------------------------------------------------
685
+ // Available module updates — the store half of `bongos upgrade` (task 1003787)
686
+ // ---------------------------------------------------------------------------
687
+
688
+ // Ask the store for the newest version of every module here that carries an exact
689
+ // version (the I/O half). A key the store does not know is absent from the answer,
690
+ // so a module built here, or one the core ships, simply has nothing to report.
691
+ // Never throws: no session or an unreachable store comes back as
692
+ // { checked: false, reason }, because the compatibility pre-check must work
693
+ // offline and must never fail on the store's account.
694
+ async function gatherUpdates(rows, { request } = {}) {
695
+ const keys = rows.filter((r) => r.version && parseVersion(String(r.version))).map((r) => r.key);
696
+ if (!keys.length) return { checked: true, latest: {} };
697
+ let call;
698
+ try { call = request || storeRequest(); }
699
+ catch (e) { return { checked: false, reason: e.message }; }
700
+ let res;
701
+ try { res = await call('GET', `/store/modules/latest?keys=${keys.map(encodeURIComponent).join(',')}`); }
702
+ catch (e) { return { checked: false, reason: `the store could not be reached — ${e.message}` }; }
703
+ // A 404 here is a server whose core predates this route, not a missing module.
704
+ if (res.status === 404) return { checked: false, reason: "this server's store does not answer update checks yet (its core is older)" };
705
+ if (!res.ok) return { checked: false, reason: `the store answered ${storeError(res)}` };
706
+ return { checked: true, latest: (res.data && res.data.latest) || {} };
707
+ }
708
+
709
+ // Decide what is stale from rows + the store's answer (pure — tests drive it).
710
+ // UPDATES = a module whose store version is newer than the one installed; `fits`
711
+ // says whether that newer version can mount on this core (when it cannot, the
712
+ // update waits for the core — it is not something to run now). DELISTED = an
713
+ // installed module the store has delisted: it keeps working, but no further
714
+ // versions will come (ADR 0338 D2). Neither ever blocks — an update is news, and
715
+ // what blocks `bongos upgrade` is still only an incompatible ENABLED module.
716
+ function evaluateUpdates(rows = [], latest = {}, core) {
717
+ const { satisfies } = require('../../src/module-loader/semver');
718
+ const updates = [];
719
+ const delisted = [];
720
+ for (const r of rows) {
721
+ const store = latest[r.key];
722
+ const have = r.version && parseVersion(String(r.version));
723
+ if (!store || !have) continue;
724
+ if (store.status === 'delisted') { delisted.push({ key: r.key, installed: r.version, enabled: r.enabled }); continue; }
725
+ const next = parseVersion(String(store.version));
726
+ if (!next || cmp(next, have) <= 0) continue;
727
+ let fits = false;
728
+ try { fits = !!(core && store.core_version && satisfies(core, store.core_version)); } catch { fits = false; }
729
+ updates.push({ key: r.key, installed: r.version, latest: store.version, coreVersion: store.core_version, enabled: r.enabled, fits });
730
+ }
731
+ return { updates, delisted };
732
+ }
733
+
734
+ function reportUpdates(found, verdict, { log, errlog }) {
735
+ log('\nModule updates (from the store):');
736
+ if (!found.checked) {
737
+ log(` not checked — ${found.reason}. The compatibility check above still stands.`);
738
+ return;
739
+ }
740
+ const { updates, delisted } = evaluateUpdates(verdict.rows, found.latest, verdict.core);
741
+ for (const u of updates) {
742
+ const how = u.fits
743
+ ? `run \`bongos module update ${u.key}\``
744
+ : `needs core ${u.coreVersion}; this core is ${verdict.core}, so it waits until the core moves`;
745
+ log(` ↑ ${u.key.padEnd(18)} ${u.installed} → ${u.latest} — ${how}`);
746
+ }
747
+ for (const d of delisted) {
748
+ errlog(` ! ${d.key.padEnd(18)} ${d.installed} — delisted in the store: it keeps working, but no further versions will come`);
749
+ }
750
+ if (!updates.length && !delisted.length) log(' every installed store module is on its newest version.');
751
+ }
752
+
753
+ async function cmdUpgrade(args = [], { log = console.log, errlog = console.error, gather = gatherUpgrade, checkUpdates = gatherUpdates } = {}) {
754
+ const data = gather();
755
+ const verdict = evaluateUpgrade(data);
756
+
757
+ log('bongos upgrade — module compatibility pre-check');
758
+ log(` core (src/module-api.js CORE_VERSION): ${verdict.core}`);
759
+
760
+ if (!verdict.rows.length && !data.errors.length) {
761
+ log(' no modules discovered under modules/ — nothing to check.');
762
+ return 0;
763
+ }
764
+ for (const r of verdict.rows) {
765
+ const mark = r.satisfied ? '✓' : (r.enabled ? '✗' : '!');
766
+ const state = r.enabled ? 'enabled' : 'disabled';
767
+ let note = '';
768
+ if (!r.satisfied) {
769
+ // A DISABLED mismatch is harmless to THIS boot, but it is not harmless to
770
+ // the catalog — it is a rotted entry with an owner who needs telling
771
+ // (ADR 0166). Name that owner right here rather than shrugging at it.
772
+ note = ` — coreVersion ${r.coreVersion || '(none)'} not satisfied by core ${verdict.core}` +
773
+ (r.enabled ? ' — will NOT mount' : ' — disabled, so it does not block this boot, but it is BROKEN if enabled') +
774
+ `\n ↳ ${formatMaintenanceHint(r)}`;
775
+ }
776
+ log(` ${mark} ${r.key.padEnd(18)} ${String(r.coreVersion || '').padEnd(10)} ${state}${note}`);
777
+ }
778
+ for (const e of data.errors) errlog(` ! ${e.dir}: ${(e.errors || []).join('; ')}`);
779
+
780
+ // Deprecation roll-up (ADR 0166) — separate from compatibility: a module can
781
+ // satisfy the core perfectly and still be on its way out.
782
+ for (const d of verdict.deprecations) {
783
+ const overdue = verdict.expired.includes(d);
784
+ errlog(` ${overdue ? '✗' : '!'} ${d.key}: ${d.maintenance.status}${overdue ? ` — PAST removeAfter ${d.maintenance.removeAfter} (core is ${verdict.core}); it is due for removal` : ''}`);
785
+ errlog(` ↳ ${formatMaintenanceHint(d)}`);
786
+ }
787
+ if (verdict.undeclared.length) {
788
+ errlog(` ! ${verdict.undeclared.length} module(s) declare no \`maintenance\` block — nobody is on the hook for them as the core advances (ADR 0166): ${verdict.undeclared.map((r) => r.key).join(', ')}`);
789
+ }
790
+
791
+ // What is stale here, beside what is broken: the store's newer versions of the
792
+ // modules installed from it. Reported either way, and it never changes the exit
793
+ // code. `--no-store` skips the read (offline, or a CI pre-check).
794
+ if (!args.includes('--no-store')) reportUpdates(await checkUpdates(verdict.rows), verdict, { log, errlog });
795
+
796
+ if (!verdict.ok) {
797
+ errlog(`\nREFUSING: ${verdict.blocking.length} enabled module(s) incompatible with core ${verdict.core}: ${verdict.blocking.map((b) => b.key).join(', ')}.`);
798
+ errlog(`Widen each module's coreVersion to a range that includes ${verdict.core} (or hold the core upgrade) before proceeding.`);
799
+ return 1;
800
+ }
801
+ log(`\nOK — every enabled module satisfies core ${verdict.core}.`);
802
+ return 0;
803
+ }
804
+
805
+ function cmdCheck(args, { log = console.log, errlog = console.error, check = checkModulePublishability, sign = recordSignOff, howtoCheck } = {}) {
806
+ const key = args.find((a) => !a.startsWith('-'));
807
+ if (!key) {
808
+ errlog('usage: bongos module check <key> [--sign-off "Name <email>"]');
809
+ return 2;
810
+ }
811
+ const signIdx = args.indexOf('--sign-off');
812
+ const signedBy = signIdx !== -1 ? args[signIdx + 1] : null;
813
+
814
+ let result;
815
+ try { result = check(key); }
816
+ catch (e) { errlog(`bongos module check: ${e.message}`); return 1; }
817
+
818
+ log(`bongos module check — upstreaming pre-check for "${key}"`);
819
+ if (result.ok) {
820
+ log(' ✓ AGPL/publish pre-check passed — no denied content, license is AGPL-3.0, upkeep is declared.');
821
+ } else {
822
+ for (const f of result.findings) errlog(` ✗ ${f.kind}: ${f.detail}`);
823
+ }
824
+
825
+ // The store's how-to gate (ADR 0347 D4), reported here so an author learns early.
826
+ // Advisory only: it gates `bongos module publish`, never an upstream submit.
827
+ const { checkHowto, HOWTO_FILE } = require('./module-artifact');
828
+ const howto = (howtoCheck || ((k) => checkHowto(readText(path.join(MODULES_DIR, k, HOWTO_FILE)))))(key);
829
+ if (howto.ok) log(` ✓ ${HOWTO_FILE} has every required section — ready for \`bongos module publish\`.`);
830
+ else for (const p of howto.problems) log(` ! ${p} — needed before \`bongos module publish\` (not for an upstream submit)`);
831
+
832
+ if (!result.ok) {
833
+ errlog(`\nREFUSING: "${key}" is not clear to submit upstream. Fix the finding(s) above and re-run.`);
834
+ return 1;
835
+ }
836
+
837
+ if (signedBy) {
838
+ const record = sign(key, signedBy);
839
+ log(`\nSign-off recorded — ${record.path}`);
840
+ log(` "${record.signOff.signedBy}", ${record.signOff.date}`);
841
+ } else {
842
+ log('\nNo --sign-off given — pass --sign-off "Name <email>" to affirm + record the DCO-style sign-off.');
843
+ }
844
+ return 0;
845
+ }
846
+
847
+ // `bongos module submit <key>` — ADR 0107 §1. Runs the §4 pre-check + requires
848
+ // a sign-off (locally, for fast refusal without a network round trip), then
849
+ // POSTs to POST /modules/:key/submit — the SAME route the hall "Modules" tab's
850
+ // submit button calls (src/bongos/routes/modules.js). That route re-runs the
851
+ // pre-check against ITS OWN on-disk copy of the module and is the authoritative
852
+ // gate: a local pass here is a courtesy, not a guarantee, if the module's
853
+ // changes aren't committed + shipped + deployed yet.
854
+ async function cmdSubmit(args, {
855
+ log = console.log, errlog = console.error,
856
+ check = checkModulePublishability, sign = recordSignOff, readSign = readSignOff,
857
+ submit,
858
+ } = {}) {
859
+ const key = args.find((a) => !a.startsWith('-'));
860
+ if (!key) {
861
+ errlog('usage: bongos module submit <key> [--sign-off "Name <email>"]');
862
+ return 2;
863
+ }
864
+ const signIdx = args.indexOf('--sign-off');
865
+ const signedBy = signIdx !== -1 ? args[signIdx + 1] : null;
866
+
867
+ log(`bongos module submit — upstreaming "${key}" (ADR 0107 §1)`);
868
+
869
+ let result;
870
+ try { result = check(key); }
871
+ catch (e) { errlog(`bongos module submit: ${e.message}`); return 1; }
872
+
873
+ if (!result.ok) {
874
+ for (const f of result.findings) errlog(` ✗ ${f.kind}: ${f.detail}`);
875
+ errlog(`\nREFUSING: "${key}" is not clear to submit upstream. Fix the finding(s) above and re-run.`);
876
+ return 1;
877
+ }
878
+ log(' ✓ AGPL/publish pre-check passed.');
879
+
880
+ let signOff = readSign(key);
881
+ if (!signOff && signedBy) {
882
+ const record = sign(key, signedBy);
883
+ log(` ✓ Sign-off recorded — ${record.path}`);
884
+ signOff = readSign(key);
885
+ }
886
+ if (!signOff) {
887
+ errlog(`\nREFUSING: no DCO-style sign-off on file for "${key}". Pass --sign-off "Name <email>" (or run \`bongos module check ${key} --sign-off "Name <email>"\` first).`);
888
+ return 1;
889
+ }
890
+ log(` ✓ Sign-off on file — "${signOff.signOff.signedBy}", ${signOff.signOff.date}.`);
891
+
892
+ const doSubmit = submit || (async (k, body) => {
893
+ // Lazy require: cli-lib.js carries session/fetch plumbing that must NEVER
894
+ // load into the always-on server process — this file is also required by
895
+ // src/bongos/routes/modules.js for the pre-check it reuses. A real network
896
+ // call only happens when a human/agent actually invokes this CLI command.
897
+ const { cliClient, requireSession } = require('./cli-lib');
898
+ await requireSession();
899
+ const api = await cliClient();
900
+ return api.modules.postModulesKeySubmit({ key: k, body });
901
+ });
902
+
903
+ let res;
904
+ try { res = await doSubmit(key, { signed_by: signedBy || undefined }); }
905
+ catch (e) { errlog(`bongos module submit: request failed — ${e.message}`); return 1; }
906
+
907
+ if (!res.ok) {
908
+ const detail = (res.data && (res.data.message || res.data.error)) || JSON.stringify(res.data);
909
+ errlog(`\nREFUSING: the review queue rejected the submission (HTTP ${res.status}): ${detail}`);
910
+ if (res.status === 422) errlog('(the server re-runs the pre-check/sign-off check against its OWN deployed copy — commit + ship first if this module has local-only changes.)');
911
+ return 1;
912
+ }
913
+
914
+ const submission = res.data && res.data.submission;
915
+ log(`\n✓ Filed — submission id ${submission ? submission.id : '?'} for "${key}", status ${submission ? submission.status : 'pending'}.`);
916
+ log('Task 1771 (core-side review & accept flow) picks it up from here.');
917
+ return 0;
918
+ }
919
+
920
+ // ---------------------------------------------------------------------------
921
+ // bongos module publish <key> — put a module version in the store (ADR 0338 D1)
922
+ // ---------------------------------------------------------------------------
923
+
924
+ // `bongos module publish <key>` — task 1004271. Packs modules/<key>/ into the
925
+ // store's tarball + hash manifest (scripts/bongos/module-artifact.js — the core
926
+ // release's own format, through the publish denylist), then uploads it to
927
+ // POST /store/modules/:key/versions, which re-verifies every hash itself and
928
+ // records the version. `--dry-run` packs and reports without uploading;
929
+ // `--out <dir>` also writes the tarball and its side-car manifest there.
930
+ // Distinct from `submit`, which proposes a module INTO core (ADR 0135).
931
+ async function cmdPublish(args, {
932
+ log = console.log, errlog = console.error,
933
+ modulesDir = MODULES_DIR, pack, upload, writeFile = fs.writeFileSync,
934
+ } = {}) {
935
+ const key = args.find((a, i) => !a.startsWith('-') && args[i - 1] !== '--out');
936
+ if (!key) {
937
+ errlog('usage: bongos module publish <key> [--dry-run] [--out <dir>]');
938
+ return 2;
939
+ }
940
+ const dryRun = args.includes('--dry-run');
941
+ const outIdx = args.indexOf('--out');
942
+ const outDir = outIdx !== -1 ? args[outIdx + 1] : null;
943
+ if (outIdx !== -1 && (!outDir || outDir.startsWith('--'))) {
944
+ errlog('usage: bongos module publish <key> [--dry-run] [--out <dir>]');
945
+ return 2;
946
+ }
947
+
948
+ const artifact = require('./module-artifact');
949
+ let packed;
950
+ try { packed = (pack || ((k) => artifact.packModule(k, { modulesDir })))(key); }
951
+ catch (e) { errlog(`REFUSING: ${e.message}`); return 1; }
952
+ const { tgz, sidecar } = packed;
953
+ log(`bongos module publish — "${key}" ${sidecar.module_version} (needs core ${sidecar.core_version})`);
954
+ // The how-to gate (ADR 0347 D4) — the same checker the store re-runs on upload.
955
+ const howto = artifact.checkHowto(readText(path.join(modulesDir, key, artifact.HOWTO_FILE)));
956
+ if (!howto.ok) {
957
+ for (const p of howto.problems) errlog(` ✗ ${p}`);
958
+ errlog(`REFUSING: "${key}" needs a complete ${artifact.HOWTO_FILE} before it can be published — fill in the section(s) above.`);
959
+ return 1;
960
+ }
961
+ log(` ✓ ${artifact.HOWTO_FILE} has all ${artifact.HOWTO_SECTIONS.length} required sections`);
962
+ log(` ✓ packed ${sidecar.file_count} file(s), ${tgz.length} bytes — tree ${sidecar.tree_sha256.slice(0, 12)}…`);
963
+ if (tgz.length > artifact.MAX_TARBALL_BYTES) {
964
+ errlog(`REFUSING: the tarball is ${tgz.length} bytes, over the store's ${artifact.MAX_TARBALL_BYTES}-byte cap.`);
965
+ return 1;
966
+ }
967
+
968
+ if (outDir) {
969
+ fs.mkdirSync(outDir, { recursive: true });
970
+ const tgzPath = path.join(outDir, sidecar.tarball.name);
971
+ writeFile(tgzPath, tgz);
972
+ writeFile(tgzPath.replace(/\.tgz$/, '.manifest.json'), JSON.stringify(sidecar, null, 2) + '\n');
973
+ log(` ✓ wrote ${tgzPath} (+ .manifest.json)`);
974
+ }
975
+ if (dryRun) {
976
+ log('\n--dry-run: nothing uploaded.');
977
+ return 0;
978
+ }
979
+
980
+ const doUpload = upload || (async (k, body) => {
981
+ // Lazy require — the same reason cmdSubmit gives: this file loads in the server
982
+ // process too, and cli-lib's session/fetch plumbing must never come with it.
983
+ const { readSessionToken, dispatchedFetch, noKeepAliveDispatcher, CLI_USER_AGENT } = require('./cli-lib');
984
+ const session = readSessionToken();
985
+ if (!session) throw new Error('no Bongos session — run `bongos setup` first');
986
+ const res = await dispatchedFetch(`${session.apiBase}/api/bongos/store/modules/${encodeURIComponent(k)}/versions`, {
987
+ method: 'POST',
988
+ headers: { 'Content-Type': 'application/gzip', Authorization: `Bearer ${session.token}`, 'User-Agent': CLI_USER_AGENT },
989
+ body,
990
+ dispatcher: noKeepAliveDispatcher(),
991
+ });
992
+ const text = await res.text();
993
+ let data;
994
+ try { data = text ? JSON.parse(text) : null; } catch { data = { raw: text }; }
995
+ return { status: res.status, ok: res.ok, data };
996
+ });
997
+
998
+ let res;
999
+ try { res = await doUpload(key, tgz); }
1000
+ catch (e) { errlog(`bongos module publish: upload failed — ${e.message}`); return 1; }
1001
+ if (!res.ok) {
1002
+ const err = res.data && (res.data.error || res.data);
1003
+ const detail = (err && (err.message || err.code)) || JSON.stringify(res.data);
1004
+ errlog(`\nREFUSING: the store rejected "${key}" ${sidecar.module_version} (HTTP ${res.status}): ${detail}`);
1005
+ return 1;
1006
+ }
1007
+ const row = res.data && res.data.version;
1008
+ log(`\n✓ Published "${key}" ${row ? row.version : sidecar.module_version} to the store${res.data && res.data.created_module ? ' — its first version, so you are its author' : ''}.`);
1009
+ if (res.data && res.data.channel === 'tester') {
1010
+ log(' It goes to testing projects first, and reaches every project once it has been tested (ADR 0344).');
1011
+ }
1012
+ return 0;
1013
+ }
1014
+
1015
+ // ---------------------------------------------------------------------------
1016
+ // bongos module install <key> — acquire a module from the store (ADR 0338 D1)
1017
+ // ---------------------------------------------------------------------------
1018
+
1019
+ // The store half of the CLI, over three calls (src/bongos/routes/modules.js):
1020
+ // acquire (take the entitlement, learn the version), download the tarball, and
1021
+ // once the files are placed, record the version acquired. Injected in tests.
1022
+ function storeRequest() {
1023
+ // Lazy require — cli-lib's session/fetch plumbing must never load in the server
1024
+ // process, which requires this file too (the same reason cmdPublish gives).
1025
+ const { readSessionToken, dispatchedFetch, noKeepAliveDispatcher, CLI_USER_AGENT } = require('./cli-lib');
1026
+ const session = readSessionToken();
1027
+ if (!session) throw new Error('no Bongos session — run `bongos setup` first');
1028
+ const call = async (method, urlPath, { json, binary = false } = {}) => {
1029
+ const res = await dispatchedFetch(`${session.apiBase}/api/bongos${urlPath}`, {
1030
+ method,
1031
+ headers: {
1032
+ Authorization: `Bearer ${session.token}`, 'User-Agent': CLI_USER_AGENT,
1033
+ ...(json ? { 'Content-Type': 'application/json' } : {}),
1034
+ },
1035
+ body: json ? JSON.stringify(json) : undefined,
1036
+ dispatcher: noKeepAliveDispatcher(),
1037
+ });
1038
+ if (binary && res.ok) return { ok: true, status: res.status, buf: Buffer.from(await res.arrayBuffer()) };
1039
+ const text = await res.text();
1040
+ let data;
1041
+ try { data = text ? JSON.parse(text) : null; } catch { data = { raw: text }; }
1042
+ return { ok: res.ok, status: res.status, data };
1043
+ };
1044
+ // Where the store lives, so install can print a full link to the how-to page.
1045
+ call.apiBase = session.apiBase;
1046
+ return call;
1047
+ }
1048
+
1049
+ // The hall page that shows a version's HOWTO.md (task 1004366) — the Modules tab,
1050
+ // opened on one version. null when the version shipped without one (published
1051
+ // before ADR 0347's gate), so install never prints a link that would 404.
1052
+ function howtoLink(key, version, files, apiBase) {
1053
+ if (!files.some((f) => f.path === 'HOWTO.md')) return null;
1054
+ const p = `/builders/modules?howto=${encodeURIComponent(key)}&version=${encodeURIComponent(version)}`;
1055
+ return apiBase ? `${String(apiBase).replace(/\/+$/, '')}${p}` : p;
1056
+ }
1057
+
1058
+ function storeError(res) {
1059
+ const err = res.data && (res.data.error || res.data);
1060
+ return (err && (err.message || err.code)) || `HTTP ${res.status}`;
1061
+ }
1062
+
1063
+ // Where install places a module: the INSTANCE's own modules/ root (ADR 0108 §1),
1064
+ // which the loader discovers. In a single checkout that is this repo's modules/.
1065
+ function instanceModulesDir() {
1066
+ return path.join(require('../../src/instance-config').resolveInstanceRoot(), 'modules');
1067
+ }
1068
+
1069
+ // Write the verified files into a private staging dir beside the target, then
1070
+ // rename it into place, so a crash leaves a staging dir to delete, never a
1071
+ // half-written module the loader would try to mount.
1072
+ function placeModule(files, target) {
1073
+ const staging = `${target}.installing-${process.pid}-${Date.now()}`;
1074
+ fs.mkdirSync(staging, { recursive: true });
1075
+ try {
1076
+ for (const f of files) {
1077
+ const dest = path.join(staging, ...f.path.split('/'));
1078
+ if (!dest.startsWith(staging + path.sep)) throw new Error(`"${f.path}" would land outside the module`);
1079
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
1080
+ fs.writeFileSync(dest, f.buf, { mode: parseInt(f.mode, 8) || 0o644 });
1081
+ }
1082
+ fs.renameSync(staging, target);
1083
+ } catch (e) {
1084
+ fs.rmSync(staging, { recursive: true, force: true });
1085
+ throw e;
1086
+ }
1087
+ }
1088
+
1089
+ // Every discovery root the loader scans (core + instance, ADR 0108 §1). A key on
1090
+ // disk in ANY of them is already taken: the loader treats a repeated key as a hard
1091
+ // error, so placing a second copy in the instance root would break boot.
1092
+ function discoveryRoots() {
1093
+ return require('../../src/module-loader/loader').DEFAULT_ROOTS;
1094
+ }
1095
+
1096
+ // Parse `<key> [--version X.Y.Z]` for install and update. Returns { key, wanted }
1097
+ // or { code } (2 = usage) after printing why.
1098
+ function parseStoreArgs(args, verb, errlog) {
1099
+ const usage = `usage: bongos module ${verb} <key> [--version X.Y.Z]`;
1100
+ const vIdx = args.indexOf('--version');
1101
+ const wanted = vIdx !== -1 ? args[vIdx + 1] : null;
1102
+ const key = args.find((a, i) => !a.startsWith('-') && args[i - 1] !== '--version');
1103
+ if (!key || (vIdx !== -1 && (!wanted || wanted.startsWith('--')))) { errlog(usage); return { code: 2 }; }
1104
+ if (!KEY_RE.test(key)) { errlog(`REFUSING: "${key}" is not a module key (lowercase kebab-case).`); return { code: 2 }; }
1105
+ const { parseVersion } = require('../../src/module-loader/semver');
1106
+ if (wanted && !parseVersion(wanted)) { errlog(`REFUSING: --version must be exact X.Y.Z, not "${wanted}".`); return { code: 2 }; }
1107
+ return { key, wanted };
1108
+ }
1109
+
1110
+ // The one acquisition path install AND update share (task 1003786): acquire, check
1111
+ // the version can mount on this core, download, verify with verifyModuleArtifact and
1112
+ // hold the bytes to what the store described. Nothing here reads a price or branches
1113
+ // on how the module was obtained — the store decides entitlement, and a holder it has
1114
+ // already granted (for any reason) is never asked again. tests/module_update.mjs
1115
+ // fails if a price-conditional branch appears in this path.
1116
+ //
1117
+ // `shouldDownload(described)` lets update stop before the download when the store's
1118
+ // version is not newer than what is installed. Resolves { ok, described, verified }
1119
+ // or { ok: false, code, upToDate? } after printing why.
1120
+ async function fetchVerified(key, { wanted, call, core, log, errlog, verb, shouldDownload = () => true }) {
1121
+ const fail = (code, msg) => { if (msg) errlog(msg); return { ok: false, code }; };
1122
+ const enc = encodeURIComponent(key);
1123
+ let acq;
1124
+ try { acq = await call('POST', `/store/modules/${enc}/acquire`, { json: wanted ? { version: wanted } : {} }); }
1125
+ catch (e) { return fail(1, `bongos module ${verb}: the store could not be reached — ${e.message}`); }
1126
+ if (!acq.ok) return fail(1, `REFUSING: the store would not hand over "${key}" (HTTP ${acq.status}): ${storeError(acq)}`);
1127
+ const described = acq.data;
1128
+ log(`bongos module ${verb} — "${key}" ${described.version} (needs core ${described.core_version})`);
1129
+
1130
+ const stop = shouldDownload(described);
1131
+ if (stop !== true) return { ok: false, code: stop.code, upToDate: stop.upToDate };
1132
+
1133
+ const { satisfies } = require('../../src/module-loader/semver');
1134
+ const coreV = core || require('../../src/module-api').CORE_VERSION;
1135
+ if (!satisfies(coreV, described.core_version)) {
1136
+ return fail(1, `REFUSING: "${key}" ${described.version} needs core ${described.core_version}; this core is ${coreV}, so it could not mount.`);
1137
+ }
1138
+
1139
+ let dl;
1140
+ try { dl = await call('GET', `/store/modules/${enc}/versions/${encodeURIComponent(described.version)}/tarball`, { binary: true }); }
1141
+ catch (e) { return fail(1, `bongos module ${verb}: download failed — ${e.message}`); }
1142
+ if (!dl.ok) return fail(1, `REFUSING: the download was refused (HTTP ${dl.status}): ${storeError(dl)}`);
1143
+
1144
+ const artifact = require('./module-artifact');
1145
+ const verified = await artifact.verifyModuleArtifact(dl.buf, { key, includeFiles: true });
1146
+ if (!verified.ok) {
1147
+ await reportInstall(call, key, described.version, 'verify_failed');
1148
+ return fail(1, `REFUSING: the downloaded tarball failed verification (${verified.code}): ${verified.message}`);
1149
+ }
1150
+ if (verified.version !== described.version || verified.tarballSha256 !== described.tarball_sha256 || verified.treeSha256 !== described.tree_sha256) {
1151
+ await reportInstall(call, key, described.version, 'hash_mismatch');
1152
+ return fail(1, `REFUSING: the download is not the ${described.version} the store described (version or hash differs).`);
1153
+ }
1154
+ log(` ✓ verified ${verified.files.length} file(s), ${verified.bytes} bytes — tree ${verified.treeSha256.slice(0, 12)}…`);
1155
+ return { ok: true, described, verified };
1156
+ }
1157
+
1158
+ // Tell the store whether an install or update of this exact version worked (task
1159
+ // 1003793): it feeds the module's Install score, the part an author cannot fake.
1160
+ // Counts only — yes, or a short code saying where it failed; never a message, a
1161
+ // path or anything about this machine (owner's privacy posture, 2026-10-01). The
1162
+ // store drops it if the caller switched reporting off in Settings, so there is no
1163
+ // client-side switch to keep in step. Best-effort and silent: a report that does
1164
+ // not arrive changes nothing about the install. Only failures that are the
1165
+ // module's own count: a refused or unreachable store, or a core the module does
1166
+ // not support, says nothing about the module and is not reported.
1167
+ async function reportInstall(call, key, version, errorCode = null) {
1168
+ const body = errorCode ? { ok: false, error_code: errorCode } : { ok: true };
1169
+ try {
1170
+ await call('POST', `/store/modules/${encodeURIComponent(key)}/versions/${encodeURIComponent(version)}/install-report`, { json: body });
1171
+ } catch { /* best-effort */ }
1172
+ }
1173
+
1174
+ // Tell the store which exact version was placed. A failure here never undoes the
1175
+ // placement: the files are good, and the next install or update records it.
1176
+ async function recordPlaced(key, version, { call, errlog, verb }) {
1177
+ let rec;
1178
+ try { rec = await call('POST', `/store/modules/${encodeURIComponent(key)}/acquired`, { json: { version } }); }
1179
+ catch (e) { rec = { ok: false, status: 0, data: { error: { message: e.message } } }; }
1180
+ if (!rec.ok) {
1181
+ errlog(`WARNING: "${key}" is ${verb === 'update' ? 'updated' : 'installed'}, but the store did not record the version (${storeError(rec)}). Nothing is lost; the next install or update records it.`);
1182
+ return false;
1183
+ }
1184
+ return true;
1185
+ }
1186
+
1187
+ // `bongos module install <key> [--version X.Y.Z]` — task 1003785. Acquires the
1188
+ // module (a free one is granted on the spot; a priced one waits on the buy action,
1189
+ // area 8), downloads its tarball, verifies it with verifyModuleArtifact — the one
1190
+ // checker the store itself uses on publish — and places it under the instance's
1191
+ // modules/. It never enables: the loader discovers what is on disk and the hall's
1192
+ // Modules tab decides what mounts. A key already on disk in ANY discovery root is
1193
+ // refused; moving an installed module to a newer version is `update` (task 1003786).
1194
+ async function cmdInstall(args, {
1195
+ log = console.log, errlog = console.error,
1196
+ modulesDir, roots, request, core,
1197
+ } = {}) {
1198
+ const parsed = parseStoreArgs(args, 'install', errlog);
1199
+ if (parsed.code) return parsed.code;
1200
+ const { key, wanted } = parsed;
1201
+
1202
+ const dir = modulesDir || instanceModulesDir();
1203
+ const target = path.join(dir, key);
1204
+ const taken = [dir, ...(roots || discoveryRoots())].map((r) => path.join(r, key)).find((p) => fs.existsSync(p));
1205
+ if (taken) {
1206
+ errlog(`REFUSING: "${key}" is already on disk at ${taken}. Install only adds a new module; to move an installed one forward, run \`bongos module update ${key}\`.`);
1207
+ return 1;
1208
+ }
1209
+
1210
+ let call;
1211
+ try { call = request || storeRequest(); }
1212
+ catch (e) { errlog(`bongos module install: ${e.message}`); return 1; }
1213
+
1214
+ const got = await fetchVerified(key, { wanted, call, core, log, errlog, verb: 'install' });
1215
+ if (!got.ok) return got.code;
1216
+
1217
+ try { placeModule(got.verified.files, target); }
1218
+ catch (e) { await reportInstall(call, key, got.described.version, 'place_failed'); errlog(`bongos module install: could not place the module — ${e.message}`); return 1; }
1219
+ log(` ✓ placed at ${target}`);
1220
+
1221
+ const recorded = await recordPlaced(key, got.described.version, { call, errlog, verb: 'install' });
1222
+ await reportInstall(call, key, got.described.version);
1223
+ if (!recorded) return 1;
1224
+ log(`\n✓ Installed "${key}" ${got.described.version}. It is not switched on: enable it from the hall's Modules tab when you want it.`);
1225
+ const howto = howtoLink(key, got.described.version, got.verified.files, call.apiBase);
1226
+ if (howto) log(` How to use it: ${howto}`);
1227
+ return 0;
1228
+ }
1229
+
1230
+ // Replace an installed module's directory with a verified new one. The new files
1231
+ // are written to a staging dir first; the old dir is moved aside, the new one moved
1232
+ // in, and only then is the old one removed — so a failure at any step leaves the
1233
+ // previous version in place, never a half-written or missing module.
1234
+ function replaceModule(files, target) {
1235
+ const aside = `${target}.previous-${process.pid}-${Date.now()}`;
1236
+ const staging = `${target}.installing-${process.pid}-${Date.now()}`;
1237
+ placeModule(files, staging);
1238
+ try {
1239
+ fs.renameSync(target, aside);
1240
+ } catch (e) {
1241
+ fs.rmSync(staging, { recursive: true, force: true });
1242
+ throw e;
1243
+ }
1244
+ try {
1245
+ fs.renameSync(staging, target);
1246
+ } catch (e) {
1247
+ fs.renameSync(aside, target);
1248
+ fs.rmSync(staging, { recursive: true, force: true });
1249
+ throw e;
1250
+ }
1251
+ fs.rmSync(aside, { recursive: true, force: true });
1252
+ }
1253
+
1254
+ // `bongos module update <key> [--version X.Y.Z]` — task 1003786. Moves an installed
1255
+ // store module forward, through exactly the acquisition path install uses
1256
+ // (fetchVerified): the same calls whether the module was free or paid, and a module
1257
+ // the caller already holds is never charged again (the store's acquire route only
1258
+ // looks at price for a caller with no entitlement). Only forward: with no --version
1259
+ // it takes the newest, and says so without downloading when that is not newer; an
1260
+ // older --version is refused, since rolling back is a different act. Like install it
1261
+ // never enables or disables — the module keeps whatever switch it had.
1262
+ async function cmdUpdate(args, {
1263
+ log = console.log, errlog = console.error,
1264
+ modulesDir, roots, request, core,
1265
+ } = {}) {
1266
+ const parsed = parseStoreArgs(args, 'update', errlog);
1267
+ if (parsed.code) return parsed.code;
1268
+ const { key, wanted } = parsed;
1269
+
1270
+ const dir = modulesDir || instanceModulesDir();
1271
+ const target = path.join(dir, key);
1272
+ if (!fs.existsSync(path.join(target, 'module.json'))) {
1273
+ const bundled = (roots || discoveryRoots()).map((r) => path.join(r, key)).find((p) => p !== target && fs.existsSync(p));
1274
+ errlog(bundled
1275
+ ? `REFUSING: "${key}" at ${bundled} comes with the core, not the store. It updates when the core does (\`bongos upgrade\`).`
1276
+ : `REFUSING: "${key}" is not installed here. Run \`bongos module install ${key}\` first.`);
1277
+ return 1;
1278
+ }
1279
+ const { parseVersion, cmp } = require('../../src/module-loader/semver');
1280
+ let installed;
1281
+ try { installed = JSON.parse(fs.readFileSync(path.join(target, 'module.json'), 'utf8')).version; }
1282
+ catch (e) { errlog(`REFUSING: could not read the installed ${key}/module.json — ${e.message}`); return 1; }
1283
+ const have = parseVersion(String(installed));
1284
+ if (!have) { errlog(`REFUSING: the installed "${key}" has no exact version in module.json, so there is nothing to compare against.`); return 1; }
1285
+ if (wanted && cmp(parseVersion(wanted), have) < 0) {
1286
+ errlog(`REFUSING: ${wanted} is older than the installed ${installed}. Update only moves forward.`);
1287
+ return 1;
1288
+ }
1289
+
1290
+ let call;
1291
+ try { call = request || storeRequest(); }
1292
+ catch (e) { errlog(`bongos module update: ${e.message}`); return 1; }
1293
+
1294
+ const got = await fetchVerified(key, {
1295
+ wanted, call, core, log, errlog, verb: 'update',
1296
+ shouldDownload: (d) => {
1297
+ const next = parseVersion(String(d.version));
1298
+ if (next && cmp(next, have) > 0) return true;
1299
+ log(`\n✓ "${key}" is up to date at ${installed}.`);
1300
+ return { code: 0, upToDate: true };
1301
+ },
1302
+ });
1303
+ if (!got.ok) return got.code;
1304
+
1305
+ try { replaceModule(got.verified.files, target); }
1306
+ catch (e) { await reportInstall(call, key, got.described.version, 'place_failed'); errlog(`bongos module update: could not replace the module, ${installed} is still in place — ${e.message}`); return 1; }
1307
+ log(` ✓ replaced ${installed} with ${got.described.version} at ${target}`);
1308
+
1309
+ const recorded = await recordPlaced(key, got.described.version, { call, errlog, verb: 'update' });
1310
+ await reportInstall(call, key, got.described.version);
1311
+ if (!recorded) return 1;
1312
+ log(`\n✓ Updated "${key}" ${installed} → ${got.described.version}. Its on/off switch is unchanged.`);
1313
+ return 0;
1314
+ }
1315
+
1316
+ function printHelp(out = console.log) {
1317
+ out('bongos module — scaffold + manage Cloud Bongos modules\n');
1318
+ out('Usage:');
1319
+ out(' bongos module new <key> Scaffold modules/<key>/ (manifest + skeleton + sample route + HOWTO.md + CLAUDE.md)');
1320
+ out(' bongos module list [--catalog] [--search <text>] [--json]');
1321
+ out(' Browse the module catalog — what you can enable, with author + origin credit');
1322
+ out(' bongos upgrade [--no-store] Pre-check enabled modules against the core version (fail-closed),');
1323
+ out(' then list newer store versions of installed modules (never blocks)');
1324
+ out(' bongos module check <key> [--sign-off "Name <email>"]');
1325
+ out(' AGPL/publish pre-check before upstreaming + record a DCO-style sign-off');
1326
+ out(' bongos module submit <key> [--sign-off "Name <email>"]');
1327
+ out(' Pre-check + sign-off, then file into the rank-gated upstreaming review queue');
1328
+ out(' bongos module publish <key> [--dry-run] [--out <dir>]');
1329
+ out(' Pack a module version (tarball + hash manifest) and upload it to the module store');
1330
+ out(' bongos module install <key> [--version X.Y.Z]');
1331
+ out(' Acquire a module from the store, verify it and place it under modules/ (not enabled)');
1332
+ out(' bongos module update <key> [--version X.Y.Z]');
1333
+ out(' Move an installed store module to a newer version (same path, paid or free)');
1334
+ }
1335
+
1336
+ async function main(argv) {
1337
+ const args = argv.slice(2);
1338
+ const sub = args[0];
1339
+ if (sub === 'new') return cmdNew(args.slice(1));
1340
+ if (sub === 'list' || sub === 'ls') return cmdList(args.slice(1));
1341
+ if (sub === 'upgrade') return cmdUpgrade(args.slice(1));
1342
+ if (sub === 'check') return cmdCheck(args.slice(1));
1343
+ if (sub === 'submit') return cmdSubmit(args.slice(1));
1344
+ if (sub === 'publish') return cmdPublish(args.slice(1));
1345
+ if (sub === 'install') return cmdInstall(args.slice(1));
1346
+ if (sub === 'update') return cmdUpdate(args.slice(1));
1347
+ if (!sub || sub === 'help' || sub === '--help' || sub === '-h') {
1348
+ printHelp();
1349
+ return sub ? 0 : 2;
1350
+ }
1351
+ console.error(`bongos module: unknown subcommand "${sub}"`);
1352
+ printHelp(console.error);
1353
+ return 2;
1354
+ }
1355
+
1356
+ module.exports = {
1357
+ main, cmdNew, cmdList, cmdUpgrade, cmdCheck, cmdSubmit, cmdPublish, cmdInstall, cmdUpdate, printHelp,
1358
+ storeRequest,
1359
+ gatherCatalog, formatCatalog, ownProjectName,
1360
+ scaffoldModule, gatherUpgrade, evaluateUpgrade, gatherUpdates, evaluateUpdates, buildManifest,
1361
+ formatMaintenanceHint, isPastRemoveAfter,
1362
+ checkModulePublishability, recordSignOff, readSignOff, DCO_STATEMENT,
1363
+ listModuleFiles, packageModuleForSubmission,
1364
+ routeTemplate, claudeMdTemplate, titleize, camel, coreVersion,
1365
+ MODULES_DIR,
1366
+ };
1367
+
1368
+ if (require.main === module) {
1369
+ // Set the exit code and drain, never a hard exit: install, update and upgrade end
1370
+ // after a store request, and a hard exit there aborts natively on Windows + Node 24
1371
+ // (task 1002734).
1372
+ Promise.resolve(main(process.argv)).then(
1373
+ (code) => { process.exitCode = code; },
1374
+ (e) => { console.error(e); process.exit(1); }
1375
+ );
1376
+ }