@bongos/core 1.21.174 → 1.21.176

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1744) hide show
  1. package/.bongos-core.json +3565 -1515
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +14 -14
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  58. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  59. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  60. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  61. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  62. package/docs/adr/README.md +2 -0
  63. package/docs/api/openapi.json +606 -44
  64. package/docs/api-reference.md +25 -12
  65. package/docs/architecture.md +8 -7
  66. package/docs/canonical-permissions.md +3 -3
  67. package/docs/copy-inventory.md +1389 -1437
  68. package/docs/copy-registry.json +2160 -2634
  69. package/docs/design/demonolith-plan.md +6 -6
  70. package/docs/design/modular-architecture/00-research-report.md +1 -1
  71. package/docs/design/project-startup-direction.md +2 -2
  72. package/docs/design/projects-hub-direction-v2.md +1 -1
  73. package/docs/design/reviews/hall-v2/README.md +2 -2
  74. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  75. package/docs/file-map.md +89 -88
  76. package/docs/handoff-template.md +4 -4
  77. package/docs/module-api-changelog.md +6 -2
  78. package/docs/modules-contract.md +8 -7
  79. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  80. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  81. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  82. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  83. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  84. package/docs/onboarding/diagrams/README.md +2 -2
  85. package/docs/onboarding/diagrams/assertions.json +2 -2
  86. package/docs/onboarding/slash-commands.md +2 -2
  87. package/docs/packs/artist.md +4 -4
  88. package/docs/packs/engineer.md +11 -10
  89. package/docs/packs/ideator.md +7 -7
  90. package/docs/page-inventory.json +25 -1
  91. package/docs/page-readings.json +4388 -4602
  92. package/docs/recipes/README.md +1 -1
  93. package/docs/recipes/audit-replay.md +4 -4
  94. package/docs/recipes/autobongos-windows-host.md +6 -6
  95. package/docs/recipes/bongos-cli-release.md +2 -2
  96. package/docs/recipes/claude-design-loop.md +7 -7
  97. package/docs/recipes/core-release-pipeline.md +19 -19
  98. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  99. package/docs/recipes/figma-design-loop.md +6 -6
  100. package/docs/recipes/gds-db-backup.md +9 -9
  101. package/docs/recipes/instance-deploy.md +3 -3
  102. package/docs/recipes/instance-first-run.md +1 -1
  103. package/docs/recipes/multi-builder-merge.md +2 -2
  104. package/docs/recipes/ops-gotchas.md +10 -9
  105. package/docs/recipes/packaging-the-core.md +6 -6
  106. package/docs/recipes/parallel-goal-waves.md +4 -4
  107. package/docs/recipes/private-npm-distribution.md +9 -9
  108. package/docs/recipes/redteam-patrol.md +5 -5
  109. package/docs/recipes/render-pilot.md +2 -2
  110. package/docs/recipes/reranking-a-goals-board.md +2 -2
  111. package/docs/recipes/search-index-ingestion.md +5 -5
  112. package/docs/recipes/self-host.md +1 -1
  113. package/docs/recipes/ship-and-regrade.md +4 -4
  114. package/docs/recipes/staging-environment.md +1 -1
  115. package/docs/recipes/standalone-live-docs.md +1 -1
  116. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  117. package/docs/recipes/upgrading-the-core.md +11 -11
  118. package/docs/recipes/windows-builders.md +18 -18
  119. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  120. package/docs/research/task-network-map-readability.md +3 -3
  121. package/migrations/core_278_builder_tester_tag.sql +18 -0
  122. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  123. package/modules/agents/lib/answer-hold.js +1 -1
  124. package/modules/agents/lib/gate.js +1 -1
  125. package/modules/agents/lib/validate.js +1 -1
  126. package/modules/autonomy/gauge.js +1 -1
  127. package/modules/autonomy/governor-docket.js +2 -2
  128. package/modules/autonomy/pollers/routine-timers.js +3 -3
  129. package/modules/autonomy/routes/autonomy.js +3 -3
  130. package/modules/builder-settings/interaction-prefs.js +1 -1
  131. package/modules/builder-settings/render-prefs.js +1 -1
  132. package/modules/builder-settings/routes/settings.js +1 -1
  133. package/modules/builder-settings/skill-prefs.js +2 -2
  134. package/modules/builder-settings/wandering-prefs.js +2 -2
  135. package/modules/copy-desk/module.json +2 -2
  136. package/modules/copy-desk/page-data.js +5 -5
  137. package/modules/copy-desk/page-decisions.js +13 -1
  138. package/modules/copy-desk/proposals.js +4 -4
  139. package/modules/copy-desk/registry.js +2 -2
  140. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  141. package/modules/copy-desk/routes/copy-desk.js +3 -12
  142. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  143. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  144. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  145. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  146. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  147. package/modules/design-styles/skills/README.md +4 -4
  148. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  149. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  150. package/modules/discord/bug-attachments.js +1 -1
  151. package/modules/discord/ship-broadcast.js +1 -1
  152. package/modules/economy/achievements.js +49 -7
  153. package/modules/economy/cost-classify.js +6 -6
  154. package/modules/economy/cost-report.js +1 -1
  155. package/modules/economy/cost.js +1 -1
  156. package/modules/economy/credits.js +2 -1
  157. package/modules/economy/idea-size.js +2 -2
  158. package/modules/economy/reward.js +2 -0
  159. package/modules/economy/routes/cost.js +1 -1
  160. package/modules/economy/streak.js +43 -4
  161. package/modules/government/asks.js +1 -1
  162. package/modules/government/board.js +19 -2
  163. package/modules/government/catalog.js +3 -0
  164. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  165. package/modules/government/protected-surfaces.json +48 -47
  166. package/modules/government/recommendations.js +6 -2
  167. package/modules/government/routes/government.js +1 -1
  168. package/modules/grading/generated-provenance.js +13 -5
  169. package/modules/grading/grade-engine.js +1 -1
  170. package/modules/grading/grader-rubric.json +1 -1
  171. package/modules/grading/grader-score.js +1 -1
  172. package/modules/grading/grader-workers/index.js +1 -1
  173. package/modules/grading/grader.js +1 -1
  174. package/modules/grading/routes/grade.js +1 -1
  175. package/modules/hall-ui/public/atlas.html +5 -7
  176. package/modules/hall-ui/public/atlas.js +1 -1
  177. package/modules/hall-ui/public/atlas.states.json +1 -1
  178. package/modules/hall-ui/public/blockers.css +9 -0
  179. package/modules/hall-ui/public/blockers.html +6 -4
  180. package/modules/hall-ui/public/blockers.js +39 -27
  181. package/modules/hall-ui/public/board-room.css +5 -12
  182. package/modules/hall-ui/public/board-room.html +6 -6
  183. package/modules/hall-ui/public/board-room.js +41 -23
  184. package/modules/hall-ui/public/board-room.states.json +1 -1
  185. package/modules/hall-ui/public/brand-apply.js +1 -1
  186. package/modules/hall-ui/public/brand-holes.js +1 -1
  187. package/modules/hall-ui/public/builders.js +40 -86
  188. package/modules/hall-ui/public/city-decide.js +18 -4
  189. package/modules/hall-ui/public/city.html +1 -1
  190. package/modules/hall-ui/public/collab.html +1 -1
  191. package/modules/hall-ui/public/commands.html +6 -9
  192. package/modules/hall-ui/public/copy-desk.html +1 -1
  193. package/modules/hall-ui/public/copy-desk.js +2 -2
  194. package/modules/hall-ui/public/craft-mode.js +4 -0
  195. package/modules/hall-ui/public/deploy.html +6 -2
  196. package/modules/hall-ui/public/deploy.js +21 -13
  197. package/modules/hall-ui/public/diagrams.css +1 -1
  198. package/modules/hall-ui/public/diagrams.html +5 -8
  199. package/modules/hall-ui/public/diagrams.states.json +1 -1
  200. package/modules/hall-ui/public/drachmae.html +3 -7
  201. package/modules/hall-ui/public/fleet.html +3 -2
  202. package/modules/hall-ui/public/fleet.js +0 -4
  203. package/modules/hall-ui/public/gate.html +7 -7
  204. package/modules/hall-ui/public/gate.js +58 -77
  205. package/modules/hall-ui/public/goal-inbox.js +69 -86
  206. package/modules/hall-ui/public/goal-map.html +1 -1
  207. package/modules/hall-ui/public/goals-page.js +5 -5
  208. package/modules/hall-ui/public/goals-render.js +10 -11
  209. package/modules/hall-ui/public/goals.css +10 -0
  210. package/modules/hall-ui/public/goals.html +14 -7
  211. package/modules/hall-ui/public/government.html +3 -5
  212. package/modules/hall-ui/public/government.js +1 -5
  213. package/modules/hall-ui/public/hall-ask.css +57 -0
  214. package/modules/hall-ui/public/hall-ask.js +50 -0
  215. package/modules/hall-ui/public/hall-render.js +117 -57
  216. package/modules/hall-ui/public/hall-widgets.js +11 -11
  217. package/modules/hall-ui/public/idea.html +1 -1
  218. package/modules/hall-ui/public/ideas.html +3 -1
  219. package/modules/hall-ui/public/ideas.js +1 -0
  220. package/modules/hall-ui/public/index.html +15 -6
  221. package/modules/hall-ui/public/index.states.json +1 -1
  222. package/modules/hall-ui/public/mine-lens.js +1 -1
  223. package/modules/hall-ui/public/modules.html +7 -10
  224. package/modules/hall-ui/public/modules.js +0 -2
  225. package/modules/hall-ui/public/my-agents.html +1 -1
  226. package/modules/hall-ui/public/palette.js +5 -5
  227. package/modules/hall-ui/public/primer.html +4 -9
  228. package/modules/hall-ui/public/profile-connections.js +10 -2
  229. package/modules/hall-ui/public/profile-roles.js +3 -10
  230. package/modules/hall-ui/public/profile.html +12 -10
  231. package/modules/hall-ui/public/profile.js +13 -17
  232. package/modules/hall-ui/public/project-settings.html +3 -4
  233. package/modules/hall-ui/public/project-settings.js +0 -3
  234. package/modules/hall-ui/public/ranks.html +5 -11
  235. package/modules/hall-ui/public/ranks.js +6 -8
  236. package/modules/hall-ui/public/roadmap.css +0 -2
  237. package/modules/hall-ui/public/roadmap.html +1 -1
  238. package/modules/hall-ui/public/roadmap.js +16 -51
  239. package/modules/hall-ui/public/roster.html +1 -1
  240. package/modules/hall-ui/public/sessions.html +6 -8
  241. package/modules/hall-ui/public/sessions.js +7 -7
  242. package/modules/hall-ui/public/settings.html +1 -1
  243. package/modules/hall-ui/public/shell-trail.js +1 -1
  244. package/modules/hall-ui/public/shell.js +17 -17
  245. package/modules/hall-ui/public/street-deck.css +2 -1
  246. package/modules/hall-ui/public/street-deck.js +10 -2
  247. package/modules/hall-ui/public/street-desk.js +16 -5
  248. package/modules/hall-ui/public/street.html +1 -1
  249. package/modules/hall-ui/public/studio-lib.js +4 -0
  250. package/modules/hall-ui/public/studio.css +2 -0
  251. package/modules/hall-ui/public/studio.html +1 -1
  252. package/modules/hall-ui/public/studio.js +27 -1
  253. package/modules/hall-ui/public/style.css +43 -26
  254. package/modules/hall-ui/public/task-detail.js +10 -7
  255. package/modules/hall-ui/public/task.css +2 -0
  256. package/modules/hall-ui/public/task.html +3 -1
  257. package/modules/hall-ui/public/task.js +23 -7
  258. package/modules/hall-ui/public/thinking.html +1 -1
  259. package/modules/hall-ui/public/tweak-editor.html +1 -1
  260. package/modules/hall-ui/public/vote-control.js +208 -0
  261. package/modules/hall-ui/public/watch.html +3 -5
  262. package/modules/hall-ui/public/watch.js +5 -4
  263. package/modules/hall-ui/public/welcome-boot.css +130 -0
  264. package/modules/hall-ui/public/welcome-boot.js +334 -0
  265. package/modules/hall-ui/public/welcome-day.webp +0 -0
  266. package/modules/hall-ui/public/welcome-night.webp +0 -0
  267. package/modules/hall-ui/public/work-summary.js +1 -1
  268. package/modules/hall-ui/public/work.css +1 -0
  269. package/modules/hall-ui/public/work.html +3 -1
  270. package/modules/hall-ui/public/work.js +2 -1
  271. package/modules/hall-ui/records/accomplishments.md +16 -0
  272. package/modules/hall-ui/records/hall-ask-card.md +33 -0
  273. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  274. package/modules/hall-ui/records/oversight-family.md +1 -1
  275. package/modules/hall-ui/records/profile-connections.md +2 -0
  276. package/modules/hall-ui/records/profile-roles.md +1 -1
  277. package/modules/hall-ui/records/reading-rooms.md +1 -1
  278. package/modules/hall-ui/records/welcome-tower.md +50 -0
  279. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  280. package/modules/ideas/projection.js +1 -1
  281. package/modules/ideas/routes/blockers.js +3 -3
  282. package/modules/ideas/routes/inbox.js +29 -1
  283. package/modules/ideas/routes/ratify-goal.js +1 -1
  284. package/modules/ideas/routing.js +1 -1
  285. package/modules/ideas/templates.js +1 -1
  286. package/modules/ideas/trail-descent.js +1 -1
  287. package/modules/ideas/trail-size.js +1 -1
  288. package/modules/ideas/votes.js +93 -0
  289. package/modules/lifecycle/abandon-leftovers.js +1 -1
  290. package/modules/lifecycle/cascade.js +1 -1
  291. package/modules/lifecycle/conflict-resolve.js +13 -21
  292. package/modules/lifecycle/criterion-ref.js +1 -1
  293. package/modules/lifecycle/db-analytics.js +57 -4
  294. package/modules/lifecycle/db-deps-criteria.js +1 -1
  295. package/modules/lifecycle/db-ship.js +2 -2
  296. package/modules/lifecycle/db-tasks.js +2 -2
  297. package/modules/lifecycle/db-versions.js +1 -1
  298. package/modules/lifecycle/db.js +2 -0
  299. package/modules/lifecycle/dead-deps.js +3 -3
  300. package/modules/lifecycle/dependency-advisory.js +3 -3
  301. package/modules/lifecycle/goal-category.js +1 -1
  302. package/modules/lifecycle/goal-forest.js +1 -1
  303. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  304. package/modules/lifecycle/kickoff-checklist.js +1 -1
  305. package/modules/lifecycle/kickoff-seed.js +1 -1
  306. package/modules/lifecycle/lifecycle.js +2 -0
  307. package/modules/lifecycle/merge-reach.js +29 -15
  308. package/modules/lifecycle/missing-dep-classify.js +3 -3
  309. package/modules/lifecycle/module.json +2 -1
  310. package/modules/lifecycle/page-tweak-approve.js +85 -1
  311. package/modules/lifecycle/page-tweak-hold.js +1 -1
  312. package/modules/lifecycle/publish-reconciler.js +1 -2
  313. package/modules/lifecycle/rot.js +1 -1
  314. package/modules/lifecycle/routes/artist-gate.js +1 -1
  315. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  316. package/modules/lifecycle/routes/goals.js +1 -1
  317. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  318. package/modules/lifecycle/routes/task-votes.js +54 -0
  319. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  320. package/modules/lifecycle/routes/tasks.js +2 -2
  321. package/modules/lifecycle/routes/versions.js +2 -2
  322. package/modules/lifecycle/ship-card.js +4 -4
  323. package/modules/lifecycle/ship-preflight.js +1 -1
  324. package/modules/lifecycle/task-classifier.js +1 -1
  325. package/modules/lifecycle/task-status.js +1 -1
  326. package/modules/lifecycle/task-visual-db.js +1 -1
  327. package/modules/memory/learnings.js +1 -1
  328. package/modules/memory/pollers/search-index.js +2 -2
  329. package/modules/memory/routes/learnings.js +1 -1
  330. package/modules/memory/routes/memory.js +1 -1
  331. package/modules/memory/search.js +2 -2
  332. package/modules/npm-release/release.js +1 -1
  333. package/modules/onboarding/howto-moments.js +1 -1
  334. package/modules/onboarding/newcomer-restock.js +3 -3
  335. package/modules/onboarding/onboarding.js +1 -1
  336. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  337. package/modules/platform-identity/origin-containment.js +1 -1
  338. package/modules/platform-identity/publish-gate.js +1 -1
  339. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  340. package/modules/provisioning/capacity.js +1 -1
  341. package/modules/provisioning/core-upgrade.js +15 -9
  342. package/modules/provisioning/credential-preflight.js +3 -3
  343. package/modules/provisioning/disconnect.js +1 -1
  344. package/modules/provisioning/dns-resolves.js +1 -1
  345. package/modules/provisioning/module.json +1 -1
  346. package/modules/provisioning/onboard-plan.js +1 -1
  347. package/modules/provisioning/paid-shape-gate.js +2 -2
  348. package/modules/provisioning/planet-physics.js +11 -2
  349. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  350. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  351. package/modules/provisioning/provisioning.js +2 -2
  352. package/modules/provisioning/render-lookup.js +1 -1
  353. package/modules/provisioning/render-standup.js +3 -3
  354. package/modules/provisioning/repo-private.js +1 -1
  355. package/modules/provisioning/routes/callback-page.js +1 -1
  356. package/modules/provisioning/routes/core-upgrade.js +23 -3
  357. package/modules/provisioning/routes/provisioning.js +2 -2
  358. package/modules/provisioning/routes/render-standup.js +1 -1
  359. package/modules/provisioning/routes/repo-private.js +1 -1
  360. package/modules/provisioning/soft-limits.js +1 -1
  361. package/modules/provisioning/starter-bundles.js +4 -2
  362. package/modules/provisioning/tests/provisioning.mjs +1 -1
  363. package/modules/public-landing/public/account.html +4 -6
  364. package/modules/public-landing/public/assets/cosmos.css +13 -6
  365. package/modules/public-landing/public/connections.html +4 -6
  366. package/modules/public-landing/public/contact.html +4 -6
  367. package/modules/public-landing/public/guild.html +4 -6
  368. package/modules/public-landing/public/index.html +11 -9
  369. package/modules/public-landing/public/invitations.html +4 -6
  370. package/modules/public-landing/public/privacy.html +4 -6
  371. package/modules/public-landing/public/projects.html +168 -46
  372. package/modules/public-landing/public/terms.html +4 -6
  373. package/modules/raise/content/copy.json +40 -0
  374. package/modules/raise/content/nda.html +39 -0
  375. package/modules/raise/content/settings.json +49 -0
  376. package/modules/raise/db.js +95 -0
  377. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  378. package/modules/raise/module.json +28 -0
  379. package/modules/raise/page.js +194 -0
  380. package/modules/raise/public/edit.js +152 -0
  381. package/modules/raise/public/favicon.svg +1 -0
  382. package/modules/raise/public/logo-ink.svg +1 -0
  383. package/modules/raise/public/logo-night.svg +1 -0
  384. package/modules/raise/public/mode.js +8 -0
  385. package/modules/raise/public/raise.css +234 -0
  386. package/modules/raise/public/raise.js +91 -0
  387. package/modules/raise/raise.js +174 -0
  388. package/modules/raise/routes/raise.js +152 -0
  389. package/modules/raise/views/gate.html +39 -0
  390. package/modules/raise/views/nda.html +21 -0
  391. package/modules/raise/views/page.html +133 -0
  392. package/modules/raise/web.js +72 -0
  393. package/modules/render-deploy/deploys.js +1 -1
  394. package/modules/render-deploy/render.js +2 -2
  395. package/modules/security/secret-scrub.js +3 -3
  396. package/modules/security/security.js +1 -1
  397. package/modules/security/tests/artifact_scan.mjs +1 -1
  398. package/modules/security/tests/mirror.mjs +1 -1
  399. package/modules/security/tests/scan_store.mjs +1 -1
  400. package/modules/sessions/db.js +2 -2
  401. package/modules/sessions/pulse.js +2 -2
  402. package/modules/sessions/routes/sessions.js +1 -1
  403. package/modules/specialities/specialities.js +1 -1
  404. package/modules/status-ui/public/README.md +3 -4
  405. package/modules/status-ui/public/index.html +5 -31
  406. package/modules/status-ui/public/status.js +6 -174
  407. package/modules/status-ui/public/style.css +4 -133
  408. package/modules/ui-design/docs/design-contract.md +3 -3
  409. package/modules/ui-design/kit/README.md +1 -1
  410. package/modules/ui-design/kit/serve.js +13 -4
  411. package/modules/ui-design/scripts/design-sync.js +1 -1
  412. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  413. package/modules/ui-design/scripts/validate-design.js +1 -1
  414. package/package-lock.json +27 -11
  415. package/package.json +2 -3
  416. package/release-notes.json +178 -0
  417. package/scripts/bongos/CLAUDE.md +15 -0
  418. package/scripts/bongos/abandon.js +137 -0
  419. package/scripts/bongos/accessibility-replay.js +195 -0
  420. package/scripts/bongos/address-park-sweep.sh +91 -0
  421. package/scripts/bongos/adopt-detect.js +123 -0
  422. package/scripts/bongos/adopt-import.js +111 -0
  423. package/scripts/bongos/adopt-preflight.js +187 -0
  424. package/scripts/bongos/adr-namespace.js +273 -0
  425. package/scripts/bongos/agent-invoke.js +689 -0
  426. package/scripts/bongos/agents-sync.js +502 -0
  427. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  428. package/scripts/bongos/api-artifacts.js +91 -0
  429. package/scripts/bongos/api.js +86 -0
  430. package/scripts/bongos/api.ps1 +26 -0
  431. package/scripts/bongos/architect-audit.js +294 -0
  432. package/scripts/bongos/artifact-audit.js +326 -0
  433. package/scripts/bongos/artifact-format.js +203 -0
  434. package/scripts/bongos/artifact-staleness.js +267 -0
  435. package/scripts/bongos/ask.js +231 -0
  436. package/scripts/bongos/audit-authorship.sh +329 -0
  437. package/scripts/bongos/audit-deps.js +189 -0
  438. package/scripts/bongos/audit-gate.js +121 -0
  439. package/scripts/bongos/audit-rank-roles.js +172 -0
  440. package/scripts/bongos/audit-replay.sh +205 -0
  441. package/scripts/bongos/autobongos-digest.js +123 -0
  442. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  443. package/scripts/bongos/autobongos-loop.js +210 -0
  444. package/scripts/bongos/autobongos-run.js +1361 -0
  445. package/scripts/bongos/autobongos-service.cmd +50 -0
  446. package/scripts/bongos/autobongos-service.ps1 +270 -0
  447. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  448. package/scripts/bongos/autobongos-verify.js +618 -0
  449. package/scripts/bongos/autonomy-gate.js +135 -0
  450. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  451. package/scripts/bongos/autonomy-gauge.js +84 -0
  452. package/scripts/bongos/backfill-cost.js +176 -0
  453. package/scripts/bongos/backfill-disciplines.js +144 -0
  454. package/scripts/bongos/backfill-session-earnings.js +123 -0
  455. package/scripts/bongos/backfill-session-types.js +87 -0
  456. package/scripts/bongos/backfill-sessions.js +411 -0
  457. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  458. package/scripts/bongos/backfill-task-rewards.js +413 -0
  459. package/scripts/bongos/backlog-review.js +399 -0
  460. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  461. package/scripts/bongos/backup.js +116 -0
  462. package/scripts/bongos/baseline-staleness.js +217 -0
  463. package/scripts/bongos/bfg-principal-token.js +65 -0
  464. package/scripts/bongos/bug-attachment-audit.js +149 -0
  465. package/scripts/bongos/bug-attachment-recover.js +198 -0
  466. package/scripts/bongos/bug-triage.js +292 -0
  467. package/scripts/bongos/build-bongos.js +94 -0
  468. package/scripts/bongos/bump-version.js +221 -0
  469. package/scripts/bongos/capture.js +481 -0
  470. package/scripts/bongos/category-advisory-guard.js +206 -0
  471. package/scripts/bongos/ci-grade.js +82 -0
  472. package/scripts/bongos/claim-recall.js +112 -0
  473. package/scripts/bongos/claim.js +789 -0
  474. package/scripts/bongos/classify-discipline.js +153 -0
  475. package/scripts/bongos/claude-materialize.js +1200 -0
  476. package/scripts/bongos/claude-md-template.js +142 -0
  477. package/scripts/bongos/cleanup-orphans.js +74 -0
  478. package/scripts/bongos/cli-lib.js +1226 -0
  479. package/scripts/bongos/client-baseurl-guard.js +116 -0
  480. package/scripts/bongos/codemod-rename-scripts-gds.js +381 -0
  481. package/scripts/bongos/codemod-rename-src-gds.js +145 -0
  482. package/scripts/bongos/conductor-dispatch.js +535 -0
  483. package/scripts/bongos/context-pack.js +326 -0
  484. package/scripts/bongos/control-manifest.js +199 -0
  485. package/scripts/bongos/copy-apply.js +758 -0
  486. package/scripts/bongos/copy-inventory.js +571 -0
  487. package/scripts/bongos/core-origin-follow.js +185 -0
  488. package/scripts/bongos/core-pin-sync.js +260 -0
  489. package/scripts/bongos/coreB-carve-proof.sh +725 -0
  490. package/scripts/bongos/cost-report.js +63 -0
  491. package/scripts/bongos/cost.js +47 -0
  492. package/scripts/bongos/credential-presence.js +296 -0
  493. package/scripts/bongos/cutover-codemod.js +240 -0
  494. package/scripts/bongos/db-backup-nightly.sh +232 -0
  495. package/scripts/bongos/db-backup-offsite.sh +267 -0
  496. package/scripts/bongos/demote.js +45 -0
  497. package/scripts/bongos/deploy-divergence.js +454 -0
  498. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  499. package/scripts/bongos/design-sync.js +12 -0
  500. package/scripts/bongos/dev-box-guard.js +166 -0
  501. package/scripts/bongos/dev-lib.js +722 -0
  502. package/scripts/bongos/dev.js +645 -0
  503. package/scripts/bongos/device-flow-help.js +72 -0
  504. package/scripts/bongos/diagnose-achievements.js +118 -0
  505. package/scripts/bongos/diagram-facts.js +355 -0
  506. package/scripts/bongos/discord-channels.js +77 -0
  507. package/scripts/bongos/do-api.js +109 -0
  508. package/scripts/bongos/doc-cli-guard.js +274 -0
  509. package/scripts/bongos/doc-comment-coverage.js +139 -0
  510. package/scripts/bongos/doc-control-claims.js +170 -0
  511. package/scripts/bongos/docs-entropy.js +453 -0
  512. package/scripts/bongos/doctor.js +493 -0
  513. package/scripts/bongos/enroll-control-plane.js +101 -0
  514. package/scripts/bongos/exec-path-guard.js +564 -0
  515. package/scripts/bongos/feedback-send.js +249 -0
  516. package/scripts/bongos/fetch-art-key.js +106 -0
  517. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  518. package/scripts/bongos/figma-design-sync.js +11 -0
  519. package/scripts/bongos/find-untested.js +371 -0
  520. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  521. package/scripts/bongos/fitness-checks-identity.js +343 -0
  522. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  523. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  524. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  525. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  526. package/scripts/bongos/fitness-lib.js +127 -0
  527. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  528. package/scripts/bongos/fitness-ratchets.js +594 -0
  529. package/scripts/bongos/fitness.js +1498 -0
  530. package/scripts/bongos/forwarder.js +80 -0
  531. package/scripts/bongos/gate-review.js +330 -0
  532. package/scripts/bongos/gating.js +348 -0
  533. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  534. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  535. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  537. package/scripts/bongos/gds-literal-scan.js +196 -0
  538. package/scripts/bongos/gen-api-client.js +576 -0
  539. package/scripts/bongos/gen-api-docs.js +1111 -0
  540. package/scripts/bongos/gen-atlas.js +366 -0
  541. package/scripts/bongos/gen-diagrams.js +608 -0
  542. package/scripts/bongos/gen-file-map.js +337 -0
  543. package/scripts/bongos/gen-freshness.js +32 -0
  544. package/scripts/bongos/gen-interaction-posture.js +122 -0
  545. package/scripts/bongos/gen-repo-map.js +540 -0
  546. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  547. package/scripts/bongos/gen-session-index.js +243 -0
  548. package/scripts/bongos/gen-sounds.js +176 -0
  549. package/scripts/bongos/git-merge-regen.js +254 -0
  550. package/scripts/bongos/go-live.js +1071 -0
  551. package/scripts/bongos/goal-names.js +102 -0
  552. package/scripts/bongos/goal.js +272 -0
  553. package/scripts/bongos/government-walk.js +1477 -0
  554. package/scripts/bongos/grade-correlation-audit.js +310 -0
  555. package/scripts/bongos/grade-replay.js +237 -0
  556. package/scripts/bongos/grade-smoke.js +205 -0
  557. package/scripts/bongos/home-isolation-guard.js +126 -0
  558. package/scripts/bongos/hooks/pre-push.js +211 -0
  559. package/scripts/bongos/howto.js +145 -0
  560. package/scripts/bongos/http-api-client.js +81 -0
  561. package/scripts/bongos/identity-strip.js +75 -0
  562. package/scripts/bongos/init.js +1159 -0
  563. package/scripts/bongos/install-git-hooks.js +200 -0
  564. package/scripts/bongos/instance-apex.js +38 -0
  565. package/scripts/bongos/intent-retry.js +52 -0
  566. package/scripts/bongos/key-card.js +222 -0
  567. package/scripts/bongos/key-status.js +126 -0
  568. package/scripts/bongos/land-watch.js +201 -0
  569. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  570. package/scripts/bongos/learning-capture.js +145 -0
  571. package/scripts/bongos/lib.sh +74 -0
  572. package/scripts/bongos/linkify-refs.js +655 -0
  573. package/scripts/bongos/lint-infra-exec.js +70 -0
  574. package/scripts/bongos/lint-migrations.js +102 -0
  575. package/scripts/bongos/lint-workflow-exec.js +63 -0
  576. package/scripts/bongos/local-preview-lib.js +128 -0
  577. package/scripts/bongos/local-preview.js +82 -0
  578. package/scripts/bongos/login.js +360 -0
  579. package/scripts/bongos/main-audit.js +625 -0
  580. package/scripts/bongos/me.js +97 -0
  581. package/scripts/bongos/memory-map.js +176 -0
  582. package/scripts/bongos/merge-lock.js +71 -0
  583. package/scripts/bongos/migration-namespace.js +313 -0
  584. package/scripts/bongos/mirror-lineage-check.js +343 -0
  585. package/scripts/bongos/mirror-redact.js +350 -0
  586. package/scripts/bongos/module-artifact.js +289 -0
  587. package/scripts/bongos/module-assess-docs.js +238 -0
  588. package/scripts/bongos/module-assess-installs.js +228 -0
  589. package/scripts/bongos/module-assess-score.js +111 -0
  590. package/scripts/bongos/module-assess-security.js +252 -0
  591. package/scripts/bongos/module-assess-tests.js +278 -0
  592. package/scripts/bongos/module-assess-version.js +92 -0
  593. package/scripts/bongos/module-error-report.js +148 -0
  594. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  595. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  596. package/scripts/bongos/module-test-runner.js +414 -0
  597. package/scripts/bongos/module.js +1376 -0
  598. package/scripts/bongos/move-escalation.js +141 -0
  599. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  600. package/scripts/bongos/newcomer-floor.js +421 -0
  601. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  602. package/scripts/bongos/newcomer-floor.test.js +235 -0
  603. package/scripts/bongos/next-number.js +163 -0
  604. package/scripts/bongos/oauth-secret.js +202 -0
  605. package/scripts/bongos/onboard.js +267 -0
  606. package/scripts/bongos/onboarding-analyze.js +226 -0
  607. package/scripts/bongos/onboarding-config.js +179 -0
  608. package/scripts/bongos/onboarding-ship.js +92 -0
  609. package/scripts/bongos/pack-env-prefix.js +73 -0
  610. package/scripts/bongos/package-core.js +1200 -0
  611. package/scripts/bongos/page-inventory.js +348 -0
  612. package/scripts/bongos/page-reader.js +722 -0
  613. package/scripts/bongos/paste-token.js +212 -0
  614. package/scripts/bongos/plain-cards.js +351 -0
  615. package/scripts/bongos/portability-smoke-art.sh +85 -0
  616. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  617. package/scripts/bongos/preflight.js +214 -0
  618. package/scripts/bongos/probe-cache.js +246 -0
  619. package/scripts/bongos/prove-strict-versioning.js +284 -0
  620. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  621. package/scripts/bongos/provision-byo-host.js +68 -0
  622. package/scripts/bongos/provision-capacity.js +79 -0
  623. package/scripts/bongos/provision-caps.js +63 -0
  624. package/scripts/bongos/provision-config.js +233 -0
  625. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  626. package/scripts/bongos/provision-disconnect.js +88 -0
  627. package/scripts/bongos/provision-github-setup.js +168 -0
  628. package/scripts/bongos/provision-net.js +357 -0
  629. package/scripts/bongos/provision-pin-key.js +176 -0
  630. package/scripts/bongos/provision-pin-replay.js +126 -0
  631. package/scripts/bongos/provision-process.js +170 -0
  632. package/scripts/bongos/provision-render.js +201 -0
  633. package/scripts/bongos/provision-repo-auth.js +164 -0
  634. package/scripts/bongos/provision-repo-private.js +98 -0
  635. package/scripts/bongos/provision-repo.js +1337 -0
  636. package/scripts/bongos/provision-teardown.js +106 -0
  637. package/scripts/bongos/provision-units.js +469 -0
  638. package/scripts/bongos/provision.js +1479 -0
  639. package/scripts/bongos/publish-credential-check.js +66 -0
  640. package/scripts/bongos/publish-integration-gate.js +142 -0
  641. package/scripts/bongos/publish-manifest.js +440 -0
  642. package/scripts/bongos/publish-watch.js +268 -0
  643. package/scripts/bongos/pulse.js +336 -0
  644. package/scripts/bongos/push-main.js +56 -0
  645. package/scripts/bongos/push-path-brief.js +100 -0
  646. package/scripts/bongos/read-session-export.js +359 -0
  647. package/scripts/bongos/reauth.js +155 -0
  648. package/scripts/bongos/recall.js +183 -0
  649. package/scripts/bongos/redteam-patrol.js +437 -0
  650. package/scripts/bongos/regen-instance-docs.js +47 -0
  651. package/scripts/bongos/release-core.js +80 -0
  652. package/scripts/bongos/release-notes.js +271 -0
  653. package/scripts/bongos/release.js +139 -0
  654. package/scripts/bongos/rename-goals.js +109 -0
  655. package/scripts/bongos/rename-history-check.js +369 -0
  656. package/scripts/bongos/rename-ledger-prose.js +482 -0
  657. package/scripts/bongos/render-api.js +197 -0
  658. package/scripts/bongos/render-check.js +206 -0
  659. package/scripts/bongos/render-ideas.js +226 -0
  660. package/scripts/bongos/render-payload.js +85 -0
  661. package/scripts/bongos/repo-metrics.js +363 -0
  662. package/scripts/bongos/review-sheet.js +108 -0
  663. package/scripts/bongos/role-pack-guard.js +142 -0
  664. package/scripts/bongos/route-shadow-guard.js +175 -0
  665. package/scripts/bongos/routine-schedule.js +283 -0
  666. package/scripts/bongos/run-routine.js +257 -0
  667. package/scripts/bongos/run-unit-tests.js +654 -0
  668. package/scripts/bongos/runner-drift.js +151 -0
  669. package/scripts/bongos/sandbox-stage.js +459 -0
  670. package/scripts/bongos/scope-map-guard.js +300 -0
  671. package/scripts/bongos/scope-roster-guard.js +118 -0
  672. package/scripts/bongos/seam-wiring-guard.js +275 -0
  673. package/scripts/bongos/search-ingest-db.js +288 -0
  674. package/scripts/bongos/search-ingest-md.js +269 -0
  675. package/scripts/bongos/seed-adopt-tasks.js +75 -0
  676. package/scripts/bongos/seed-api-contract-goal-tasks.js +141 -0
  677. package/scripts/bongos/seed-board-room-tasks.js +196 -0
  678. package/scripts/bongos/seed-bongos-app-tasks.js +294 -0
  679. package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +81 -0
  680. package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +100 -0
  681. package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +307 -0
  682. package/scripts/bongos/seed-bongos-module-system-tasks.js +346 -0
  683. package/scripts/bongos/seed-bongos-tasks.js +214 -0
  684. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  685. package/scripts/bongos/seed-bongos-v1-seo-tasks.js +104 -0
  686. package/scripts/bongos/seed-bv1-community-tasks.js +131 -0
  687. package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +133 -0
  688. package/scripts/bongos/seed-bv1-profile-page-tasks.js +161 -0
  689. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  690. package/scripts/bongos/seed-bv1-r01-delta-tasks.js +154 -0
  691. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  692. package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +277 -0
  693. package/scripts/bongos/seed-gds-v4-tasks.js +624 -0
  694. package/scripts/bongos/seed-governance-tasks.js +340 -0
  695. package/scripts/bongos/seed-medusa-tasks.js +440 -0
  696. package/scripts/bongos/seed-module-upstreaming.js +219 -0
  697. package/scripts/bongos/seed-productization-tasks.js +235 -0
  698. package/scripts/bongos/seed-project-admin-console-tasks.js +88 -0
  699. package/scripts/bongos/seed-provisioning-tasks.js +83 -0
  700. package/scripts/bongos/seed-staging.sh +117 -0
  701. package/scripts/bongos/seed-strict-versioning-tasks.js +275 -0
  702. package/scripts/bongos/seed-v2-world-tasks.js +283 -0
  703. package/scripts/bongos/seed-verify-criteria.js +124 -0
  704. package/scripts/bongos/sequence.js +597 -0
  705. package/scripts/bongos/session-cost.js +430 -0
  706. package/scripts/bongos/session-digest-build.js +293 -0
  707. package/scripts/bongos/session-digest.js +200 -0
  708. package/scripts/bongos/session-eval.js +631 -0
  709. package/scripts/bongos/session-transcript-build.js +155 -0
  710. package/scripts/bongos/session-transcript-upload.js +29 -0
  711. package/scripts/bongos/session.js +404 -0
  712. package/scripts/bongos/setup.js +646 -0
  713. package/scripts/bongos/ship-check.js +89 -0
  714. package/scripts/bongos/ship-deploy-target.js +393 -0
  715. package/scripts/bongos/ship-escalation.js +167 -0
  716. package/scripts/bongos/ship-finish.js +420 -0
  717. package/scripts/bongos/ship-flow.js +1217 -0
  718. package/scripts/bongos/ship-git.js +100 -0
  719. package/scripts/bongos/ship-grade-steps.js +547 -0
  720. package/scripts/bongos/ship-grade.js +426 -0
  721. package/scripts/bongos/ship-honesty.js +314 -0
  722. package/scripts/bongos/ship-io.js +139 -0
  723. package/scripts/bongos/ship-land.js +1130 -0
  724. package/scripts/bongos/ship-memory-sync.js +249 -0
  725. package/scripts/bongos/ship-merge-gate.js +225 -0
  726. package/scripts/bongos/ship-merge.js +466 -0
  727. package/scripts/bongos/ship-mode-ask.js +138 -0
  728. package/scripts/bongos/ship-mode-manual.js +54 -0
  729. package/scripts/bongos/ship-preflight-steps.js +399 -0
  730. package/scripts/bongos/ship-regen.js +292 -0
  731. package/scripts/bongos/ship-resume.js +201 -0
  732. package/scripts/bongos/ship-session-upload.js +313 -0
  733. package/scripts/bongos/ship-state.js +110 -0
  734. package/scripts/bongos/ship-surprise.js +84 -0
  735. package/scripts/bongos/ship-visual.js +75 -0
  736. package/scripts/bongos/ship.js +382 -0
  737. package/scripts/bongos/shipping-mode.js +71 -0
  738. package/scripts/bongos/skill-lint.js +250 -0
  739. package/scripts/bongos/skill-preflight.js +361 -0
  740. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  741. package/scripts/bongos/smoke-batch-release.sh +316 -0
  742. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  743. package/scripts/bongos/smoke-dependencies.sh +143 -0
  744. package/scripts/bongos/smoke-gds.js +256 -0
  745. package/scripts/bongos/smoke-write.sh +275 -0
  746. package/scripts/bongos/source-text-test-scan.js +106 -0
  747. package/scripts/bongos/spark.js +294 -0
  748. package/scripts/bongos/stale-worktrees.js +212 -0
  749. package/scripts/bongos/start-goals.js +102 -0
  750. package/scripts/bongos/start.js +1090 -0
  751. package/scripts/bongos/status.js +545 -0
  752. package/scripts/bongos/strand-watch.js +315 -0
  753. package/scripts/bongos/stranded-rows.js +200 -0
  754. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  755. package/scripts/bongos/surface.js +101 -0
  756. package/scripts/bongos/task.js +273 -0
  757. package/scripts/bongos/test-path-guard.js +99 -0
  758. package/scripts/bongos/triage.js +742 -0
  759. package/scripts/bongos/turn-end-sound.js +74 -0
  760. package/scripts/bongos/tweak-halt.js +70 -0
  761. package/scripts/bongos/tweak-renders.js +200 -0
  762. package/scripts/bongos/uat.js +120 -0
  763. package/scripts/bongos/ui-kit-transform.js +43 -0
  764. package/scripts/bongos/update-channel.js +512 -0
  765. package/scripts/bongos/update-sweep.js +829 -0
  766. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  767. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  768. package/scripts/bongos/upgrade-migrate.js +224 -0
  769. package/scripts/bongos/upgrade-operator.js +73 -0
  770. package/scripts/bongos/upgrade-outcome.js +174 -0
  771. package/scripts/bongos/upgrade.js +1499 -0
  772. package/scripts/bongos/validate-design.js +12 -0
  773. package/scripts/bongos/version-close.js +621 -0
  774. package/scripts/bongos/version-literal-guard.js +140 -0
  775. package/scripts/bongos/version-select.js +79 -0
  776. package/scripts/bongos/visual-review-nudge.js +39 -0
  777. package/scripts/bongos/wedge-remedy.js +174 -0
  778. package/scripts/bongos/worktree-claim-guard.js +130 -0
  779. package/scripts/bongos/worktree.js +449 -0
  780. package/scripts/discord/post.js +1 -1
  781. package/scripts/gds/README.md +9 -0
  782. package/scripts/gds/abandon.js +6 -136
  783. package/scripts/gds/accessibility-replay.js +5 -194
  784. package/scripts/gds/address-park-sweep.sh +7 -90
  785. package/scripts/gds/adopt-detect.js +5 -121
  786. package/scripts/gds/adopt-import.js +5 -109
  787. package/scripts/gds/adopt-preflight.js +5 -185
  788. package/scripts/gds/adr-namespace.js +5 -271
  789. package/scripts/gds/agent-invoke.js +5 -687
  790. package/scripts/gds/agents-sync.js +5 -500
  791. package/scripts/gds/api-alias-caller-scan.js +5 -255
  792. package/scripts/gds/api-artifacts.js +6 -0
  793. package/scripts/gds/api.js +6 -85
  794. package/scripts/gds/api.ps1 +8 -26
  795. package/scripts/gds/architect-audit.js +6 -293
  796. package/scripts/gds/artifact-audit.js +5 -324
  797. package/scripts/gds/artifact-format.js +6 -203
  798. package/scripts/gds/artifact-staleness.js +5 -265
  799. package/scripts/gds/ask.js +5 -229
  800. package/scripts/gds/audit-authorship.sh +7 -328
  801. package/scripts/gds/audit-deps.js +6 -188
  802. package/scripts/gds/audit-gate.js +5 -119
  803. package/scripts/gds/audit-rank-roles.js +6 -171
  804. package/scripts/gds/audit-replay.sh +7 -204
  805. package/scripts/gds/autobongos-digest.js +5 -121
  806. package/scripts/gds/autobongos-grade-cap.js +5 -186
  807. package/scripts/gds/autobongos-loop.js +5 -208
  808. package/scripts/gds/autobongos-run.js +5 -1359
  809. package/scripts/gds/autobongos-service.cmd +8 -49
  810. package/scripts/gds/autobongos-service.ps1 +8 -270
  811. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  812. package/scripts/gds/autobongos-verify.js +5 -616
  813. package/scripts/gds/autonomy-gate.js +5 -133
  814. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  815. package/scripts/gds/autonomy-gauge.js +5 -82
  816. package/scripts/gds/backfill-cost.js +6 -175
  817. package/scripts/gds/backfill-disciplines.js +5 -142
  818. package/scripts/gds/backfill-session-earnings.js +5 -121
  819. package/scripts/gds/backfill-session-types.js +5 -85
  820. package/scripts/gds/backfill-sessions.js +5 -409
  821. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  822. package/scripts/gds/backfill-task-rewards.js +5 -411
  823. package/scripts/gds/backlog-review.js +6 -398
  824. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  825. package/scripts/gds/backup.js +6 -115
  826. package/scripts/gds/baseline-staleness.js +5 -215
  827. package/scripts/gds/bfg-principal-token.js +6 -64
  828. package/scripts/gds/bug-attachment-audit.js +5 -147
  829. package/scripts/gds/bug-attachment-recover.js +5 -196
  830. package/scripts/gds/bug-triage.js +6 -291
  831. package/scripts/gds/build-bongos.js +5 -92
  832. package/scripts/gds/bump-version.js +5 -219
  833. package/scripts/gds/capture.js +6 -480
  834. package/scripts/gds/category-advisory-guard.js +5 -205
  835. package/scripts/gds/ci-grade.js +6 -81
  836. package/scripts/gds/claim-recall.js +6 -111
  837. package/scripts/gds/claim.js +6 -788
  838. package/scripts/gds/classify-discipline.js +6 -152
  839. package/scripts/gds/claude-materialize.js +5 -1198
  840. package/scripts/gds/claude-md-template.js +5 -140
  841. package/scripts/gds/cleanup-orphans.js +6 -73
  842. package/scripts/gds/cli-lib.js +6 -1204
  843. package/scripts/gds/client-baseurl-guard.js +5 -114
  844. package/scripts/gds/codemod-rename-src-gds.js +6 -144
  845. package/scripts/gds/conductor-dispatch.js +6 -534
  846. package/scripts/gds/context-pack.js +6 -325
  847. package/scripts/gds/control-manifest.js +5 -197
  848. package/scripts/gds/copy-apply.js +5 -756
  849. package/scripts/gds/copy-inventory.js +5 -569
  850. package/scripts/gds/core-origin-follow.js +5 -184
  851. package/scripts/gds/core-pin-sync.js +5 -258
  852. package/scripts/gds/coreB-carve-proof.sh +7 -724
  853. package/scripts/gds/cost-report.js +6 -62
  854. package/scripts/gds/cost.js +6 -46
  855. package/scripts/gds/credential-presence.js +5 -294
  856. package/scripts/gds/cutover-codemod.js +5 -239
  857. package/scripts/gds/db-backup-nightly.sh +7 -231
  858. package/scripts/gds/db-backup-offsite.sh +7 -266
  859. package/scripts/gds/demote.js +6 -44
  860. package/scripts/gds/deploy-divergence.js +6 -445
  861. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  862. package/scripts/gds/design-sync.js +5 -10
  863. package/scripts/gds/dev-box-guard.js +5 -164
  864. package/scripts/gds/dev-lib.js +5 -721
  865. package/scripts/gds/dev.js +5 -643
  866. package/scripts/gds/device-flow-help.js +5 -70
  867. package/scripts/gds/diagnose-achievements.js +5 -116
  868. package/scripts/gds/diagram-facts.js +6 -355
  869. package/scripts/gds/discord-channels.js +5 -75
  870. package/scripts/gds/do-api.js +6 -109
  871. package/scripts/gds/doc-cli-guard.js +5 -266
  872. package/scripts/gds/doc-comment-coverage.js +5 -137
  873. package/scripts/gds/doc-control-claims.js +5 -166
  874. package/scripts/gds/docs-entropy.js +5 -443
  875. package/scripts/gds/doctor.js +6 -492
  876. package/scripts/gds/enroll-control-plane.js +5 -99
  877. package/scripts/gds/exec-path-guard.js +5 -562
  878. package/scripts/gds/feedback-send.js +5 -247
  879. package/scripts/gds/fetch-art-key.js +5 -104
  880. package/scripts/gds/fetch-sound-prefs.js +5 -124
  881. package/scripts/gds/figma-design-sync.js +5 -9
  882. package/scripts/gds/find-untested.js +5 -369
  883. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  884. package/scripts/gds/fitness-checks-identity.js +5 -342
  885. package/scripts/gds/fitness-checks-packaging.js +5 -131
  886. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  887. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  888. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  889. package/scripts/gds/fitness-lib.js +5 -126
  890. package/scripts/gds/fitness-migration-contraction.js +5 -49
  891. package/scripts/gds/fitness-ratchets.js +5 -563
  892. package/scripts/gds/fitness.js +5 -1493
  893. package/scripts/gds/gate-review.js +5 -328
  894. package/scripts/gds/gating.js +5 -346
  895. package/scripts/gds/gds-literal-scan.js +5 -194
  896. package/scripts/gds/gen-api-client.js +5 -555
  897. package/scripts/gds/gen-api-docs.js +5 -1100
  898. package/scripts/gds/gen-atlas.js +5 -364
  899. package/scripts/gds/gen-diagrams.js +6 -607
  900. package/scripts/gds/gen-file-map.js +5 -335
  901. package/scripts/gds/gen-freshness.js +5 -31
  902. package/scripts/gds/gen-interaction-posture.js +5 -120
  903. package/scripts/gds/gen-repo-map.js +5 -538
  904. package/scripts/gds/gen-role-responsibilities.js +5 -133
  905. package/scripts/gds/gen-session-index.js +5 -241
  906. package/scripts/gds/gen-sounds.js +5 -174
  907. package/scripts/gds/git-merge-regen.js +6 -291
  908. package/scripts/gds/go-live.js +5 -1069
  909. package/scripts/gds/goal-names.js +5 -100
  910. package/scripts/gds/goal.js +6 -271
  911. package/scripts/gds/government-walk.js +5 -1475
  912. package/scripts/gds/grade-correlation-audit.js +5 -308
  913. package/scripts/gds/grade-replay.js +5 -235
  914. package/scripts/gds/grade-smoke.js +6 -204
  915. package/scripts/gds/home-isolation-guard.js +5 -125
  916. package/scripts/gds/hooks/pre-push.js +5 -209
  917. package/scripts/gds/howto.js +5 -143
  918. package/scripts/gds/http-api-client.js +6 -81
  919. package/scripts/gds/identity-strip.js +5 -74
  920. package/scripts/gds/init.js +5 -1157
  921. package/scripts/gds/install-git-hooks.js +5 -198
  922. package/scripts/gds/instance-apex.js +5 -37
  923. package/scripts/gds/intent-retry.js +5 -51
  924. package/scripts/gds/key-card.js +6 -221
  925. package/scripts/gds/key-status.js +5 -124
  926. package/scripts/gds/land-watch.js +5 -199
  927. package/scripts/gds/leak-scan-allowlist.js +5 -291
  928. package/scripts/gds/learning-capture.js +6 -144
  929. package/scripts/gds/lib.sh +7 -73
  930. package/scripts/gds/linkify-refs.js +6 -654
  931. package/scripts/gds/lint-infra-exec.js +5 -68
  932. package/scripts/gds/lint-migrations.js +5 -100
  933. package/scripts/gds/lint-workflow-exec.js +5 -61
  934. package/scripts/gds/local-preview-lib.js +6 -128
  935. package/scripts/gds/local-preview.js +6 -81
  936. package/scripts/gds/login.js +5 -358
  937. package/scripts/gds/main-audit.js +5 -623
  938. package/scripts/gds/me.js +6 -96
  939. package/scripts/gds/memory-map.js +5 -174
  940. package/scripts/gds/merge-lock.js +6 -70
  941. package/scripts/gds/migration-namespace.js +5 -311
  942. package/scripts/gds/mirror-lineage-check.js +5 -341
  943. package/scripts/gds/mirror-redact.js +5 -348
  944. package/scripts/gds/module-artifact.js +6 -289
  945. package/scripts/gds/module-assess-docs.js +6 -237
  946. package/scripts/gds/module-assess-installs.js +6 -227
  947. package/scripts/gds/module-assess-score.js +6 -110
  948. package/scripts/gds/module-assess-security.js +6 -251
  949. package/scripts/gds/module-assess-tests.js +6 -277
  950. package/scripts/gds/module-assess-version.js +6 -91
  951. package/scripts/gds/module-error-report.js +5 -146
  952. package/scripts/gds/module-test-runner.js +6 -413
  953. package/scripts/gds/module.js +5 -1374
  954. package/scripts/gds/move-escalation.js +5 -140
  955. package/scripts/gds/newcomer-floor.js +6 -420
  956. package/scripts/gds/newcomer-floor.test.js +6 -234
  957. package/scripts/gds/next-number.js +6 -162
  958. package/scripts/gds/oauth-secret.js +5 -200
  959. package/scripts/gds/onboard.js +5 -265
  960. package/scripts/gds/onboarding-analyze.js +6 -225
  961. package/scripts/gds/onboarding-config.js +6 -179
  962. package/scripts/gds/onboarding-ship.js +6 -91
  963. package/scripts/gds/pack-env-prefix.js +5 -72
  964. package/scripts/gds/package-core.js +5 -1102
  965. package/scripts/gds/page-inventory.js +5 -346
  966. package/scripts/gds/page-reader.js +5 -720
  967. package/scripts/gds/paste-token.js +6 -211
  968. package/scripts/gds/plain-cards.js +5 -350
  969. package/scripts/gds/portability-smoke-art.sh +7 -84
  970. package/scripts/gds/portability-smoke-memory.sh +7 -175
  971. package/scripts/gds/preflight.js +5 -212
  972. package/scripts/gds/probe-cache.js +5 -244
  973. package/scripts/gds/prove-strict-versioning.js +6 -283
  974. package/scripts/gds/provision-auto-upgrade.js +5 -161
  975. package/scripts/gds/provision-byo-host.js +5 -67
  976. package/scripts/gds/provision-capacity.js +5 -78
  977. package/scripts/gds/provision-caps.js +5 -62
  978. package/scripts/gds/provision-config.js +5 -232
  979. package/scripts/gds/provision-core-upgrade.js +5 -1165
  980. package/scripts/gds/provision-disconnect.js +5 -87
  981. package/scripts/gds/provision-github-setup.js +5 -167
  982. package/scripts/gds/provision-net.js +5 -356
  983. package/scripts/gds/provision-pin-key.js +5 -175
  984. package/scripts/gds/provision-pin-replay.js +5 -125
  985. package/scripts/gds/provision-process.js +5 -169
  986. package/scripts/gds/provision-render.js +5 -200
  987. package/scripts/gds/provision-repo-auth.js +5 -163
  988. package/scripts/gds/provision-repo-private.js +5 -97
  989. package/scripts/gds/provision-repo.js +5 -1336
  990. package/scripts/gds/provision-teardown.js +5 -105
  991. package/scripts/gds/provision-units.js +5 -468
  992. package/scripts/gds/provision.js +5 -1477
  993. package/scripts/gds/publish-credential-check.js +6 -65
  994. package/scripts/gds/publish-integration-gate.js +5 -140
  995. package/scripts/gds/publish-manifest.js +5 -437
  996. package/scripts/gds/publish-watch.js +5 -266
  997. package/scripts/gds/pulse.js +6 -335
  998. package/scripts/gds/push-main.js +5 -54
  999. package/scripts/gds/push-path-brief.js +5 -98
  1000. package/scripts/gds/read-session-export.js +5 -357
  1001. package/scripts/gds/reauth.js +6 -154
  1002. package/scripts/gds/recall.js +6 -182
  1003. package/scripts/gds/redteam-patrol.js +5 -435
  1004. package/scripts/gds/regen-instance-docs.js +5 -45
  1005. package/scripts/gds/release-core.js +5 -78
  1006. package/scripts/gds/release-notes.js +5 -270
  1007. package/scripts/gds/release.js +6 -138
  1008. package/scripts/gds/rename-goals.js +5 -107
  1009. package/scripts/gds/rename-history-check.js +5 -367
  1010. package/scripts/gds/rename-ledger-prose.js +5 -480
  1011. package/scripts/gds/render-api.js +5 -196
  1012. package/scripts/gds/render-check.js +5 -204
  1013. package/scripts/gds/render-ideas.js +6 -225
  1014. package/scripts/gds/render-payload.js +5 -84
  1015. package/scripts/gds/repo-metrics.js +6 -362
  1016. package/scripts/gds/review-sheet.js +5 -106
  1017. package/scripts/gds/role-pack-guard.js +5 -141
  1018. package/scripts/gds/route-shadow-guard.js +5 -173
  1019. package/scripts/gds/routine-schedule.js +5 -281
  1020. package/scripts/gds/run-routine.js +5 -255
  1021. package/scripts/gds/run-unit-tests.js +6 -659
  1022. package/scripts/gds/runner-drift.js +5 -149
  1023. package/scripts/gds/sandbox-stage.js +6 -458
  1024. package/scripts/gds/scope-map-guard.js +5 -299
  1025. package/scripts/gds/scope-roster-guard.js +5 -117
  1026. package/scripts/gds/seam-wiring-guard.js +5 -274
  1027. package/scripts/gds/search-ingest-db.js +6 -287
  1028. package/scripts/gds/search-ingest-md.js +6 -268
  1029. package/scripts/gds/seed-adopt-tasks.js +6 -74
  1030. package/scripts/gds/seed-api-contract-goal-tasks.js +6 -140
  1031. package/scripts/gds/seed-board-room-tasks.js +6 -196
  1032. package/scripts/gds/seed-bongos-app-tasks.js +6 -293
  1033. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +6 -80
  1034. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +6 -99
  1035. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +6 -306
  1036. package/scripts/gds/seed-bongos-module-system-tasks.js +6 -345
  1037. package/scripts/gds/seed-bongos-tasks.js +6 -213
  1038. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  1039. package/scripts/gds/seed-bongos-v1-seo-tasks.js +6 -104
  1040. package/scripts/gds/seed-bv1-community-tasks.js +6 -131
  1041. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +6 -133
  1042. package/scripts/gds/seed-bv1-profile-page-tasks.js +6 -161
  1043. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1044. package/scripts/gds/seed-bv1-r01-delta-tasks.js +6 -154
  1045. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1046. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +6 -277
  1047. package/scripts/gds/seed-gds-v4-tasks.js +6 -623
  1048. package/scripts/gds/seed-governance-tasks.js +6 -339
  1049. package/scripts/gds/seed-medusa-tasks.js +6 -439
  1050. package/scripts/gds/seed-module-upstreaming.js +5 -217
  1051. package/scripts/gds/seed-productization-tasks.js +6 -234
  1052. package/scripts/gds/seed-project-admin-console-tasks.js +6 -88
  1053. package/scripts/gds/seed-provisioning-tasks.js +6 -82
  1054. package/scripts/gds/seed-staging.sh +7 -116
  1055. package/scripts/gds/seed-strict-versioning-tasks.js +6 -274
  1056. package/scripts/gds/seed-v2-world-tasks.js +6 -282
  1057. package/scripts/gds/seed-verify-criteria.js +6 -124
  1058. package/scripts/gds/sequence.js +6 -596
  1059. package/scripts/gds/session-cost.js +6 -429
  1060. package/scripts/gds/session-digest-build.js +6 -293
  1061. package/scripts/gds/session-digest.js +6 -199
  1062. package/scripts/gds/session-eval.js +6 -630
  1063. package/scripts/gds/session-transcript-build.js +6 -155
  1064. package/scripts/gds/session-transcript-upload.js +6 -29
  1065. package/scripts/gds/session.js +6 -403
  1066. package/scripts/gds/setup.js +6 -645
  1067. package/scripts/gds/ship-check.js +5 -85
  1068. package/scripts/gds/ship-deploy-target.js +5 -392
  1069. package/scripts/gds/ship-escalation.js +5 -166
  1070. package/scripts/gds/ship-finish.js +5 -419
  1071. package/scripts/gds/ship-flow.js +5 -1216
  1072. package/scripts/gds/ship-git.js +5 -99
  1073. package/scripts/gds/ship-grade-steps.js +5 -546
  1074. package/scripts/gds/ship-grade.js +5 -425
  1075. package/scripts/gds/ship-honesty.js +5 -312
  1076. package/scripts/gds/ship-io.js +5 -138
  1077. package/scripts/gds/ship-land.js +5 -1129
  1078. package/scripts/gds/ship-memory-sync.js +5 -248
  1079. package/scripts/gds/ship-merge-gate.js +5 -224
  1080. package/scripts/gds/ship-merge.js +5 -465
  1081. package/scripts/gds/ship-mode-ask.js +5 -137
  1082. package/scripts/gds/ship-mode-manual.js +5 -53
  1083. package/scripts/gds/ship-preflight-steps.js +5 -398
  1084. package/scripts/gds/ship-regen.js +5 -313
  1085. package/scripts/gds/ship-resume.js +5 -200
  1086. package/scripts/gds/ship-session-upload.js +5 -312
  1087. package/scripts/gds/ship-state.js +5 -109
  1088. package/scripts/gds/ship-surprise.js +5 -83
  1089. package/scripts/gds/ship-visual.js +5 -74
  1090. package/scripts/gds/ship.js +5 -380
  1091. package/scripts/gds/shipping-mode.js +5 -69
  1092. package/scripts/gds/skill-lint.js +5 -248
  1093. package/scripts/gds/skill-preflight.js +5 -359
  1094. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1095. package/scripts/gds/smoke-batch-release.sh +7 -315
  1096. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1097. package/scripts/gds/smoke-dependencies.sh +7 -142
  1098. package/scripts/gds/smoke-gds.js +6 -255
  1099. package/scripts/gds/smoke-write.sh +7 -274
  1100. package/scripts/gds/source-text-test-scan.js +7 -0
  1101. package/scripts/gds/spark.js +6 -293
  1102. package/scripts/gds/stale-worktrees.js +5 -210
  1103. package/scripts/gds/start-goals.js +5 -101
  1104. package/scripts/gds/start.js +6 -1089
  1105. package/scripts/gds/status.js +6 -544
  1106. package/scripts/gds/strand-watch.js +5 -313
  1107. package/scripts/gds/stranded-rows.js +5 -198
  1108. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1109. package/scripts/gds/surface.js +5 -100
  1110. package/scripts/gds/task.js +6 -272
  1111. package/scripts/gds/test-path-guard.js +5 -97
  1112. package/scripts/gds/triage.js +6 -741
  1113. package/scripts/gds/turn-end-sound.js +5 -72
  1114. package/scripts/gds/tweak-halt.js +5 -68
  1115. package/scripts/gds/tweak-renders.js +5 -198
  1116. package/scripts/gds/uat.js +6 -119
  1117. package/scripts/gds/ui-kit-transform.js +5 -41
  1118. package/scripts/gds/update-channel.js +5 -510
  1119. package/scripts/gds/update-sweep.js +5 -827
  1120. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1121. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1122. package/scripts/gds/upgrade-migrate.js +5 -223
  1123. package/scripts/gds/upgrade-operator.js +6 -73
  1124. package/scripts/gds/upgrade-outcome.js +5 -173
  1125. package/scripts/gds/upgrade.js +5 -1497
  1126. package/scripts/gds/validate-design.js +5 -10
  1127. package/scripts/gds/version-close.js +6 -620
  1128. package/scripts/gds/version-literal-guard.js +5 -138
  1129. package/scripts/gds/version-select.js +5 -77
  1130. package/scripts/gds/visual-review-nudge.js +5 -38
  1131. package/scripts/gds/wedge-remedy.js +5 -173
  1132. package/scripts/gds/worktree-claim-guard.js +5 -129
  1133. package/scripts/gds/worktree.js +6 -448
  1134. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1135. package/scripts/hall-preview/server.js +2 -2
  1136. package/scripts/migrate.sh +3 -3
  1137. package/scripts/public-mirror-export.js +3 -3
  1138. package/scripts/setup-builder.js +7 -7
  1139. package/src/bongos/api-errors.js +1 -0
  1140. package/src/bongos/api-prefix.js +1 -1
  1141. package/src/bongos/auth-github.js +19 -3
  1142. package/src/bongos/auth-idp.js +7 -0
  1143. package/src/bongos/claim-attribution.js +2 -2
  1144. package/src/bongos/core-moves.js +1 -1
  1145. package/src/bongos/core-update.js +3 -3
  1146. package/src/bongos/craft-mode.js +2 -2
  1147. package/src/bongos/db-kernel.js +15 -3
  1148. package/src/bongos/db.js +30 -4
  1149. package/src/bongos/github-repos.js +1 -1
  1150. package/src/bongos/llm-cache.js +1 -1
  1151. package/src/bongos/llm-pricing.js +1 -1
  1152. package/src/bongos/metrics.js +1 -1
  1153. package/src/bongos/middleware/rate-limit.js +2 -2
  1154. package/src/bongos/module-listing.js +93 -1
  1155. package/src/bongos/module-scope-map.js +90 -85
  1156. package/src/bongos/module-store.js +1 -1
  1157. package/src/bongos/module-submissions.js +1 -1
  1158. package/src/bongos/optimizer.js +1 -1
  1159. package/src/bongos/package-registry.js +1 -1
  1160. package/src/bongos/path-match.js +1 -1
  1161. package/src/bongos/permission-path-check.js +3 -3
  1162. package/src/bongos/platform-visibility-gate.js +3 -5
  1163. package/src/bongos/prelaunch-gate.js +7 -6
  1164. package/src/bongos/route-rank-check.js +2 -2
  1165. package/src/bongos/routes/auth.js +15 -2
  1166. package/src/bongos/routes/backup.js +1 -1
  1167. package/src/bongos/routes/builders.js +29 -1
  1168. package/src/bongos/routes/me.js +49 -18
  1169. package/src/bongos/routes/modules.js +29 -9
  1170. package/src/bongos/routes/public.js +3 -72
  1171. package/src/bongos/schema-lag.js +1 -1
  1172. package/src/bongos/sensitive-surfaces.js +1 -1
  1173. package/src/bongos/serve-internal.js +65 -16
  1174. package/src/bongos/software-update.js +2 -2
  1175. package/src/bongos/upgrade-hold.js +3 -3
  1176. package/src/hall-look.js +6 -5
  1177. package/src/module-api.js +3 -3
  1178. package/src/module-loader/catalog.js +1 -1
  1179. package/src/module-loader/error-tally.js +3 -3
  1180. package/src/module-loader/manifest-schema.js +3 -3
  1181. package/src/platform-server.js +10 -0
  1182. package/src/role-responsibilities.js +1 -1
  1183. package/src/stale-timer.js +2 -2
  1184. package/tests/accessibility_replay.mjs +1 -1
  1185. package/tests/activity_rollup_order_db.mjs +1 -1
  1186. package/tests/activity_snapshots_db.mjs +1 -1
  1187. package/tests/adopt_detect.mjs +1 -1
  1188. package/tests/adopt_import.mjs +1 -1
  1189. package/tests/adopt_preflight.mjs +1 -1
  1190. package/tests/adr_0089_scope.mjs +10 -7
  1191. package/tests/adr_0162_citation.mjs +1 -1
  1192. package/tests/adr_0162_gate_citation.mjs +1 -1
  1193. package/tests/agent_invoke.mjs +1 -1
  1194. package/tests/agent_invoke_live.mjs +3 -3
  1195. package/tests/agents_cron_trigger.mjs +2 -2
  1196. package/tests/agents_roster.mjs +1 -1
  1197. package/tests/agents_sync.mjs +4 -4
  1198. package/tests/allow_rule_guard.mjs +20 -20
  1199. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1200. package/tests/api_alias_exceptions.mjs +7 -6
  1201. package/tests/api_artifacts.mjs +214 -0
  1202. package/tests/api_cli_flags.mjs +3 -3
  1203. package/tests/api_client.mjs +56 -54
  1204. package/tests/api_docs.mjs +30 -9
  1205. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1206. package/tests/api_msys_path_repair.mjs +2 -2
  1207. package/tests/architect.mjs +1 -1
  1208. package/tests/art_stage.mjs +2 -2
  1209. package/tests/artifact_audit.mjs +2 -2
  1210. package/tests/artifact_staleness.mjs +9 -9
  1211. package/tests/atlas.mjs +1 -1
  1212. package/tests/audit_deps.mjs +1 -1
  1213. package/tests/audit_gate.mjs +1 -1
  1214. package/tests/auth_flow_slice1.mjs +3 -3
  1215. package/tests/auth_inactive_builder.mjs +43 -5
  1216. package/tests/auth_session_expiry_db.mjs +16 -4
  1217. package/tests/auth_session_ttl.mjs +23 -0
  1218. package/tests/authorship_audit.mjs +2 -2
  1219. package/tests/autobongos_cadence.mjs +1 -1
  1220. package/tests/autobongos_fence.mjs +1 -1
  1221. package/tests/autobongos_grade_cap.mjs +2 -2
  1222. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1223. package/tests/autobongos_host_access.mjs +3 -3
  1224. package/tests/autobongos_loop.mjs +17 -17
  1225. package/tests/autobongos_service_ps1.mjs +3 -3
  1226. package/tests/autobongos_tweak_lane.mjs +2 -2
  1227. package/tests/autobongos_verify.mjs +2 -2
  1228. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1229. package/tests/autonomy_config_idle.mjs +1 -1
  1230. package/tests/autonomy_digest.mjs +1 -1
  1231. package/tests/autonomy_gate.mjs +1 -1
  1232. package/tests/autonomy_gauge.mjs +2 -2
  1233. package/tests/autonomy_runner_identity.mjs +1 -1
  1234. package/tests/backfill_sessions.mjs +8 -8
  1235. package/tests/backfill_subagent_rewards.mjs +1 -1
  1236. package/tests/backfill_task_rewards.mjs +2 -2
  1237. package/tests/backlog_review.mjs +3 -3
  1238. package/tests/baseline_staleness.mjs +2 -2
  1239. package/tests/bfg.mjs +11 -5
  1240. package/tests/bfg_write.mjs +20 -11
  1241. package/tests/blockers_hall.mjs +17 -5
  1242. package/tests/blockers_page_ui.mjs +56 -12
  1243. package/tests/bongos_dispatch.mjs +5 -5
  1244. package/tests/bongos_login.mjs +2 -2
  1245. package/tests/bug_attachment_audit.mjs +1 -1
  1246. package/tests/bug_attachment_recover.mjs +2 -2
  1247. package/tests/bug_triage.mjs +3 -3
  1248. package/tests/build_info.mjs +1 -1
  1249. package/tests/builder_tester_tag.mjs +184 -0
  1250. package/tests/bump_version.mjs +3 -3
  1251. package/tests/canonical_profile_url.mjs +1 -1
  1252. package/tests/capture_error_format.mjs +1 -1
  1253. package/tests/capture_goal_routing.mjs +2 -2
  1254. package/tests/category_advisory_guard.mjs +3 -3
  1255. package/tests/claim_error_surface.mjs +2 -2
  1256. package/tests/claim_from_task_and_home.mjs +1 -1
  1257. package/tests/claim_gate_open_blocker.mjs +7 -4
  1258. package/tests/claim_gate_rebase.mjs +12 -8
  1259. package/tests/claim_recall.mjs +4 -4
  1260. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1261. package/tests/claude_materialize.mjs +58 -58
  1262. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1263. package/tests/cli_allowlist_permissions.mjs +11 -11
  1264. package/tests/cli_dispatcher.mjs +2 -2
  1265. package/tests/cli_err_code.mjs +6 -6
  1266. package/tests/cli_exit_no_abort.mjs +7 -7
  1267. package/tests/cli_lib_formatters.mjs +2 -2
  1268. package/tests/cli_sessions.mjs +5 -5
  1269. package/tests/cli_surface.mjs +15 -15
  1270. package/tests/cli_token_reissue.mjs +2 -2
  1271. package/tests/client_baseurl_guard.mjs +1 -1
  1272. package/tests/client_bundle_route.mjs +35 -4
  1273. package/tests/cloud_bongos_pack.mjs +1 -1
  1274. package/tests/community_leaderboard_db.mjs +1 -1
  1275. package/tests/conductor.mjs +18 -18
  1276. package/tests/conflict_resolve.mjs +14 -16
  1277. package/tests/consumer_layout_boot.mjs +12 -12
  1278. package/tests/context_pack.mjs +6 -6
  1279. package/tests/control_manifest.mjs +4 -4
  1280. package/tests/copy_desk_page_reads.mjs +1 -1
  1281. package/tests/copy_desk_page_release.mjs +192 -0
  1282. package/tests/copy_inventory.mjs +2 -2
  1283. package/tests/core_auto_upgrade.mjs +1 -1
  1284. package/tests/core_move_notice.mjs +2 -2
  1285. package/tests/core_origin_follow.mjs +7 -7
  1286. package/tests/core_pin_sync.mjs +3 -3
  1287. package/tests/core_upgrade_door.mjs +2 -2
  1288. package/tests/core_upgrade_owner_door.mjs +34 -1
  1289. package/tests/core_upgrade_runner.mjs +19 -19
  1290. package/tests/credential_presence.mjs +2 -2
  1291. package/tests/credit_grant.mjs +3 -3
  1292. package/tests/credit_log_single_writer.mjs +5 -5
  1293. package/tests/criterion_ref_status.mjs +2 -2
  1294. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1295. package/tests/cutover_codemod.mjs +2 -4
  1296. package/tests/db_backup_nightly.mjs +1 -1
  1297. package/tests/db_backup_offsite.mjs +1 -1
  1298. package/tests/db_ownership_handover.mjs +2 -2
  1299. package/tests/dead_deps.mjs +3 -3
  1300. package/tests/dependency_advisory.mjs +1 -1
  1301. package/tests/deploy_audit_gate.mjs +4 -4
  1302. package/tests/deploy_divergence_line.mjs +36 -16
  1303. package/tests/deploy_page_projects.mjs +35 -4
  1304. package/tests/dev_lib.mjs +2 -2
  1305. package/tests/dev_windows.mjs +2 -2
  1306. package/tests/diagram_facts_offset.mjs +1 -1
  1307. package/tests/diagram_repo_slug.mjs +1 -1
  1308. package/tests/diff_derived_signals.mjs +2 -2
  1309. package/tests/dns_preflight.mjs +2 -2
  1310. package/tests/do_api.mjs +3 -3
  1311. package/tests/doc_cli_guard.mjs +28 -28
  1312. package/tests/doc_comment_coverage.mjs +1 -1
  1313. package/tests/doc_control_claims.mjs +11 -11
  1314. package/tests/docs_entropy.mjs +2 -2
  1315. package/tests/docs_openapi_route.mjs +8 -6
  1316. package/tests/doctor_hooks.mjs +1 -1
  1317. package/tests/edit_hints.mjs +3 -2
  1318. package/tests/effective_visibility_predicate.mjs +3 -3
  1319. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1320. package/tests/exec_path_guard.mjs +4 -4
  1321. package/tests/executed_closure.mjs +18 -12
  1322. package/tests/file_map.mjs +1 -1
  1323. package/tests/find_untested.mjs +13 -13
  1324. package/tests/first_admin_bootstrap.mjs +1 -1
  1325. package/tests/fitness.mjs +16 -16
  1326. package/tests/fitness_gds_ratchet.mjs +2 -2
  1327. package/tests/fitness_installed_core.mjs +3 -3
  1328. package/tests/fitness_no_raw_nul.mjs +1 -1
  1329. package/tests/fitness_ratchets.mjs +3 -3
  1330. package/tests/fitness_scope_roster.mjs +2 -2
  1331. package/tests/fitness_two_root.mjs +8 -8
  1332. package/tests/fixtures/accessibility-replay.json +5 -5
  1333. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1334. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1335. package/tests/fixtures/page-ledger.mjs +22 -0
  1336. package/tests/fixtures/session-506-digest.json +5 -5
  1337. package/tests/gate_approvals.mjs +50 -0
  1338. package/tests/gate_review.mjs +8 -8
  1339. package/tests/gating_review_retired.mjs +2 -2
  1340. package/tests/gen_freshness.mjs +3 -3
  1341. package/tests/git_guard.mjs +3 -3
  1342. package/tests/git_merge_regen.mjs +41 -65
  1343. package/tests/github_one_trip.mjs +4 -4
  1344. package/tests/github_pick_up.mjs +2 -2
  1345. package/tests/github_push_merge_driver.mjs +1 -1
  1346. package/tests/go_live.mjs +3 -2
  1347. package/tests/goal_category.mjs +1 -1
  1348. package/tests/goal_cli.mjs +2 -2
  1349. package/tests/goal_create_spec_entry.mjs +1 -1
  1350. package/tests/goal_invite_consent.mjs +3 -1
  1351. package/tests/goal_move.mjs +1 -1
  1352. package/tests/goal_names.mjs +2 -2
  1353. package/tests/goal_working_area.mjs +1 -1
  1354. package/tests/government_agent_asks.mjs +7 -7
  1355. package/tests/government_board_room_copy.mjs +6 -1
  1356. package/tests/government_board_view.mjs +39 -0
  1357. package/tests/government_board_vote_ui.mjs +39 -1
  1358. package/tests/government_config.mjs +2 -2
  1359. package/tests/government_live_proof_shape.mjs +1 -1
  1360. package/tests/government_protected_surfaces.mjs +54 -53
  1361. package/tests/government_require_permission.mjs +9 -1
  1362. package/tests/government_vanilla_boot.mjs +1 -1
  1363. package/tests/government_vocabulary.mjs +2 -2
  1364. package/tests/government_walk.mjs +2 -2
  1365. package/tests/grade_body_limit.mjs +6 -4
  1366. package/tests/grade_correlation_audit.mjs +3 -3
  1367. package/tests/grade_diff_hash.mjs +1 -1
  1368. package/tests/grade_engine_replay.mjs +2 -2
  1369. package/tests/grade_server_authoritative.mjs +1 -1
  1370. package/tests/grade_unavailable_display.mjs +1 -1
  1371. package/tests/grader.mjs +8 -24
  1372. package/tests/grader_generated_provenance.mjs +14 -14
  1373. package/tests/grader_no_artifact.mjs +1 -1
  1374. package/tests/grader_prompt_fencing.mjs +1 -1
  1375. package/tests/grader_quality_window_overflow.mjs +1 -1
  1376. package/tests/grader_reader_lens.mjs +3 -3
  1377. package/tests/grader_regrade_delta.mjs +1 -1
  1378. package/tests/grader_unbacked_score.mjs +2 -2
  1379. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1380. package/tests/hall_asset_cache.mjs +127 -0
  1381. package/tests/hall_audit.mjs +63 -0
  1382. package/tests/hall_board_world.mjs +20 -0
  1383. package/tests/hall_city_card_words.mjs +61 -0
  1384. package/tests/hall_client_request_shape.mjs +5 -1
  1385. package/tests/hall_home_ships_bounded.mjs +160 -0
  1386. package/tests/hall_landing_boot.mjs +15 -2
  1387. package/tests/hall_nav.mjs +33 -0
  1388. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1389. package/tests/hall_oversight_world.mjs +44 -4
  1390. package/tests/hall_palette.mjs +12 -9
  1391. package/tests/hall_preview_security.mjs +1 -1
  1392. package/tests/hall_profile_world.mjs +17 -0
  1393. package/tests/hall_reading_world.mjs +16 -1
  1394. package/tests/hall_roster_world.mjs +2 -1
  1395. package/tests/hall_studio_world.mjs +4 -1
  1396. package/tests/hall_work_history_id.mjs +39 -0
  1397. package/tests/held_tweak_reporting.mjs +4 -4
  1398. package/tests/helpers.mjs +3 -3
  1399. package/tests/home_attention_cards.mjs +2 -0
  1400. package/tests/home_bounded_reads.mjs +1 -1
  1401. package/tests/home_isolation_guard.mjs +1 -1
  1402. package/tests/hook_core_resolve.mjs +7 -7
  1403. package/tests/hook_user_agents.mjs +1 -1
  1404. package/tests/hooks_drain.mjs +2 -2
  1405. package/tests/host_topology_skips.mjs +1 -1
  1406. package/tests/howto_guide.mjs +1 -1
  1407. package/tests/howto_moments.mjs +3 -3
  1408. package/tests/hub_account_page.mjs +1 -1
  1409. package/tests/idea_capture_grades.mjs +2 -2
  1410. package/tests/idea_develop_spark.mjs +1 -1
  1411. package/tests/idea_filed_via.mjs +2 -2
  1412. package/tests/idea_ideate_full.mjs +1 -1
  1413. package/tests/idea_spark_mark.mjs +1 -1
  1414. package/tests/idea_spark_queue.mjs +1 -1
  1415. package/tests/idea_triage.mjs +1 -1
  1416. package/tests/idea_triage_grade.mjs +3 -3
  1417. package/tests/idea_vote_permission.mjs +113 -0
  1418. package/tests/idea_votes_fold_db.mjs +123 -0
  1419. package/tests/infra_exec_paths.mjs +12 -12
  1420. package/tests/init.mjs +2 -2
  1421. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1422. package/tests/instance_feedback.mjs +9 -9
  1423. package/tests/instance_mismatch_guard.mjs +2 -2
  1424. package/tests/integration_parked_ratchet.mjs +24 -2
  1425. package/tests/intent_retry.mjs +1 -1
  1426. package/tests/interaction_posture.mjs +3 -3
  1427. package/tests/invite_expiry_db.mjs +1 -1
  1428. package/tests/joinability_invite_only.mjs +1 -1
  1429. package/tests/karma_vote_lists.mjs +270 -0
  1430. package/tests/key-card.mjs +2 -2
  1431. package/tests/key-status.mjs +2 -2
  1432. package/tests/knip_ratchet_ambient.mjs +2 -2
  1433. package/tests/known_failing_ratchet.mjs +1 -1
  1434. package/tests/land_watch.mjs +2 -2
  1435. package/tests/landing_legal_pages.mjs +1 -1
  1436. package/tests/landing_page.mjs +2 -2
  1437. package/tests/leaderboard_roles.mjs +4 -1
  1438. package/tests/leak_scan_allowlist.mjs +8 -8
  1439. package/tests/leak_scan_fail_closed.mjs +1 -1
  1440. package/tests/lib_sh_resolution.mjs +9 -9
  1441. package/tests/lifecycle-card.mjs +7 -7
  1442. package/tests/linkify_check.mjs +2 -2
  1443. package/tests/linkify_refs.mjs +1 -1
  1444. package/tests/llm-cache-route.mjs +1 -1
  1445. package/tests/local_preview.mjs +2 -2
  1446. package/tests/main_audit.mjs +3 -3
  1447. package/tests/main_audit_attestation.mjs +1 -1
  1448. package/tests/main_audit_db_roster.mjs +2 -2
  1449. package/tests/main_worktree_busy_reason.mjs +3 -3
  1450. package/tests/markdown_line_endings.mjs +2 -2
  1451. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1452. package/tests/membership_kind_lockstep.mjs +1 -1
  1453. package/tests/memory_isolation.mjs +16 -8
  1454. package/tests/memory_map.mjs +2 -2
  1455. package/tests/memory_pull.mjs +33 -25
  1456. package/tests/merge_driver_register.mjs +3 -3
  1457. package/tests/migration_allocation.mjs +2 -2
  1458. package/tests/migration_namespace.mjs +1 -1
  1459. package/tests/migrations_forward_safe.mjs +1 -1
  1460. package/tests/mingle.mjs +1 -1
  1461. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1462. package/tests/mirror_lineage_proof.mjs +2 -2
  1463. package/tests/mirror_redact.mjs +4 -4
  1464. package/tests/missing_dep_classify.mjs +3 -3
  1465. package/tests/module-scope-map.mjs +22 -22
  1466. package/tests/module_api_lazy.mjs +1 -1
  1467. package/tests/module_assess_docs.mjs +2 -2
  1468. package/tests/module_assess_installs.mjs +3 -3
  1469. package/tests/module_assess_price_parity.mjs +5 -5
  1470. package/tests/module_assess_score.mjs +5 -5
  1471. package/tests/module_assess_security.mjs +4 -4
  1472. package/tests/module_assess_tests.mjs +3 -3
  1473. package/tests/module_assessments_migration.mjs +1 -1
  1474. package/tests/module_catalog.mjs +2 -2
  1475. package/tests/module_cli.mjs +3 -3
  1476. package/tests/module_entitlements.mjs +1 -1
  1477. package/tests/module_error_counts.mjs +1 -1
  1478. package/tests/module_install.mjs +4 -4
  1479. package/tests/module_loader.mjs +3 -1
  1480. package/tests/module_owned_tests.mjs +1 -1
  1481. package/tests/module_release_channels.mjs +1 -1
  1482. package/tests/module_store_howto.mjs +3 -3
  1483. package/tests/module_store_listing.mjs +139 -2
  1484. package/tests/module_store_publish.mjs +4 -4
  1485. package/tests/module_store_publish_route.mjs +1 -1
  1486. package/tests/module_store_reassess.mjs +1 -1
  1487. package/tests/module_store_registry_migration.mjs +1 -1
  1488. package/tests/module_test_runner.mjs +3 -3
  1489. package/tests/module_update.mjs +4 -4
  1490. package/tests/module_upgrade_updates.mjs +1 -1
  1491. package/tests/move_escalation.mjs +2 -2
  1492. package/tests/nav_permission_atoms.mjs +3 -2
  1493. package/tests/needs_rebase.mjs +7 -3
  1494. package/tests/newcomer_floor.mjs +1 -1
  1495. package/tests/newcomer_generator.mjs +48 -0
  1496. package/tests/next_number.mjs +1 -1
  1497. package/tests/no_artifact_escalation.mjs +3 -3
  1498. package/tests/npm_release_where.mjs +1 -1
  1499. package/tests/oauth_secret.mjs +2 -2
  1500. package/tests/onboard.mjs +6 -6
  1501. package/tests/onboarding_gate.mjs +2 -2
  1502. package/tests/opt_in_skill_modules.mjs +3 -3
  1503. package/tests/own_scope_guard.mjs +1 -1
  1504. package/tests/own_session_revoke.mjs +4 -1
  1505. package/tests/package_core.mjs +10 -11
  1506. package/tests/page_inventory.mjs +5 -5
  1507. package/tests/page_reader.mjs +7 -7
  1508. package/tests/page_tweak_hold.mjs +6 -6
  1509. package/tests/parallel-load.mjs +1 -1
  1510. package/tests/paste_token_api_base.mjs +1 -1
  1511. package/tests/paste_token_session_store.mjs +2 -2
  1512. package/tests/pending_invite_purge_db.mjs +1 -1
  1513. package/tests/permission_path.mjs +1 -1
  1514. package/tests/pin_replay.mjs +1 -1
  1515. package/tests/pin_write_key.mjs +7 -7
  1516. package/tests/plain_cards.mjs +15 -15
  1517. package/tests/pr_assign.mjs +1 -1
  1518. package/tests/pre_push_hook.mjs +3 -3
  1519. package/tests/preflight_checks.mjs +2 -2
  1520. package/tests/prelaunch_gate.mjs +1 -1
  1521. package/tests/privacy_matrix.mjs +1 -1
  1522. package/tests/probe_cache.mjs +6 -6
  1523. package/tests/profile_connections_ui.mjs +4 -3
  1524. package/tests/profile_fields.mjs +11 -1
  1525. package/tests/profile_privacy_owner_view.mjs +1 -1
  1526. package/tests/profile_role_headline.mjs +10 -9
  1527. package/tests/project_admin_console_model.mjs +1 -1
  1528. package/tests/projects_hub.mjs +1 -1
  1529. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1530. package/tests/promote_goal_id.mjs +6 -6
  1531. package/tests/promotion_sweep.mjs +1 -1
  1532. package/tests/provision.mjs +24 -24
  1533. package/tests/provision_account_identity.mjs +2 -2
  1534. package/tests/provision_byo_host.mjs +1 -1
  1535. package/tests/provision_caddy_wiring.mjs +2 -2
  1536. package/tests/provision_disconnect.mjs +2 -2
  1537. package/tests/provision_dns_first.mjs +1 -1
  1538. package/tests/provision_render.mjs +9 -9
  1539. package/tests/provision_repo_private.mjs +3 -3
  1540. package/tests/provision_resource_caps.mjs +5 -5
  1541. package/tests/provision_restart.mjs +3 -3
  1542. package/tests/provision_settings_apply.mjs +7 -7
  1543. package/tests/provision_teardown_address.mjs +2 -2
  1544. package/tests/provisioning_capacity.mjs +5 -5
  1545. package/tests/provisioning_credential_preflight.mjs +1 -1
  1546. package/tests/provisioning_disconnect.mjs +1 -1
  1547. package/tests/provisioning_error_note_scope.mjs +4 -4
  1548. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1549. package/tests/provisioning_planet_physics.mjs +16 -0
  1550. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1551. package/tests/provisioning_settings_env.mjs +1 -1
  1552. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1553. package/tests/public_mirror_export.mjs +1 -1
  1554. package/tests/publish_integration_gate.mjs +2 -2
  1555. package/tests/publish_manifest.mjs +6 -6
  1556. package/tests/publish_watch.mjs +1 -1
  1557. package/tests/push_path_brief.mjs +2 -2
  1558. package/tests/raise.mjs +248 -0
  1559. package/tests/rank_roles_audit.mjs +1 -1
  1560. package/tests/rank_tier_single_source.mjs +2 -2
  1561. package/tests/rate_limit_public.mjs +1 -1
  1562. package/tests/read_default_meter.mjs +2 -2
  1563. package/tests/read_session_export.mjs +1 -1
  1564. package/tests/rebase_gate_set_aside.mjs +1 -1
  1565. package/tests/recall_cli.mjs +1 -1
  1566. package/tests/recall_corpus_health.mjs +3 -2
  1567. package/tests/recall_hints.mjs +1 -1
  1568. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1569. package/tests/redteam_patrol.mjs +2 -2
  1570. package/tests/regrade_actual_minutes.mjs +2 -2
  1571. package/tests/regrade_eligibility.mjs +2 -2
  1572. package/tests/release_core.mjs +2 -2
  1573. package/tests/release_notes.mjs +4 -4
  1574. package/tests/rename_history_restraint.mjs +3 -3
  1575. package/tests/rename_ledger_prose.mjs +6 -6
  1576. package/tests/render_api.mjs +1 -1
  1577. package/tests/render_check.mjs +4 -4
  1578. package/tests/render_deploy.mjs +1 -1
  1579. package/tests/repo_info_binding.mjs +1 -1
  1580. package/tests/repo_map.mjs +5 -5
  1581. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1582. package/tests/reward_mode_surfacing.mjs +1 -1
  1583. package/tests/role_responsibilities.mjs +1 -1
  1584. package/tests/rot_inbox.mjs +10 -7
  1585. package/tests/route_permission_check.mjs +1 -1
  1586. package/tests/route_shadow_guard.mjs +1 -1
  1587. package/tests/route_validation.mjs +1 -1
  1588. package/tests/routine_capture_kind.mjs +6 -6
  1589. package/tests/routine_schedule.mjs +9 -9
  1590. package/tests/run_routine.mjs +5 -5
  1591. package/tests/run_routine_two_root.mjs +5 -5
  1592. package/tests/runner_drift.mjs +17 -17
  1593. package/tests/sandbox_stage.mjs +5 -5
  1594. package/tests/scope_map_guard.mjs +7 -7
  1595. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1596. package/tests/scripts_gds_forwarders.mjs +224 -0
  1597. package/tests/scrubber_corpus.mjs +2 -2
  1598. package/tests/seam_wiring_guard.mjs +1 -1
  1599. package/tests/search_ingest.mjs +2 -2
  1600. package/tests/search_ingest_db.mjs +1 -1
  1601. package/tests/search_ingest_nul.mjs +6 -6
  1602. package/tests/seed_verify_criteria.mjs +3 -3
  1603. package/tests/sequence.mjs +3 -3
  1604. package/tests/served_paths_shipped.mjs +3 -3
  1605. package/tests/session_506_regression.mjs +1 -1
  1606. package/tests/session_accessibility.mjs +1 -1
  1607. package/tests/session_caps.mjs +1 -1
  1608. package/tests/session_cost.mjs +1 -1
  1609. package/tests/session_digest.mjs +2 -2
  1610. package/tests/session_eval.mjs +6 -6
  1611. package/tests/session_index.mjs +1 -1
  1612. package/tests/session_records.mjs +4 -4
  1613. package/tests/session_rename_fallback.mjs +2 -2
  1614. package/tests/session_reward_on_land.mjs +7 -149
  1615. package/tests/session_reward_on_land_db.mjs +191 -0
  1616. package/tests/session_reward_reconcile.mjs +6 -88
  1617. package/tests/session_reward_reconcile_db.mjs +132 -0
  1618. package/tests/session_transcript.mjs +1 -1
  1619. package/tests/sessions_kit_pager.mjs +2 -1
  1620. package/tests/setup_device_flow_fallback.mjs +2 -2
  1621. package/tests/setup_smoke.mjs +12 -5
  1622. package/tests/setup_status_facts.mjs +54 -12
  1623. package/tests/ship_autolinkify.mjs +2 -2
  1624. package/tests/ship_automerge_injection.mjs +1 -1
  1625. package/tests/ship_base_flag.mjs +1 -1
  1626. package/tests/ship_broadcast_routing.mjs +1 -1
  1627. package/tests/ship_broadcast_server.mjs +2 -2
  1628. package/tests/ship_builder_model.mjs +1 -1
  1629. package/tests/ship_cannot_lie.mjs +9 -9
  1630. package/tests/ship_card.mjs +2 -2
  1631. package/tests/ship_ci_deploy.mjs +7 -7
  1632. package/tests/ship_error_shape.mjs +1 -1
  1633. package/tests/ship_land_ci_not_started.mjs +3 -3
  1634. package/tests/ship_land_conflict.mjs +3 -3
  1635. package/tests/ship_land_proof.mjs +3 -3
  1636. package/tests/ship_land_red_pr.mjs +5 -5
  1637. package/tests/ship_merge_gate.mjs +14 -14
  1638. package/tests/ship_mode.mjs +1 -1
  1639. package/tests/ship_mode_first_ship.mjs +4 -4
  1640. package/tests/ship_mode_hands_off.mjs +8 -8
  1641. package/tests/ship_post_land_verify.mjs +1 -1
  1642. package/tests/ship_preflight.mjs +19 -19
  1643. package/tests/ship_premerge.mjs +1 -1
  1644. package/tests/ship_publish_error.mjs +2 -2
  1645. package/tests/ship_push_diagnosis.mjs +1 -1
  1646. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1647. package/tests/ship_resume.mjs +4 -4
  1648. package/tests/ship_smoke_gate.mjs +1 -1
  1649. package/tests/ship_upload_skip.mjs +1 -1
  1650. package/tests/ship_upstream_deletion.mjs +1 -1
  1651. package/tests/ship_vendored_instance.mjs +8 -8
  1652. package/tests/ship_visual_regrade.mjs +3 -3
  1653. package/tests/ship_zero_commit.mjs +1 -1
  1654. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1655. package/tests/skill_friction_kind.mjs +1 -1
  1656. package/tests/skill_grade_recover.mjs +1 -1
  1657. package/tests/skill_grader_health.mjs +1 -1
  1658. package/tests/skill_lint.mjs +1 -1
  1659. package/tests/skill_menu_ruling.mjs +1 -1
  1660. package/tests/skill_preflight.mjs +7 -7
  1661. package/tests/skip_is_not_pass.mjs +22 -1
  1662. package/tests/smoke_dependencies_witness.mjs +2 -2
  1663. package/tests/smoke_preflight.mjs +1 -1
  1664. package/tests/smoke_target.mjs +2 -2
  1665. package/tests/smoke_write_contract.mjs +2 -2
  1666. package/tests/sound_player.mjs +8 -8
  1667. package/tests/source_text_test_ratchet.mjs +97 -0
  1668. package/tests/speciality_corpus_scope.mjs +1 -1
  1669. package/tests/speciality_session_skills.mjs +1 -1
  1670. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1671. package/tests/stale_timer.mjs +3 -3
  1672. package/tests/stale_worktrees.mjs +1 -1
  1673. package/tests/start_env_guard.mjs +1 -1
  1674. package/tests/start_goal_first.mjs +3 -3
  1675. package/tests/start_inbox_count.mjs +1 -1
  1676. package/tests/start_rebase_warning.mjs +1 -1
  1677. package/tests/status_default_version.mjs +3 -3
  1678. package/tests/status_mirror_sync.mjs +1 -1
  1679. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1680. package/tests/stop_refcheck.mjs +1 -1
  1681. package/tests/strand_watch.mjs +1 -1
  1682. package/tests/stranded_rows.mjs +1 -1
  1683. package/tests/stuck_detector.mjs +14 -14
  1684. package/tests/sweep_app_account.mjs +3 -3
  1685. package/tests/task_cli.mjs +2 -2
  1686. package/tests/task_detail_ui.mjs +11 -1
  1687. package/tests/task_discipline_required.mjs +2 -2
  1688. package/tests/task_list_paging.mjs +1 -1
  1689. package/tests/task_visual_slots.mjs +2 -2
  1690. package/tests/terms_acceptance.mjs +1 -1
  1691. package/tests/terms_grandfather_db.mjs +1 -1
  1692. package/tests/test_path_guard.mjs +1 -1
  1693. package/tests/triage_development.mjs +1 -1
  1694. package/tests/tweak_batch_apply.mjs +2 -2
  1695. package/tests/tweak_land_heal.mjs +3 -3
  1696. package/tests/tweak_unattended.mjs +3 -3
  1697. package/tests/ui_design_skills.mjs +2 -2
  1698. package/tests/unit_report_status.mjs +2 -2
  1699. package/tests/unit_runner_serial.mjs +2 -2
  1700. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1701. package/tests/update_channel.mjs +2 -2
  1702. package/tests/update_channel_db.mjs +4 -4
  1703. package/tests/update_subscription_engine.mjs +26 -26
  1704. package/tests/update_sweep_home.mjs +14 -14
  1705. package/tests/upgrade.mjs +11 -11
  1706. package/tests/upgrade_artist_gate.mjs +4 -4
  1707. package/tests/upgrade_commit_identity.mjs +2 -2
  1708. package/tests/upgrade_migrate.mjs +7 -7
  1709. package/tests/upgrade_operator.mjs +2 -2
  1710. package/tests/upgrade_outcome.mjs +2 -2
  1711. package/tests/upgrade_persist_pin.mjs +5 -5
  1712. package/tests/upkeep_home.mjs +1 -1
  1713. package/tests/version_close.mjs +2 -2
  1714. package/tests/version_close_cli.mjs +2 -2
  1715. package/tests/version_close_route.mjs +1 -1
  1716. package/tests/version_literals.mjs +23 -23
  1717. package/tests/visual_review.mjs +5 -5
  1718. package/tests/wedge_remedy.mjs +5 -5
  1719. package/tests/welcome_boot.mjs +116 -0
  1720. package/tests/welcome_boot_browser.mjs +271 -0
  1721. package/tests/wizard_born_first_board.mjs +3 -3
  1722. package/tests/wizard_demo.mjs +1 -1
  1723. package/tests/wizard_one_page.mjs +4 -3
  1724. package/tests/wizard_physics.mjs +3 -1
  1725. package/tests/wizard_physics_more.mjs +42 -3
  1726. package/tests/work_title_wrap.mjs +1 -1
  1727. package/tests/workflow_exec_paths.mjs +6 -6
  1728. package/tests/worktree_claim_guard.mjs +1 -1
  1729. package/tests/worktree_helper.mjs +2 -2
  1730. package/tests/write_validation_gaps.mjs +3 -3
  1731. package/scripts/gds/api.sh +0 -6
  1732. package/scripts/gds/audit-exports.js +0 -128
  1733. package/scripts/gds/resolve-skill-model.js +0 -57
  1734. package/scripts/gds/security-baseline-check.sh +0 -180
  1735. package/scripts/gds/spike-task-map.js +0 -899
  1736. package/scripts/status-probe.mjs +0 -213
  1737. package/src/bongos/uptime-poller.js +0 -93
  1738. package/tests/government_fold_bench.mjs +0 -50
  1739. package/tests/spike_task_map.mjs +0 -422
  1740. package/tests/status-probe.mjs +0 -89
  1741. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1742. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1743. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1744. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -0,0 +1,1200 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // scripts/bongos/package-core.js — produce the Cloud Bongos CORE as a versioned,
5
+ // installable, PINNABLE artifact a downstream project vendors.
6
+ // GDS-V4 R84 (task 1688), implementing ADR 0100 §1 (the two-repo instance model).
7
+ //
8
+ // This is the FIRST step of the R84 → R85 → R86 spine: package the core (here) →
9
+ // stand Mercury up on a pinned core (R85, #1689) → make `bongos upgrade` a real
10
+ // update-consumption channel (R86, #1690). A Cloud Bongos *instance* may be a
11
+ // SEPARATE repository that installs a pinned version of this core and layers its
12
+ // own content/branding/modules on top (the physical realization of ADR 0062 §1).
13
+ //
14
+ // WHAT "the core" IS — reused, never re-defined:
15
+ // The core is exactly the subtree scripts/bongos/publish-manifest.isPublishable()
16
+ // already defines (ADR 0098) — the portable methodology + platform + neutral
17
+ // branding. There is NO second allow-list here; this tool CONSUMES that one.
18
+ //
19
+ // HOW IT DIFFERS FROM public-mirror-export.js (R72 / ADR 0099):
20
+ // - The mirror is the DELAYED (≈6-month), redacted, PUBLIC open-source surface —
21
+ // a whole separate git repo, published on a schedule. Its job is transparency,
22
+ // so it REDACTS every file (topology + brand kept out of a world-readable repo).
23
+ // - This artifact is a CURRENT, versioned, installable UNIT a downstream repo
24
+ // vendors + pins to a version. Its job is dependency consumption. No lag. It must
25
+ // BOOT, so functional files ship VERBATIM — redacting them corrupts npm integrity
26
+ // hashes + SQL identifiers (the R88 boot failure; task 1824). Only DOCS (.md) are
27
+ // genericized; brand/topology in code ships as-is (public, not secrets).
28
+ // The two share the same file SELECTION (isPublishable) and REUSE the same redaction
29
+ // primitives (redactBlob/findLeaks), but apply them differently — see processCoreFile.
30
+ //
31
+ // ONE FAIL-CLOSED PASS (task 1824 — docs redacted, functional verbatim):
32
+ // 1. Resolve the source ref → commit; enumerate its tree (git ls-tree).
33
+ // 2. PARTITION through isPublishable() — the single source of truth.
34
+ // 3. Per file, IN MEMORY (processCoreFile): DOCS (.md) are genericized + secret-scrubbed
35
+ // like the mirror; FUNCTIONAL files are kept VERBATIM and scanned only for an exact
36
+ // live-credential leak (brand/IP hits are non-fatal ADVISORIES, surfaced for a human).
37
+ // 3b. RELEASE NOTES (task 1004218): release-notes.json — what each release brought in,
38
+ // generated from the ref's HISTORY (scripts/bongos/release-notes.js), its prose redacted
39
+ // exactly like a doc, and pinned like every other file. Skipped, with a line saying
40
+ // so, where there is no history to read (--from-worktree, a shallow clone).
41
+ // 4. NO-LEAK GATE (fail-closed): if any DOC leaks post-redaction, or any FUNCTIONAL file
42
+ // carries a live credential verbatim, PRODUCE NOTHING — dist/ is never touched. The
43
+ // in-memory pass makes the abort atomic (same discipline as the mirror export).
44
+ // 5. Only when the whole set is clean: write the tree to
45
+ // dist/bongos-core-<version>/, the .tgz, and the pin MANIFEST.
46
+ //
47
+ // THE VERSION STAMP is the platform version — src/module-api.js CORE_VERSION,
48
+ // read via the SAME fail-soft accessor scripts/bongos/module.js + bongos upgrade use
49
+ // (task 1203). That shared coordinate is what keeps the R84→R86 spine coherent.
50
+ //
51
+ // THE PIN is `tree_sha256` in the manifest: a canonical hash over the redacted
52
+ // core files (path\0mode\0filehash per line, sorted). It is INDEPENDENT of the
53
+ // tar/gzip byte layout, so a consumer pins on { core_version, source_commit,
54
+ // tree_sha256 } and verifies an install by recomputing it from the unpacked tree.
55
+ // The manifest ALSO records tarball.sha256 to verify the exact downloaded bytes.
56
+ //
57
+ // USAGE:
58
+ // node scripts/bongos/package-core.js [--ref <git-ref> | --from-worktree] [--out-dir dist]
59
+ // [--version <v>] [--droplet-ip <ip>] [--self-verify [--self-verify-boot]] [--publish [--live]]
60
+ // Defaults: --ref HEAD, --out-dir dist, --version = platform CORE_VERSION.
61
+ // --from-worktree build from the files ON DISK instead of a commit, for a core checkout
62
+ // that carries no git history — which is exactly what the shipped
63
+ // self-host image is (.dockerignore excludes .git by design), and the
64
+ // only way the provisioning scaffold inside it can vendor a core into a
65
+ // child instance (task 1003995). Selection is unchanged (isPublishable);
66
+ // the artifact simply has no commit to anchor to, so source_commit is null
67
+ // and the tree_sha256 pin is the whole lineage. It packages what is ON DISK,
68
+ // which in the image is exactly what `COPY . .` put there — so on a DEV
69
+ // checkout prefer the ref build: measured on this repo the two select an
70
+ // IDENTICAL 2793-file set, but a Windows working tree hands back CRLF where
71
+ // the blob is LF, which changes every text file's hash and would ship a
72
+ // CRLF shebang. That is why rung 4 in provision-repo.js is reached only
73
+ // when there is no history to build from.
74
+ // --self-verify after building, prove the artifact reproduces its pin (unpack the .tgz,
75
+ // recompute tree_sha256 == manifest + verify tarball.sha256). Fatal on mismatch.
76
+ // (task 1002218 / audit H3) — deterministic + network-free.
77
+ // --self-verify-boot ALSO `npm install <tgz>` into a throwaway consumer + boot /healthz
78
+ // (reuses tests/consumer_layout_boot.mjs; needs npm/registry access).
79
+ // --no-leak-scan THE ONLY ESCAPE from the post-build leak scan: skips it entirely.
80
+ // The scan is FAIL-CLOSED by default — an un-allowlisted prior-instance
81
+ // literal in the built artifact aborts the build (task 1003870 / H6).
82
+ // --leak-scan-strict accepted as an explicit no-op; fatal IS the default since task
83
+ // 1003870. Kept so CI can state the intent it relies on out loud.
84
+ // Outputs (nothing is committed — dist/ is gitignored):
85
+ // dist/bongos-core-<version>/ the redacted core tree (inspectable)
86
+ // dist/bongos-core-<version>.tgz the installable unit
87
+ // dist/bongos-core-<version>.manifest.json the PIN (tree hash + per-file hashes)
88
+ // --publish after building, `npm publish` the .tgz as a PUBLIC scoped
89
+ // package (--access public). DRY-RUN unless --live is added
90
+ // (task 1003872 / ADR 0283, superseding ADR 0134's restricted
91
+ // posture). Needs `npm login` as a member of the @bongos org;
92
+ // this script holds no token.
93
+
94
+ const fs = require('node:fs');
95
+ const os = require('node:os');
96
+ const path = require('node:path');
97
+ const zlib = require('node:zlib');
98
+ const crypto = require('node:crypto');
99
+ const { execFileSync, spawnSync } = require('node:child_process');
100
+
101
+ const REPO_ROOT = path.resolve(__dirname, '..', '..');
102
+
103
+ // Reuse — never re-type. The core definition, the redaction, and the tree parser
104
+ // all already exist and are unit-tested at their homes.
105
+ const { isPublishable, PUBLISH_ALLOWLIST } = require(path.join(REPO_ROOT, 'scripts/bongos/publish-manifest.js'));
106
+ const { sha256hex, canonicalTreeHash, normalizeMode, octal, tarChecksum, ustarHeader, splitUstarName, buildTar } = require('./artifact-format');
107
+ const {
108
+ buildRedactionRules, collectSensitiveLiterals, findLeaks,
109
+ } = require(path.join(REPO_ROOT, 'scripts/bongos/mirror-redact.js'));
110
+ const { collectEnvSecrets } = require(path.join(REPO_ROOT, 'modules/security/secret-scrub.js'));
111
+ const { redactBlob, parseLsTree } = require(path.join(REPO_ROOT, 'scripts/public-mirror-export.js'));
112
+ const { partitionHits, unusedEntries } = require(path.join(REPO_ROOT, 'scripts/bongos/leak-scan-allowlist.js'));
113
+ // The release notes shipped beside package.json (task 1004218). Required by a literal path:
114
+ // the module is pure and requires nothing, so it adds no computed require to this file's
115
+ // executed closure (tests/executed_closure.mjs counts those).
116
+ const {
117
+ RELEASE_NOTES_FILE, RELEASE_NOTES_MAX_BYTES, generateReleaseNotes, boundReleaseNotes, serializeReleaseNotes,
118
+ } = require('./release-notes.js');
119
+
120
+ // The generated API spec, reference and typed client (task 1004866): gitignored, so never
121
+ // in a ref's tree — generated into every tarball by generateApiArtifacts() below.
122
+ const { API_ARTIFACT_PATHS } = require('./api-artifacts.js');
123
+
124
+ const MANIFEST_SCHEMA = 1;
125
+ const ARTIFACT_NAME = 'bongos-core';
126
+ // The tar internal root MUST be `package/` — that is the one hardcoded npm
127
+ // convention for an installable tarball (`npm install ./x.tgz` / `npm pack`
128
+ // output both use it; npm does not read the directory name to find package.json,
129
+ // it always looks for `package/package.json`). The ARTIFACT_NAME-named on-disk
130
+ // stage dir (stageDirName, below) is unrelated — that is just a local inspection
131
+ // path, not what ships inside the .tgz (ADR 0108 §2, task 1882).
132
+ const TAR_ROOT = 'package/';
133
+ // The self-describing manifest carried INSIDE the artifact (minus tarball.* — a
134
+ // file cannot contain its own hash). The authoritative PIN is the side-car next
135
+ // to the .tgz, which adds tarball.{sha256,bytes}.
136
+ const INNER_MANIFEST = `${TAR_ROOT}.bongos-core.json`;
137
+
138
+ // ---------------------------------------------------------------------------
139
+ // The platform version — read CORE_VERSION via the doorway, lazily + fail-soft,
140
+ // mirroring scripts/bongos/module.js:coreVersion() so this artifact stamps the SAME
141
+ // coordinate `bongos upgrade` and the module loader compare against (task 1203).
142
+ // ---------------------------------------------------------------------------
143
+ function coreVersion() {
144
+ try { return require(path.join(REPO_ROOT, 'src/module-api')).CORE_VERSION; }
145
+ catch { return '1.0.0'; }
146
+ }
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // Pure helpers (exported for tests — no I/O, no git, no network)
150
+ // ---------------------------------------------------------------------------
151
+
152
+
153
+ // ---------------------------------------------------------------------------
154
+ // CONSUMER-CORE extraction policy (task 1824) — the file-classification layer.
155
+ //
156
+ // The R84 packager wrongly reused the PUBLIC-MIRROR redaction (redactBlob) over EVERY
157
+ // file, which CORRUPTED the functional core: the secret scrubber blanks npm integrity
158
+ // hashes (base64 → looks secret) + Postgres identifiers (matched an env-secret substring),
159
+ // which broke `npm ci` and turned 63 migrations into `CREATE FUNCTION <redacted>()` SQL
160
+ // errors — the R88 boot failure (proof: docs/reviews/2026-07-03-cloud-bongos-separation-proof.md).
161
+ //
162
+ // The correction: the consumer core takes FUNCTIONAL files (code, SQL, JSON, lockfiles —
163
+ // everything that is not a .md doc) VERBATIM. Redaction stays a DOCS + public-mirror
164
+ // concern (ADR 0099). Brand identity (domain/owner/world) and the droplet IP legitimately
165
+ // pepper the functional core — hall-link comments (`example.com/builders#/task/N`), the
166
+ // `DROPLET` deploy constant in ship.js, seed migrations — and are PUBLIC, not secrets, so
167
+ // they ship as-is (a downstream instance rebrands via config) and are only WARNED about,
168
+ // never scrubbed or aborted-on. Aborting on them would fail ~189 files and the extraction
169
+ // would never succeed. The ONE hard gate on a functional file is an exact live-CREDENTIAL
170
+ // match (an env-secret VALUE appearing verbatim) — that IS a real leak. Genuine secrets are
171
+ // already kept out at SOURCE (husky + CI TruffleHog) and .env* is manifest-excluded, so this
172
+ // gate has ~zero false positives (a real high-entropy token never appears by accident).
173
+ // ---------------------------------------------------------------------------
174
+ const DOC_RE = /\.(md|markdown)$/i;
175
+ function isDocPath(p) { return DOC_RE.test(String(p || '')); }
176
+
177
+ // ---------------------------------------------------------------------------
178
+ // Agent-doc STUB (task 2121; surfaced by the 2026-07-08 demo task-creation audit).
179
+ // Claude Code AUTO-LOADS the nearest file named CLAUDE.md (or AGENTS.md) into the
180
+ // live session whenever an agent opens a sibling file. In a CONSUMER instance the
181
+ // core installs at node_modules/@bongos/core/, so the core repo's OWN CLAUDE.md tree
182
+ // (root + scripts/bongos + src/bongos + every module) would silently inject the
183
+ // platform's project memory — wrong project title, hundreds of lines, dangling links
184
+ // — into the instance's context the moment an agent reads any core file.
185
+ // The PUBLIC MIRROR deliberately publishes CLAUDE.md as the portable methodology
186
+ // (ADR 0065 §4), so this cannot live in the shared publish-manifest — it is a
187
+ // package-core-only transform. We keep the files PRESENT (nothing that probes for
188
+ // them by path breaks) but replace their body with a tiny, brand-free stub, turning
189
+ // the auto-load into a harmless "this doesn't govern you" redirect.
190
+ const AGENT_DOC_RE = /(^|\/)(CLAUDE|AGENTS)\.md$/i;
191
+ function isAgentDoc(p) { return AGENT_DOC_RE.test(String(p || '')); }
192
+ const CORE_AGENT_DOC_STUB = `# @bongos/core — installed platform dependency (not your project's CLAUDE.md)
193
+
194
+ This file is a placeholder shipped inside the **@bongos/core** package. The core's own
195
+ internal agent notes are intentionally omitted from the published artifact so they cannot
196
+ load into your instance's context.
197
+
198
+ **It does not govern this repository.** Your own root \`CLAUDE.md\`, your \`.claude/\`
199
+ directory, and the live Bongos database are the source of truth for how work happens here
200
+ and who may do what.
201
+
202
+ You are seeing this only because an agent opened a file under \`node_modules/@bongos/core/\`.
203
+ Nothing in here needs to be read to use the platform — run \`bongos help\` for commands.
204
+
205
+ _To work ON the platform core itself, use the standalone @bongos/core source repository,
206
+ not this vendored copy._
207
+ `;
208
+
209
+ // Fail-loud gate for a FUNCTIONAL file: only an exact live-credential value (an env-secret
210
+ // VALUE present verbatim, >= 8 chars) is a real leak. The sample is withheld (it's a secret).
211
+ function functionalSecretLeaks(view, envSecrets) {
212
+ const out = [];
213
+ for (const s of envSecrets || []) {
214
+ if (typeof s === 'string' && s.length >= 8 && view.includes(s)) out.push({ label: 'live-credential' });
215
+ }
216
+ return out;
217
+ }
218
+
219
+ // Classify + process one publishable file → { buf, leaks, advisories, kind }.
220
+ // * DOC (.md): genericized + secret-scrubbed like the mirror (redactBlob), gated with the
221
+ // full detector — a downstream's vendored ADRs/recipes should not carry this brand. Any
222
+ // residual leak after redaction is FATAL (`leaks`).
223
+ // * FUNCTIONAL: VERBATIM buffer. `leaks` = exact live-credential matches only (FATAL).
224
+ // `advisories` = brand-identity substrings + public IPs that ship as-is (non-fatal, for
225
+ // human awareness) — REUSES findLeaks so the detector is defined once.
226
+ function processCoreFile({ pathRel, raw, rules, sensitiveLiterals, envSecrets, knownDocNames }) {
227
+ // An auto-loaded agent doc (CLAUDE.md/AGENTS.md) → ship a brand-free stub, never the
228
+ // core's own project memory (task 2121). The stub is brand-free by construction, so it
229
+ // needs no redaction and can never leak — it short-circuits ahead of the doc path.
230
+ if (isAgentDoc(pathRel)) {
231
+ return { buf: Buffer.from(CORE_AGENT_DOC_STUB, 'utf8'), leaks: [], advisories: [], kind: 'stub' };
232
+ }
233
+ if (isDocPath(pathRel)) {
234
+ const r = redactBlob({ buf: raw, rules, sensitiveLiterals, envSecrets, knownDocNames });
235
+ const leaks = r.leaks.map((l) => ({ label: `doc:${l.label}`, sample: l.sample }));
236
+ if (r.secret) leaks.push({ label: 'doc:secret-shape' });
237
+ return { buf: r.buf, leaks, advisories: [], kind: 'doc' };
238
+ }
239
+ const view = raw.toString('latin1'); // ASCII-safe byte view for both text + binary
240
+ return {
241
+ buf: raw,
242
+ leaks: functionalSecretLeaks(view, envSecrets),
243
+ advisories: findLeaks(view, sensitiveLiterals),
244
+ kind: 'functional',
245
+ };
246
+ }
247
+
248
+ // ---------------------------------------------------------------------------
249
+ // npm-STRIPPED special files (idea 1000543) — the file-SELECTION gate that keeps
250
+ // the pin HONEST about what a consumer actually installs.
251
+ //
252
+ // `npm install <tgz>` never materializes certain special files into the installed
253
+ // package — most notably `.gitignore` (confirmed live: installing the 1.18.1 core
254
+ // .tgz drops exactly one file, ./.gitignore), plus `.npmignore` and `.npmrc`. But
255
+ // package-core enumerates the GIT tree, so isPublishable() happily selects a tracked
256
+ // `.gitignore`. If it lands in the manifest files[] + tree_sha256 pin, the tree a
257
+ // consumer recomputes over node_modules/@bongos/core is MISSING it → verifyInstalledPin
258
+ // (upgrade.js) reports `missing installed file: .gitignore` → hash mismatch → the bump
259
+ // auto-rolls-back. That breaks EVERY vendored `bongos upgrade` with pin-verify ON, and
260
+ // the unattended auto-upgrade subscription (task 2150 / ADR 0136) has no way to pass
261
+ // --skip-pin-verify — so it would roll back every patch (the fix reported in idea 1000543).
262
+ //
263
+ // The manifest must describe exactly what npm installs, so these files are dropped BEFORE
264
+ // they enter the tarball, filesMeta, or the pin (main(), below). Matched by BASENAME at any
265
+ // depth — npm strips nested ones too. The asymmetry is deliberately safe: excluding a file
266
+ // npm WOULD have kept only slightly weakens the pin (verifyInstalledPin iterates the manifest
267
+ // files[], so an un-pinned file is simply not checked); FAILING to exclude one npm strips is
268
+ // FATAL. And these files are useless inside a vendored dependency anyway.
269
+ const NPM_STRIPPED_BASENAMES = new Set(['.gitignore', '.npmignore', '.npmrc']);
270
+ function isNpmStripped(pathRel) {
271
+ const base = String(pathRel || '').split('/').pop();
272
+ return NPM_STRIPPED_BASENAMES.has(base);
273
+ }
274
+
275
+ // ---------------------------------------------------------------------------
276
+ // The CORE's own package.json + package-lock.json (task 1882, ADR 0108 §2).
277
+ //
278
+ // The source repo's package.json/package-lock.json (isPublishable() includes
279
+ // both) are GAME-heavy — colyseus/phaser/sharp/discord.js plus the repo's own
280
+ // name/version — and are not what a downstream `npm install @bongos/core`
281
+ // should see. These two files are SYNTHESIZED here (never copied verbatim from
282
+ // git) and staged in their place. Everything else still ships through the
283
+ // normal isPublishable()/processCoreFile path.
284
+ //
285
+ // Core deps are express + pg + pino (+ an undici pin) — ADR 0108 §Context.
286
+ // pino joined the core boot path with the structured logger (task 1003130:
287
+ // platform-server → serve-internal → routes → middleware/audit → logger); a
288
+ // published core without it crashes MODULE_NOT_FOUND at startup (task 1003160).
289
+ // discord.js (+ its undici requirement) is an OPTIONAL MODULE dependency, not
290
+ // core; a consumer that enables the discord module installs it itself.
291
+ const CORE_DEP_NAMES = ['express', 'pg', 'pino'];
292
+
293
+ // Pure — takes the source package.json's `dependencies`/`overrides` as plain
294
+ // objects so this is unit-testable with no disk I/O. Throws if a required core
295
+ // dep is missing from the source (a real inconsistency, not a silent drop).
296
+ function buildPackageJson({ version, sourceDeps, sourceOverrides }) {
297
+ const dependencies = {};
298
+ for (const name of CORE_DEP_NAMES) {
299
+ const range = sourceDeps && sourceDeps[name];
300
+ if (!range) throw new Error(`package-core: source package.json is missing required core dependency "${name}"`);
301
+ dependencies[name] = range;
302
+ }
303
+ const pkg = {
304
+ name: '@bongos/core',
305
+ version,
306
+ description: 'Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).',
307
+ license: 'AGPL-3.0-or-later',
308
+ main: 'src/platform-server.js',
309
+ bin: { bongos: 'bin/bongos.js' },
310
+ // Named exports a consumer imports directly, alongside the default entry
311
+ // (buildPlatformApp, from `main`). Two groups:
312
+ // • the platform surface — serve-internal (the shared host-routing surface
313
+ // both server.js and platform-server.js call) + the module-api doorway a
314
+ // module's routes/seams are authored against.
315
+ // • the GAME-HOST KIT (rehearsal F3, task 2161) — the core internals a
316
+ // game-bearing instance's own entrypoint (server.js, kept host per task
317
+ // 2134) wires directly: the API-404 shaping, the uptime poller, the module
318
+ // loader, the enabled-module gate, and the seam registry. A game-less
319
+ // instance boots via `.`/platform-server.js and never imports these; a game
320
+ // instance's server.js requires them, and the cutover codemod
321
+ // (scripts/bongos/cutover-codemod.js) rewrites its relative `./src/*` requires
322
+ // to exactly these subpaths. Every subpath the codemod's CORE_INTERNAL_MAP
323
+ // targets MUST appear here or the rewritten require won't resolve.
324
+ exports: {
325
+ '.': './src/platform-server.js',
326
+ './serve-internal': './src/bongos/serve-internal.js',
327
+ './module-api': './src/module-api.js',
328
+ './bongos/api-path-404': './src/bongos/api-path-404.js',
329
+ './module-loader/loader': './src/module-loader/loader.js',
330
+ './modules': './src/modules.js',
331
+ './module-seams': './src/module-seams.js',
332
+ },
333
+ engines: { node: '>=22' },
334
+ // Distribution posture: PUBLIC (task 1003872, ADR 0283 — supersedes ADR 0134's
335
+ // pre-launch `restricted`). The private posture existed so a pre-launch artifact
336
+ // could not leak; what it actually cost was that a tokenless `npm install` 404s,
337
+ // which broke every co-tenant upgrade, the nightly auto-upgrade sweep (silently,
338
+ // since 2026-08-25), and every newly scaffolded instance.
339
+ //
340
+ // The safety this replaces is NOT "nobody can read it" — it is the three gates
341
+ // that now run on every build: the branding/credential no-leak gate, the
342
+ // prior-instance leak scan (fatal by default since task 1003870), and the
343
+ // fixture confirmation of task 1003871. Those decide what is IN the tarball;
344
+ // access decides who may fetch it. Do not re-conflate them.
345
+ publishConfig: { access: 'public' },
346
+ dependencies,
347
+ };
348
+ if (sourceOverrides && sourceOverrides.undici) pkg.overrides = { undici: sourceOverrides.undici };
349
+ return pkg;
350
+ }
351
+
352
+ // ---------------------------------------------------------------------------
353
+ // package-lock.json pruning — restrict the shipped lockfile to the CORE's own
354
+ // dependency closure (express + pg), dropping the game's ~225 other transitive
355
+ // packages. Pure + OFFLINE: walks the EXISTING (already-resolved) lockfile
356
+ // graph with the same node_modules lookup order Node's own require() uses
357
+ // (check "<pkgPath>/node_modules/<dep>", then walk up stripping the trailing
358
+ // "node_modules/<segment>" and retry, up to the top-level "node_modules/<dep>")
359
+ // rather than re-resolving against the npm registry — so packaging never needs
360
+ // network access, and can never disagree with how the source lockfile itself
361
+ // was resolved (verified against the live 307-package lockfile: an 82-package
362
+ // closure, including the nested send/node_modules/ms version-conflict case).
363
+ // ---------------------------------------------------------------------------
364
+
365
+ // Resolve `depName` as required FROM `fromPath` (a "node_modules/..." packages
366
+ // key, or '' for the root) against `packages` — returns the matching key, or
367
+ // undefined if genuinely absent.
368
+ function resolveLockDep(packages, fromPath, depName) {
369
+ const segments = fromPath ? fromPath.split('/node_modules/') : [];
370
+ for (let i = segments.length; i >= 0; i--) {
371
+ const prefix = segments.slice(0, i).join('/node_modules/');
372
+ const candidate = prefix ? `${prefix}/node_modules/${depName}` : `node_modules/${depName}`;
373
+ if (packages[candidate]) return candidate;
374
+ }
375
+ return undefined;
376
+ }
377
+
378
+ // BFS the dependency + optionalDependency closure of `rootDepNames` from the
379
+ // lockfile root. Throws on an unresolvable dependency — a real lockfile
380
+ // inconsistency, not something to silently drop from the shipped artifact.
381
+ function lockfileClosure(packages, rootDepNames) {
382
+ const keep = new Set();
383
+ const queue = [];
384
+ for (const name of rootDepNames) {
385
+ const key = resolveLockDep(packages, '', name);
386
+ if (!key) throw new Error(`package-core: lockfile has no resolved entry for root dependency "${name}"`);
387
+ queue.push(key);
388
+ }
389
+ while (queue.length) {
390
+ const key = queue.shift();
391
+ if (keep.has(key)) continue;
392
+ keep.add(key);
393
+ const deps = { ...(packages[key].dependencies || {}), ...(packages[key].optionalDependencies || {}) };
394
+ for (const depName of Object.keys(deps)) {
395
+ const depKey = resolveLockDep(packages, key, depName);
396
+ if (!depKey) throw new Error(`package-core: lockfile has no resolved entry for "${depName}" required by "${key}"`);
397
+ if (!keep.has(depKey)) queue.push(depKey);
398
+ }
399
+ }
400
+ return keep;
401
+ }
402
+
403
+ // Pure — takes the already-parsed source lockfile + the CORE's own
404
+ // name/version/dependency-ranges (the same ranges buildPackageJson emitted, so
405
+ // the two files never drift). `rootDepNames` defaults to CORE_DEP_NAMES.
406
+ function prunePackageLock(sourceLock, { name, version, rootRanges, rootDepNames = CORE_DEP_NAMES }) {
407
+ const packages = sourceLock.packages || {};
408
+ const keep = lockfileClosure(packages, rootDepNames);
409
+ const prunedPackages = {
410
+ '': { name, version, license: 'AGPL-3.0-or-later', dependencies: { ...rootRanges } },
411
+ };
412
+ for (const key of [...keep].sort()) prunedPackages[key] = packages[key];
413
+ return {
414
+ name,
415
+ version,
416
+ lockfileVersion: sourceLock.lockfileVersion,
417
+ requires: true,
418
+ packages: prunedPackages,
419
+ };
420
+ }
421
+
422
+ // The PIN (canonicalTreeHash) and normalizeMode live in scripts/bongos/artifact-format.js
423
+ // (task 1004271) — the module store verifies with the same functions.
424
+
425
+ // The pin manifest (WITHOUT tarball.* — added by withTarballInfo for the side-car).
426
+ function buildCoreManifest({
427
+ version, coreContract, sourceCommit, sourceRef, builtAtIso, files, treeHash, redaction,
428
+ }) {
429
+ return {
430
+ artifact: ARTIFACT_NAME,
431
+ manifest_schema: MANIFEST_SCHEMA,
432
+ generator: 'scripts/bongos/package-core.js',
433
+ // core_version is the PIN coordinate (the platform version, task 1203).
434
+ // core_contract is the module-doorway semver (src/module-api CORE_VERSION);
435
+ // equal to core_version unless --version overrides. A module pinned to
436
+ // "^core_contract" is guaranteed to load against this core.
437
+ core_version: version,
438
+ core_contract: coreContract,
439
+ source_commit: sourceCommit,
440
+ source_ref: sourceRef,
441
+ built_at: builtAtIso,
442
+ redaction: redaction || null,
443
+ file_count: files.length,
444
+ // tree_sha256 is the authoritative integrity pin (see canonicalTreeHash).
445
+ tree_sha256: treeHash,
446
+ files: files.map((f) => ({ path: f.path, mode: normalizeMode(f.mode), sha256: f.sha256 })),
447
+ };
448
+ }
449
+
450
+ // The side-car pin = the inner manifest + the exact-bytes coordinate of THIS .tgz.
451
+ function withTarballInfo(manifest, tarball) {
452
+ return { ...manifest, tarball };
453
+ }
454
+
455
+ function tarballName(version) { return `${ARTIFACT_NAME}-${version}.tgz`; }
456
+ function manifestName(version) { return `${ARTIFACT_NAME}-${version}.manifest.json`; }
457
+ function stageDirName(version) { return `${ARTIFACT_NAME}-${version}`; }
458
+
459
+ // The ustar+gzip writer (buildTar and its header helpers) lives in
460
+ // scripts/bongos/artifact-format.js (task 1004271), shared with the module store.
461
+
462
+ // ---- the git-LESS source: enumerate the working tree (task 1003995) --------
463
+ //
464
+ // Everything below the enumeration step is already git-free, so the ONE thing that
465
+ // makes package-core unrunnable without history is `git ls-tree`. That matters because
466
+ // the shipped self-host image IS a core checkout with no `.git` (.dockerignore excludes
467
+ // it by design), and the provisioning scaffold inside it has no other way to build the
468
+ // tarball it vendors into a child instance — the fourth rung of the ladder in
469
+ // scripts/bongos/provision-repo.js.
470
+ //
471
+ // The walk starts at PUBLISH_ALLOWLIST's own entries rather than the repo root. The
472
+ // allowlist is already the single source of truth for what the core is, so starting
473
+ // there means node_modules/ and dist/ are never descended into at all. Selection still
474
+ // runs through isPublishable() in main(), so the denylist applies exactly as it does on
475
+ // the git path — this function only decides what is OFFERED, never what is kept.
476
+ //
477
+ // Rows match parseLsTree's shape ({ path, type, mode }) minus `sha`: there is no object
478
+ // to name, so main() reads these blobs off disk instead. Mode is derived the way git
479
+ // derives it — the executable bit and nothing else. fs injectable for tests.
480
+ function walkWorktreeEntries(root, { allow = PUBLISH_ALLOWLIST, fsImpl = fs } = {}) {
481
+ const out = [];
482
+ const addFile = (rel) => {
483
+ let st;
484
+ try { st = fsImpl.statSync(path.join(root, rel)); } catch { return; } // absent here → simply not in the core set
485
+ if (st.isFile()) out.push({ path: rel, type: 'blob', mode: (st.mode & 0o111) ? '100755' : '100644' });
486
+ };
487
+ const walk = (rel) => {
488
+ let children;
489
+ try { children = fsImpl.readdirSync(path.join(root, rel), { withFileTypes: true }); } catch { return; }
490
+ for (const child of children) {
491
+ const childRel = `${rel}/${child.name}`;
492
+ if (child.isDirectory()) walk(childRel);
493
+ else if (child.isFile()) addFile(childRel);
494
+ }
495
+ };
496
+ for (const entry of allow) {
497
+ if (entry.endsWith('/')) walk(entry.replace(/\/$/, ''));
498
+ else addFile(entry);
499
+ }
500
+ return out.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
501
+ }
502
+
503
+ // ---- generated API artifacts (task 1004866) -------------------------------
504
+ // The spec, reference and typed client are gitignored, so neither a ref's tree nor a fresh
505
+ // worktree carries them — yet every project is built from this tarball (ADR 0292) and serves
506
+ // /docs + /lib/bongos-client.js from it. So the build GENERATES them, from the very source
507
+ // files it is packing: those files are written to a throwaway tree, and the generators THAT
508
+ // tree carries (gen-api-docs.js, then gen-api-client.js) run there. A --ref build therefore
509
+ // documents the ref's routes, never whatever the working tree happens to hold.
510
+ //
511
+ // Fail-closed: a generator that exits non-zero, or a run that leaves any of the eight
512
+ // missing or empty, throws — the caller aborts the build rather than ship a core whose docs
513
+ // and client are silently absent. `run`, `fsImpl`, `tmpRoot` and `env` are injectable for tests.
514
+ //
515
+ // Executed path: the scripts run out of the throwaway tree, a runtime path. That is the point
516
+ // (a --ref build must document the ref's routes with the ref's generators), and it is safe for
517
+ // the same reason the build is: every byte in that tree is the source being packed, chosen by
518
+ // the maintainer running this CLI — nothing request-derived, and this never runs in the server
519
+ // (exec-path-guard.js scans the server tree only). *_INSTANCE_ROOT is stripped from the env.
520
+ function generateApiArtifacts(sources, {
521
+ run = (cmd, args, opts) => spawnSync(cmd, args, opts),
522
+ fsImpl = fs,
523
+ tmpRoot = os.tmpdir(),
524
+ env = process.env,
525
+ } = {}) {
526
+ const dir = fsImpl.mkdtempSync(path.join(tmpRoot, 'package-core-api-'));
527
+ try {
528
+ for (const { path: rel, buf } of sources) {
529
+ const abs = path.join(dir, rel);
530
+ fsImpl.mkdirSync(path.dirname(abs), { recursive: true });
531
+ fsImpl.writeFileSync(abs, buf);
532
+ }
533
+ // Strip any *_INSTANCE_ROOT pointer: it would redirect the generators' docs root out
534
+ // of the throwaway tree (the same hardening conflict-resolve.js applies).
535
+ const childEnv = {};
536
+ for (const [k, v] of Object.entries(env)) if (!/_INSTANCE_ROOT$/.test(k)) childEnv[k] = v;
537
+ for (const script of ['scripts/bongos/gen-api-docs.js', 'scripts/bongos/gen-api-client.js']) {
538
+ const r = run(process.execPath, [path.join(dir, script)], { cwd: dir, env: childEnv, encoding: 'utf8' });
539
+ if (!r || r.error || r.status !== 0) {
540
+ const why = r && r.error ? r.error.message : `exit ${r ? r.status : '?'}`;
541
+ const detail = r && r.stderr ? `: ${String(r.stderr).trim().split('\n').slice(-3).join(' | ')}` : '';
542
+ throw new Error(`${script} failed (${why})${detail}`);
543
+ }
544
+ }
545
+ const out = [];
546
+ for (const rel of API_ARTIFACT_PATHS) {
547
+ let buf;
548
+ try { buf = fsImpl.readFileSync(path.join(dir, rel)); } catch { throw new Error(`generation left no ${rel}`); }
549
+ if (!buf || buf.length === 0) throw new Error(`generation left ${rel} empty`);
550
+ out.push({ path: rel, buf });
551
+ }
552
+ return out;
553
+ } finally {
554
+ try { fsImpl.rmSync(dir, { recursive: true, force: true }); } catch { /* best effort */ }
555
+ }
556
+ }
557
+
558
+ // ---- git plumbing (impure) ------------------------------------------------
559
+ function git(args) {
560
+ return execFileSync('git', ['-C', REPO_ROOT, ...args], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
561
+ }
562
+ function gitBuf(args) {
563
+ return execFileSync('git', ['-C', REPO_ROOT, ...args], { maxBuffer: 256 * 1024 * 1024 });
564
+ }
565
+
566
+ function arg(name, fallback = null) {
567
+ const i = process.argv.indexOf(name);
568
+ return i >= 0 && i + 1 < process.argv.length ? process.argv[i + 1] : fallback;
569
+ }
570
+
571
+ // npm is `npm.cmd` on Windows and can't be execFile'd bare; unix uses `npm`.
572
+ const NPM_BIN = process.platform === 'win32' ? 'npm.cmd' : 'npm';
573
+
574
+ // Pure — the exact `npm publish` argv for the built core tarball. The package
575
+ // publishes PUBLIC via publishConfig.access:"public" (buildPackageJson); we ALSO
576
+ // pass `--access public` so the posture is stated at the call site and a stray
577
+ // `publishConfig` edit can't silently take it back to restricted — the same
578
+ // belt-and-braces the restricted era used, pointed the other way (task 1003872).
579
+ //
580
+ // NOTE for whoever reads this after a failed rollout: `--access` on publish governs
581
+ // what THIS publish declares. A package that is already `private` on the registry
582
+ // also needs the one-time, registry-side `npm access set status=public @bongos/core`
583
+ // — the flag alone has historically been a no-op on re-publish. ADR 0283 records
584
+ // that flip as a separate, deliberate owner step for exactly that reason.
585
+ // `--dry-run` unless `live` (the permanent owner step).
586
+ function publishArgs(tgzPath, live) {
587
+ const a = ['publish', tgzPath, '--access', 'public'];
588
+ if (!live) a.push('--dry-run');
589
+ return a;
590
+ }
591
+
592
+ // Publish (or dry-run) the built .tgz to npm. Auth is npm's own concern — this
593
+ // never holds a token; it shells out to `npm publish` and the owner's `npm login`
594
+ // provides it. The package is PUBLIC (task 1003872, ADR 0283), so no paid org plan
595
+ // is involved — a public scoped publish needs none.
596
+ // The child's stdout is routed to OUR stderr so main()'s machine-readable pin on
597
+ // stdout stays clean for CI capture.
598
+ function publishTarball({ tgzPath, live }) {
599
+ const args = publishArgs(tgzPath, live);
600
+ console.error('');
601
+ console.error(`[package-core] ${live ? 'PUBLISH (permanent)' : 'publish DRY-RUN'} → ${NPM_BIN} ${args.join(' ')}`);
602
+ if (!live) {
603
+ console.error(' Dry-run: nothing is uploaded. To publish for real: re-run with --publish --live.');
604
+ console.error(' That is PERMANENT and PUBLIC (ADR 0283) — anyone can fetch it, and a version is never');
605
+ console.error(' reusable once taken. It requires `npm login`; no paid org plan (the package is public).');
606
+ }
607
+ const r = spawnSync(NPM_BIN, args, { cwd: REPO_ROOT, stdio: ['inherit', process.stderr, 'inherit'] });
608
+ if (r.error || r.status !== 0) {
609
+ console.error(`[package-core] npm publish ${live ? '' : '--dry-run '}FAILED (${r.error ? r.error.message : `exit ${r.status}`}).`);
610
+ if (live) console.error(' Common causes: not logged in (`npm login`), no publish rights on the @bongos scope, that version already taken, or 2FA.');
611
+ process.exit(r.status || 1);
612
+ }
613
+ console.error(`[package-core] npm publish ${live ? 'succeeded — @bongos/core is live and PUBLIC on the registry.' : 'dry-run OK — the tarball is publishable.'}`);
614
+ }
615
+
616
+ // The neutral FLOOR — customer-zero identity tokens a portable core must never carry (task 1002220
617
+ // / H6 + task 1002217 / H4, finding F2). When packaging from the NEUTRAL trunk there is no
618
+ // config/branding.json, so the branding-DERIVED redaction + gate see ZERO literals and report
619
+ // "clean" while stripping nothing. This fixed floor closes that gap two ways, both keyed off ONE
620
+ // definition:
621
+ // • DOC path (H4, fail-closed): injected as `extra` {tokens, owners} into buildRedactionRules +
622
+ // collectSensitiveLiterals, so the existing doc-redaction STRIPS these from published docs
623
+ // (tokens→NEUTRAL_TOKEN, owners→NEUTRAL_OWNER) and the fail-closed no-leak gate ABORTS the build
624
+ // if one SURVIVES — even with no branding.json. The floor lives HERE and is injected at call
625
+ // time, so mirror-redact.js stays literal-free (its self-leak invariant holds); functional files
626
+ // still ship VERBATIM (the R88 fix) and are covered by the H6 advisory below, not this gate.
627
+ // • SCAN path (H6, advisory): scanArtifactForLeaks measures the flat list across the WHOLE artifact.
628
+ // findLeaks' public-IP floor separately catches the old droplet IP.
629
+ const PRIOR_INSTANCE_FLOOR = { tokens: ['amazonprimea', 'off the boats'], owners: ['lars589'] };
630
+ const PRIOR_INSTANCE_LITERALS = [...PRIOR_INSTANCE_FLOOR.tokens, ...PRIOR_INSTANCE_FLOOR.owners];
631
+
632
+ // High-signal committed-credential shapes for the secret WARNING (task 1002220 / audit H6, finding
633
+ // F3). Deliberately NARROW — well-known provider token prefixes + PEM private-key headers + an
634
+ // explicit secret=<literal> assignment — rather than the generic entropy catch-all, which fires on
635
+ // ordinary long identifiers / base64 data and buries a real hit (an early cut warned on 339 files,
636
+ // ~all benign). A match is a WARNING to eyeball; the HARD gate against live env-secret VALUES is
637
+ // functionalSecretLeaks in the build loop. Scans functional files (docs are redacted + gated already).
638
+ const CREDENTIAL_SHAPE_PATTERNS = [
639
+ ['anthropic-key', /\bsk-ant-[A-Za-z0-9_-]{16,}/],
640
+ ['openai-key', /\bsk-[A-Za-z0-9]{24,}/],
641
+ ['github-token', /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b|\bgithub_pat_[A-Za-z0-9_]{20,}/],
642
+ ['aws-access-key-id', /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/],
643
+ ['google-api-key', /\bAIza[A-Za-z0-9_-]{30,}/],
644
+ ['slack-token', /\bxox[baprs]-[A-Za-z0-9-]{10,}/],
645
+ ['private-key-pem', /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/],
646
+ ['secret-assignment', /\b(?:api[_-]?key|secret|password|passwd|access[_-]?token|auth[_-]?token)\b\s*[:=]\s*['"][^'"\s]{16,}['"]/i],
647
+ ];
648
+ function credentialShapeHits(text) {
649
+ const names = [];
650
+ for (const [name, re] of CREDENTIAL_SHAPE_PATTERNS) if (re.test(text)) names.push(name);
651
+ return names;
652
+ }
653
+
654
+ // classify a shipped path for the scan — mirrors processCoreFile's doc/stub/functional split.
655
+ function scanKindOf(pathRel) {
656
+ if (isAgentDoc(pathRel)) return 'stub';
657
+ if (isDocPath(pathRel)) return 'doc';
658
+ return 'functional';
659
+ }
660
+
661
+ // The post-build leak scan's POLICY, split out of main() so a test can plant a literal and prove
662
+ // the build refuses without running a full 2-minute package (task 1003870). Pure: argv in, verdict
663
+ // out. Fail-closed — any un-allowlisted prior-instance literal is fatal unless the operator has
664
+ // explicitly said --no-leak-scan, which skips the scan altogether rather than downgrading it.
665
+ // `--leak-scan-strict` is honoured as a no-op: it named this behaviour before it became default.
666
+ function leakScanVerdict(remainingLiteralHits, argv = process.argv) {
667
+ if (argv.includes('--no-leak-scan')) return { run: false, fatal: false, reason: 'skipped' };
668
+ const n = (remainingLiteralHits || []).length;
669
+ if (n === 0) return { run: true, fatal: false, reason: 'clean' };
670
+ return { run: true, fatal: true, reason: 'prior-instance-literals' };
671
+ }
672
+
673
+ // Independent post-build leak scan over the built core file set (task 1002220 / audit H6). Two layers:
674
+ // • INSTANCE LITERALS — findLeaks() over PRIOR_INSTANCE_LITERALS (+ the public-IP floor) across
675
+ // EVERY shipped file: brand/owner/history that must not ship in a portable core. This is the
676
+ // "prove no leak" measurement the neutral trunk was missing (F2).
677
+ // • CREDENTIAL SHAPES — credentialShapeHits() over FUNCTIONAL files only (docs are redacted+gated
678
+ // already): a high-signal WARNING that a committed credential shape shipped.
679
+ // `files` = [{ path, content }]. Pure — returns findings; the caller decides warn vs fatal.
680
+ function scanArtifactForLeaks(files, { literals = PRIOR_INSTANCE_LITERALS } = {}) {
681
+ const literalHits = []; // { path, label, sample }
682
+ const secretWarnings = []; // { path, shapes }
683
+ for (const f of files || []) {
684
+ const text = Buffer.isBuffer(f.content) ? f.content.toString('utf8') : String(f.content == null ? '' : f.content);
685
+ for (const lk of findLeaks(text, literals)) literalHits.push({ path: f.path, label: lk.label, sample: lk.sample });
686
+ if (scanKindOf(f.path) === 'functional') {
687
+ const shapes = credentialShapeHits(text);
688
+ if (shapes.length) secretWarnings.push({ path: f.path, shapes });
689
+ }
690
+ }
691
+ return { literalHits, secretWarnings };
692
+ }
693
+
694
+ // release-notes.json — the one file the core carries that is derived from HISTORY rather
695
+ // than from a committed file (task 1004218). It only exists where the history does, which
696
+ // is the CI pack (publish.yml checks out at fetch-depth 0). main() stages it into the SAME
697
+ // staged/filesMeta arrays as package.json, so the pin manifest covers it and --self-verify
698
+ // reproduces it; a file written into the stage dir behind the manifest's back would fail
699
+ // self-verify at publish time.
700
+ //
701
+ // ITS PROSE IS TREATED AS A DOC. These are merge summaries — builder-authored sentences — so
702
+ // the neutral floor applies exactly as it does to a shipped .md: redacted with the same rules
703
+ // (redactBlob), and any residue after redaction is a fatal no-leak failure. Not optional:
704
+ // ten of the 1,399 summaries in the history (measured 2026-09-25) name a prior instance or
705
+ // its owner, and history cannot be edited — shipped verbatim, they would fail the fail-closed
706
+ // post-build scan on EVERY pack from now on, and the lane would never publish again. That
707
+ // scan still reads the finished file, as it reads every staged one.
708
+ //
709
+ // Pure: notes + the rules main() already built in, `{ buf, notes, dropped, summaries,
710
+ // redacted, leaks }` out.
711
+ function releaseNotesArtifact(notes, { rules, sensitiveLiterals, envSecrets, knownDocNames, maxBytes = RELEASE_NOTES_MAX_BYTES }) {
712
+ const leaks = [];
713
+ let redacted = 0;
714
+ const clean = {};
715
+ for (const [version, entries] of Object.entries(notes || {})) {
716
+ clean[version] = entries.map((e) => {
717
+ const r = redactBlob({ buf: Buffer.from(e.text, 'utf8'), rules, sensitiveLiterals, envSecrets, knownDocNames });
718
+ for (const l of r.leaks) leaks.push({ label: `doc:${l.label}`, sample: l.sample });
719
+ if (r.secret) leaks.push({ label: 'doc:secret-shape' });
720
+ const text = r.buf.toString('utf8');
721
+ if (text !== e.text) redacted++;
722
+ return e.id ? { id: e.id, text } : { text };
723
+ });
724
+ }
725
+ const bounded = boundReleaseNotes(clean, maxBytes);
726
+ const summaries = Object.values(bounded.notes).reduce((n, list) => n + list.length, 0);
727
+ return { buf: serializeReleaseNotes(bounded.notes), notes: bounded.notes, dropped: bounded.dropped, summaries, redacted, leaks };
728
+ }
729
+
730
+ // Self-verify the built artifact (task 1002218 / audit H3, findings F1+F5). The packager
731
+ // claims a consumer "verifies an install by recomputing [the pin] from the unpacked tree" —
732
+ // this proves the packager's OWN output actually does, at build time, on the produce side:
733
+ // 1. REPRODUCE THE PIN (always; deterministic, network-free): unpack the built .tgz and
734
+ // recompute tree_sha256 over the unpacked tree, asserting it equals the manifest — plus
735
+ // the on-disk .tgz bytes vs manifest.tarball.sha256. Catches a tar-writer bug, a corrupt
736
+ // write, or pin drift BEFORE the artifact is trusted or published (the R88 failure class).
737
+ // 2. BARE-INSTALL BOOT (opt-in --self-verify-boot; needs npm/registry): `npm install <tgz>`
738
+ // into a throwaway consumer and boot /healthz, by reusing the proven consumer-layout
739
+ // harness (tests/consumer_layout_boot.mjs) with CORE_TGZ set — no duplication. The deeper
740
+ // standing CI gate is task 1002221; this is the packager's own quick smoke.
741
+ // Fatal (exit 1) on a reproduce mismatch or a boot failure — a self-verify that finds a
742
+ // problem must stop the build, never warn-and-ship.
743
+ // Pure recompute — read each pinned file from an unpacked tree, rebuild the canonical tree
744
+ // hash (using the manifest's already-canonical modes), and compare to the manifest, plus the
745
+ // on-disk .tgz bytes vs manifest.tarball.sha256. No process.exit / no spawn → unit-testable.
746
+ // Returns { ok, problems, fileCount }.
747
+ function reproducePinFromTree({ treeRoot, sidecar, tgzPath }, fsImpl = fs) {
748
+ const problems = [];
749
+ const recomputed = [];
750
+ for (const f of sidecar.files || []) {
751
+ const abs = path.join(treeRoot, ...String(f.path).split('/'));
752
+ let buf;
753
+ try { buf = fsImpl.readFileSync(abs); } catch { problems.push(`missing in artifact: ${f.path}`); continue; }
754
+ const sha = sha256hex(buf);
755
+ if (sha !== f.sha256) problems.push(`content mismatch: ${f.path}`);
756
+ recomputed.push({ path: f.path, mode: f.mode, sha256: sha });
757
+ }
758
+ const treeHash = canonicalTreeHash(recomputed);
759
+ if (problems.length === 0 && treeHash !== sidecar.tree_sha256) {
760
+ problems.push(`recomputed tree_sha256 ${treeHash.slice(0, 12)}… ≠ manifest ${String(sidecar.tree_sha256).slice(0, 12)}…`);
761
+ }
762
+ if (tgzPath && sidecar.tarball && sidecar.tarball.sha256) {
763
+ const tgzSha = sha256hex(fsImpl.readFileSync(tgzPath));
764
+ if (tgzSha !== sidecar.tarball.sha256) {
765
+ problems.push(`on-disk .tgz sha256 ${tgzSha.slice(0, 12)}… ≠ manifest.tarball.sha256 ${String(sidecar.tarball.sha256).slice(0, 12)}…`);
766
+ }
767
+ }
768
+ return { ok: problems.length === 0, problems, fileCount: (sidecar.files || []).length };
769
+ }
770
+
771
+ function selfVerify({ tgzPath, sidecar, outDir, boot }) {
772
+ console.error('');
773
+ console.error('[self-verify] verifying the built artifact reproduces its pin …');
774
+
775
+ // 1. reproduce the pin from the built .tgz.
776
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'bongos-selfverify-'));
777
+ try {
778
+ let treeRoot;
779
+ const x = spawnSync('tar', ['-xzf', tgzPath, '-C', tmp], { encoding: 'utf8' });
780
+ if (!x.error && x.status === 0) {
781
+ treeRoot = path.join(tmp, TAR_ROOT.replace(/\/$/, '')); // the `package/` root inside the tarball
782
+ } else {
783
+ // tar unavailable — fall back to the on-disk stage dir (the SAME staged buffers written
784
+ // to the .tgz), so the pin is still recomputed from a materialized tree. Less faithful
785
+ // (won't catch a tar-writer bug), so it's a loud warning, not silent.
786
+ treeRoot = path.join(outDir, stageDirName(sidecar.core_version));
787
+ console.error(`[self-verify] ! tar unavailable (${x.error ? x.error.message : 'exit ' + x.status}); recomputing over the stage dir ${path.relative(REPO_ROOT, treeRoot)} instead of the unpacked .tgz.`);
788
+ if (!fs.existsSync(treeRoot)) { console.error('[self-verify] FAILED — neither `tar` nor the stage dir is available to recompute the pin.'); process.exit(1); }
789
+ }
790
+ const rep = reproducePinFromTree({ treeRoot, sidecar, tgzPath });
791
+ if (!rep.ok) {
792
+ console.error(`[self-verify] FAILED — the built artifact does NOT reproduce its pin (${rep.problems.length} problem(s)):`);
793
+ for (const p of rep.problems.slice(0, 20)) console.error(' ' + p);
794
+ if (rep.problems.length > 20) console.error(` … +${rep.problems.length - 20} more`);
795
+ process.exit(1);
796
+ }
797
+ console.error(`[self-verify] ✓ pin reproduced — tree_sha256 + tarball.sha256 match the manifest (${rep.fileCount} files).`);
798
+ } finally {
799
+ try { fs.rmSync(tmp, { recursive: true, force: true }); } catch { /* best-effort */ }
800
+ }
801
+
802
+ // 2. bare-install boot (opt-in) — reuse the proven consumer-layout harness with CORE_TGZ.
803
+ if (boot) {
804
+ const harness = path.join(REPO_ROOT, 'tests', 'consumer_layout_boot.mjs');
805
+ if (!fs.existsSync(harness)) {
806
+ console.error('[self-verify] • bare-install boot skipped — tests/consumer_layout_boot.mjs not present (packaging from an installed core, where tests/ is not shipped).');
807
+ return;
808
+ }
809
+ console.error('[self-verify] bare-install boot: `npm install <tgz>` + boot /healthz (via consumer_layout_boot, CORE_TGZ set) …');
810
+ const r = spawnSync(process.execPath, [harness], {
811
+ cwd: REPO_ROOT, encoding: 'utf8', maxBuffer: 256 * 1024 * 1024,
812
+ env: { ...process.env, CORE_TGZ: tgzPath }, stdio: ['ignore', process.stderr, process.stderr],
813
+ });
814
+ if (r.error || r.status !== 0) {
815
+ console.error(`[self-verify] FAILED — the packaged core did not install + boot (${r.error ? r.error.message : 'exit ' + r.status}).`);
816
+ process.exit(1);
817
+ }
818
+ console.error('[self-verify] ✓ bare-install boot OK — the packaged core installs and serves /healthz.');
819
+ }
820
+ }
821
+
822
+ function main() {
823
+ // --from-worktree: build from the files on disk instead of a commit (task 1003995).
824
+ // The lineage anchor of such a build is the tree hash alone — there is no commit to
825
+ // name — so source_commit is null and source_ref says where it came from.
826
+ const fromWorktree = process.argv.includes('--from-worktree');
827
+ const ref = fromWorktree ? '(worktree)' : arg('--ref', 'HEAD');
828
+ const outDir = path.resolve(REPO_ROOT, arg('--out-dir', 'dist'));
829
+ const version = arg('--version', coreVersion());
830
+ const contract = coreVersion();
831
+ const dropletIp = arg('--droplet-ip', process.env.DROPLET_IP || null);
832
+
833
+ // 1. Resolve the source ref → commit SHA (the lineage anchor of this artifact).
834
+ let sha = null;
835
+ if (!fromWorktree) {
836
+ try { sha = git(['rev-parse', ref]).trim(); }
837
+ catch (e) { console.error(`refusing: could not resolve --ref "${ref}": ${e.message}`); process.exit(2); }
838
+ }
839
+
840
+ // 2. Enumerate + partition the tree through the manifest (single source of truth).
841
+ // package.json/package-lock.json are SYNTHESIZED (task 1882, ADR 0108 §2) —
842
+ // isPublishable() still selects them (they're not manifest-excluded, the mirror
843
+ // ships them verbatim), but the core package needs its OWN identity + a pruned
844
+ // dependency set, not the game's. Pulled out of the generic per-file loop below.
845
+ const SYNTHESIZED_PATHS = new Set(['package.json', 'package-lock.json']);
846
+ const entries = fromWorktree
847
+ ? walkWorktreeEntries(REPO_ROOT)
848
+ : parseLsTree(git(['ls-tree', '-r', sha])).filter((e) => e.type === 'blob');
849
+ // A blob is named by its git object on the ref path and by its own path on the
850
+ // worktree path; everything downstream just wants the bytes.
851
+ // Generated API artifacts (task 1004866) carry their bytes in `buf`; every other entry
852
+ // is a git object on the ref path and a file on disk on the worktree path.
853
+ const readBlob = (e) => (e.buf ? e.buf : fromWorktree ? fs.readFileSync(path.join(REPO_ROOT, e.path)) : gitBuf(['cat-file', 'blob', e.sha]));
854
+ // Any copy of the eight generated API files that IS on hand (a stale untracked one in a
855
+ // worktree, or one committed on an older ref) is dropped: the copy that ships is the one
856
+ // generated in 2a from the routes being packed.
857
+ const API_GENERATED = new Set(API_ARTIFACT_PATHS);
858
+ const selected = entries.filter((e) => isPublishable(e.path) && !SYNTHESIZED_PATHS.has(e.path) && !API_GENERATED.has(e.path));
859
+ // Drop npm-never-installed files (.gitignore, .npmignore, .npmrc) so the manifest +
860
+ // tree_sha256 pin describe exactly what `npm install` materializes — otherwise the
861
+ // consumer's verifyInstalledPin fails on the missing file and the vendored upgrade
862
+ // auto-rolls-back (idea 1000543). Done here, so they never reach the tarball or the pin.
863
+ const npmStripped = selected.filter((e) => isNpmStripped(e.path));
864
+ const publishable = selected.filter((e) => !isNpmStripped(e.path));
865
+ // The worktree walk is already allowlist-scoped and never offers the two synthesized
866
+ // paths, so only the ref path discounts them from what it enumerated.
867
+ const excludedCount = entries.length - selected.length - (fromWorktree ? 0 : SYNTHESIZED_PATHS.size);
868
+ console.error(`[package-core] ${ref}${sha ? ` = ${sha.slice(0, 12)}` : ''} — ${entries.length} files, ${publishable.length} in the core (+2 synthesized), ${excludedCount} excluded.`);
869
+ if (npmStripped.length) {
870
+ console.error(`[package-core] dropped ${npmStripped.length} npm-never-installed file(s) from the pin (npm strips these on install; idea 1000543): ${npmStripped.map((e) => e.path).join(', ')}`);
871
+ }
872
+ if (publishable.length === 0) {
873
+ console.error('refusing: the core set is EMPTY — almost certainly a manifest/ref mismatch, not intentional. Aborting.');
874
+ process.exit(1);
875
+ }
876
+
877
+ // 2a. Generate the API spec, reference and typed client from the routes being packed
878
+ // (task 1004866). Fatal on failure: a core without them serves no /docs and no client.
879
+ // gen-api-docs stamps the spec with the version in package.json, so the throwaway
880
+ // tree gets the SOURCE package.json beside the packed files.
881
+ {
882
+ const sources = publishable.map((e) => ({ path: e.path, buf: readBlob(e) }));
883
+ const pkgEntry = fromWorktree ? null : entries.find((e) => e.path === 'package.json');
884
+ const pkgPath = path.join(REPO_ROOT, 'package.json');
885
+ const pkg = fromWorktree ? (fs.existsSync(pkgPath) ? fs.readFileSync(pkgPath) : null) : (pkgEntry ? readBlob(pkgEntry) : null);
886
+ if (pkg) sources.push({ path: 'package.json', buf: pkg });
887
+ let generated;
888
+ try { generated = generateApiArtifacts(sources); }
889
+ catch (err) {
890
+ console.error(`refusing: generating the API spec + client FAILED — ${err.message}. A core without them serves no /docs and no /lib/bongos-client.js. Nothing was built.`);
891
+ process.exit(1);
892
+ }
893
+ for (const g of generated) {
894
+ if (!isPublishable(g.path)) {
895
+ console.error(`refusing: generated ${g.path} is not in the publish allowlist (scripts/bongos/publish-manifest.js).`);
896
+ process.exit(1);
897
+ }
898
+ publishable.push({ path: g.path, type: 'blob', mode: '100644', buf: g.buf });
899
+ }
900
+ // Joined to `publishable`, so the eight go through EVERYTHING below exactly like a
901
+ // committed file: processCoreFile (doc redaction + the fail-closed no-leak gate), the
902
+ // pin manifest, the tarball, and the post-build scanArtifactForLeaks over `staged`.
903
+ publishable.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
904
+ console.error(`[package-core] generated ${generated.length} API artifact(s) from the packed routes: ${generated.map((g) => g.path).join(', ')}.`);
905
+ }
906
+
907
+ // 2b. Synthesize the core's own package.json + pruned package-lock.json from the
908
+ // SOURCE files at this ref (never the live working tree, so --ref stays
909
+ // reproducible) — express+pg only, name @bongos/core, version = the
910
+ // platform version being packaged.
911
+ // On the worktree path there is no ref to stay reproducible against, so the two
912
+ // files come off disk beside everything else in the build.
913
+ const sourceRootFile = (rel) => {
914
+ if (fromWorktree) {
915
+ const abs = path.join(REPO_ROOT, rel);
916
+ return fs.existsSync(abs) ? fs.readFileSync(abs) : null;
917
+ }
918
+ const blob = entries.find((e) => e.path === rel);
919
+ return blob ? gitBuf(['cat-file', 'blob', blob.sha]) : null;
920
+ };
921
+ const pkgJsonRaw = sourceRootFile('package.json');
922
+ const pkgLockRaw = sourceRootFile('package-lock.json');
923
+ if (!pkgJsonRaw || !pkgLockRaw) {
924
+ console.error(`refusing: source package.json/package-lock.json not found at ${fromWorktree ? 'the repo root' : 'this ref'} — cannot synthesize the core package.`);
925
+ process.exit(1);
926
+ }
927
+ const sourcePkgJson = JSON.parse(pkgJsonRaw.toString('utf8'));
928
+ const sourcePkgLock = JSON.parse(pkgLockRaw.toString('utf8'));
929
+ const corePkgJson = buildPackageJson({ version, sourceDeps: sourcePkgJson.dependencies, sourceOverrides: sourcePkgJson.overrides });
930
+ const corePkgLock = prunePackageLock(sourcePkgLock, {
931
+ name: corePkgJson.name, version, rootRanges: { express: corePkgJson.dependencies.express, pg: corePkgJson.dependencies.pg },
932
+ });
933
+ console.error(`[package-core] synthesized package.json (${Object.keys(corePkgJson.dependencies).join(', ')}) + pruned package-lock.json (${Object.keys(corePkgLock.packages).length - 1} of ${Object.keys(sourcePkgLock.packages).length - 1} locked packages kept).`);
934
+
935
+ // 3. Redaction rules from THIS instance's branding (current HEAD) + the droplet
936
+ // IP as an exact extra literal (sourced here, never written into a file).
937
+ let branding = {};
938
+ try { branding = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'config/branding.json'), 'utf8')); }
939
+ catch { /* vanilla instance: derive from the public-IP floor only */ }
940
+ const ownerAliases = String(process.env.OWNER_ALIASES || '').split(',').map((s) => s.trim()).filter(Boolean);
941
+ // The NEUTRAL FLOOR (task 1002217 / audit H4): always inject the fixed prior-instance tokens so
942
+ // docs de-brand + the no-leak gate fires against them EVEN WITH NO branding.json (the F2 gap).
943
+ // Merged on top of this instance's own branding — for a branded instance the floor is harmless
944
+ // extra; for the neutral trunk it is the only thing standing between a doc and customer-zero's name.
945
+ const extra = {
946
+ owners: [...ownerAliases, ...PRIOR_INSTANCE_FLOOR.owners],
947
+ tokens: [...PRIOR_INSTANCE_FLOOR.tokens],
948
+ literals: dropletIp ? [dropletIp] : [],
949
+ };
950
+ const rules = buildRedactionRules(branding, extra);
951
+ const sensitiveLiterals = collectSensitiveLiterals(branding, extra);
952
+ const envSecrets = collectEnvSecrets();
953
+ console.error(`[package-core] ${rules.length} redaction rule(s), ${sensitiveLiterals.length} gate literal(s) + public-IP floor + ${envSecrets.length} env-secret literal(s) (incl. the neutral floor).`);
954
+
955
+ // 4. Process every file IN MEMORY (processCoreFile: docs redacted, functional verbatim)
956
+ // + the fail-closed no-leak gate. Nothing touches dist/ until the ENTIRE set is proven
957
+ // clean (atomic abort). Brand/topology in functional files are non-fatal ADVISORIES.
958
+ // task 1002460 — the doc-link allowlist. The entropy sweep cannot tell a long
959
+ // ADR filename from a secret by shape, so it collapsed every one of them to
960
+ // <redacted>.md on the way out. This is the set of names actually being
961
+ // published, so a name in it is a FILE and not a guess; anything else, secrets
962
+ // included, is redacted exactly as before.
963
+ const knownDocNames = new Set(
964
+ publishable.map((e) => e.path.split('/').pop()).filter((n) => /\.(md|sql)$/i.test(n)),
965
+ );
966
+ const staged = []; // { name, mode, buf } (name includes TAR_ROOT)
967
+ const filesMeta = []; // { path, mode, sha256 } (source files only — the pin domain)
968
+ const leaks = [];
969
+ const advisories = []; // { path, label, sample } — non-fatal (brand/IP that ships verbatim)
970
+ let docCount = 0;
971
+ let funcCount = 0;
972
+ let stubCount = 0; // agent docs (CLAUDE.md/AGENTS.md) replaced with the brand-free stub (task 2121)
973
+ for (const e of publishable) {
974
+ let raw;
975
+ try { raw = readBlob(e); }
976
+ catch (err) { leaks.push({ path: e.path, label: `read-failed:${err.message}` }); continue; }
977
+ const { buf, leaks: fileLeaks, advisories: fileAdvisories, kind } =
978
+ processCoreFile({ pathRel: e.path, raw, rules, sensitiveLiterals, envSecrets, knownDocNames });
979
+ for (const l of fileLeaks) leaks.push({ path: e.path, label: l.label, sample: l.sample });
980
+ for (const a of fileAdvisories) advisories.push({ path: e.path, label: a.label, sample: a.sample });
981
+ if (kind === 'doc') docCount++; else if (kind === 'stub') stubCount++; else funcCount++;
982
+ filesMeta.push({ path: e.path, mode: e.mode, sha256: sha256hex(buf) });
983
+ staged.push({ name: TAR_ROOT + e.path, mode: parseInt(normalizeMode(e.mode), 8), buf });
984
+ }
985
+ funcCount += 2; // the two synthesized files below, staged outside the leak-gated loop
986
+
987
+ // The two synthesized files (2b above) carry no source content — no OTB brand,
988
+ // no secrets — so they need no redaction/leak scan; stage them directly into
989
+ // the same filesMeta/staged arrays the pin + tarball are built from.
990
+ for (const [relPath, obj] of [['package.json', corePkgJson], ['package-lock.json', corePkgLock]]) {
991
+ const buf = Buffer.from(`${JSON.stringify(obj, null, 2)}\n`, 'utf8');
992
+ filesMeta.push({ path: relPath, mode: '100644', sha256: sha256hex(buf) });
993
+ staged.push({ name: TAR_ROOT + relPath, mode: 0o644, buf });
994
+ }
995
+
996
+ // 4b. The release notes (task 1004218): what each release brought in, generated from this
997
+ // ref's history, redacted as a doc, and staged into the same arrays so the pin covers
998
+ // them. A worktree build or a shallow clone has no history to read, so it ships without
999
+ // — and an upgrade onto it says its notes are unavailable rather than listing nothing.
1000
+ const notesGen = fromWorktree
1001
+ ? { skipped: 'built from the working tree, which carries no history' }
1002
+ : generateReleaseNotes({ git, ref: sha, version });
1003
+ let notesStaged = false;
1004
+ if (notesGen.skipped) {
1005
+ console.error(`[package-core] ! ${RELEASE_NOTES_FILE} not generated — ${notesGen.skipped}.`);
1006
+ } else {
1007
+ const art = releaseNotesArtifact(notesGen.notes, { rules, sensitiveLiterals, envSecrets, knownDocNames });
1008
+ for (const l of art.leaks) leaks.push({ path: RELEASE_NOTES_FILE, label: l.label, sample: l.sample });
1009
+ filesMeta.push({ path: RELEASE_NOTES_FILE, mode: '100644', sha256: sha256hex(art.buf) });
1010
+ staged.push({ name: TAR_ROOT + RELEASE_NOTES_FILE, mode: 0o644, buf: art.buf });
1011
+ notesStaged = true;
1012
+ const kept = Object.keys(art.notes);
1013
+ const trimmed = art.dropped.length
1014
+ ? ` — the ${art.dropped.length} oldest release(s) DROPPED to stay under ${RELEASE_NOTES_MAX_BYTES / 1024} KiB`
1015
+ : '';
1016
+ console.error(`[package-core] ${RELEASE_NOTES_FILE}: ${kept.length} release(s) ${kept[0]} → ${kept[kept.length - 1]}, ${art.summaries} summaries (${art.redacted} redacted), ${(art.buf.length / 1024).toFixed(1)} KiB${trimmed}.`);
1017
+ }
1018
+
1019
+ if (leaks.length > 0) {
1020
+ console.error(`\n[package-core] NO-LEAK GATE FAILED — ${leaks.length} real leak(s) (doc redaction residue or a live credential in a functional file). PRODUCING NOTHING (fail-closed):`);
1021
+ for (const l of leaks.slice(0, 50)) {
1022
+ // Never print a secret sample; a redaction-residue instance literal is safe to show.
1023
+ const shown = (l.label === 'live-credential' || l.label === 'doc:secret-shape')
1024
+ ? '' : (l.sample ? ` (“${String(l.sample).slice(0, 40)}”)` : '');
1025
+ console.error(` ${l.path}: ${l.label}${shown}`);
1026
+ }
1027
+ if (leaks.length > 50) console.error(` … +${leaks.length - 50} more`);
1028
+ console.error('\nFix: for a DOC leak, extend scripts/bongos/mirror-redact.js (rules) or scripts/bongos/publish-manifest.js (exclusions);');
1029
+ console.error(' for a live-credential leak, remove the secret at SOURCE (it should never be committed). Then re-run. dist/ was NOT touched.');
1030
+ process.exit(1);
1031
+ }
1032
+ console.error(`[package-core] no-leak gate PASSED — ${staged.length} files clean (${docCount} docs redacted, ${stubCount} agent-docs stubbed, ${funcCount} functional verbatim${notesStaged ? `, ${RELEASE_NOTES_FILE} generated` : ''}).`);
1033
+
1034
+ // Advisory: brand-identity + public-IP literals that ship VERBATIM inside functional
1035
+ // files. Not a leak (these are public, not secrets; a downstream rebrands via config) —
1036
+ // surfaced so a human can see what instance-specific strings the consumer core carries.
1037
+ if (advisories.length > 0) {
1038
+ const byLabel = {};
1039
+ for (const a of advisories) { const k = a.sample || a.label; byLabel[k] = (byLabel[k] || 0) + 1; }
1040
+ const summary = Object.entries(byLabel).sort((x, y) => y[1] - x[1]).map(([k, n]) => `${k}×${n}`).join(', ');
1041
+ console.error(`[package-core] advisory — ${advisories.length} brand/topology string(s) ship verbatim in functional files (public, not secrets): ${summary}.`);
1042
+ }
1043
+
1044
+ // 5. Build the pin manifest, then materialize dist/ (only reached when clean).
1045
+ filesMeta.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
1046
+ const treeHash = canonicalTreeHash(filesMeta);
1047
+ const innerManifest = buildCoreManifest({
1048
+ version, coreContract: contract, sourceCommit: sha, sourceRef: ref,
1049
+ builtAtIso: new Date().toISOString(), files: filesMeta, treeHash,
1050
+ redaction: {
1051
+ model: 'docs-redacted+functional-verbatim', // task 1824
1052
+ docs_redacted: docCount,
1053
+ agent_docs_stubbed: stubCount, // CLAUDE.md/AGENTS.md → brand-free stub (task 2121)
1054
+ functional_verbatim: funcCount,
1055
+ rules: rules.length,
1056
+ gate_literals: sensitiveLiterals.length,
1057
+ gate: 'passed',
1058
+ },
1059
+ });
1060
+
1061
+ // The self-describing manifest travels INSIDE the artifact too (minus tarball.*).
1062
+ const innerJson = Buffer.from(JSON.stringify(innerManifest, null, 2) + '\n', 'utf8');
1063
+ staged.push({ name: INNER_MANIFEST, mode: 0o644, buf: innerJson });
1064
+
1065
+ const tgz = buildTar(staged);
1066
+ const sidecar = withTarballInfo(innerManifest, {
1067
+ name: tarballName(version), sha256: sha256hex(tgz), bytes: tgz.length,
1068
+ });
1069
+
1070
+ // Write: a fresh versioned stage dir (inspectable tree) + the .tgz + the pin.
1071
+ fs.mkdirSync(outDir, { recursive: true });
1072
+ const stageDir = path.join(outDir, stageDirName(version));
1073
+ fs.rmSync(stageDir, { recursive: true, force: true });
1074
+ for (const f of staged) {
1075
+ // strip the TAR_ROOT prefix for the on-disk tree
1076
+ const rel = f.name.startsWith(TAR_ROOT) ? f.name.slice(TAR_ROOT.length) : f.name;
1077
+ const dest = path.join(stageDir, rel);
1078
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
1079
+ fs.writeFileSync(dest, f.buf, { mode: f.mode });
1080
+ }
1081
+ const tgzPath = path.join(outDir, tarballName(version));
1082
+ const manifestPath = path.join(outDir, manifestName(version));
1083
+ fs.writeFileSync(tgzPath, tgz);
1084
+ fs.writeFileSync(manifestPath, JSON.stringify(sidecar, null, 2) + '\n');
1085
+
1086
+ console.error('');
1087
+ console.error(`[package-core] Cloud Bongos core v${version} packaged (contract ^${contract}).`);
1088
+ console.error(` source_commit ${sha || '(none — built from the working tree)'}`);
1089
+ console.error(` file_count ${filesMeta.length}`);
1090
+ console.error(` tree_sha256 ${treeHash}`);
1091
+ console.error(` tarball ${path.relative(REPO_ROOT, tgzPath)} (${(tgz.length / 1024).toFixed(1)} KiB, sha256 ${sidecar.tarball.sha256.slice(0, 12)}…)`);
1092
+ console.error(` manifest ${path.relative(REPO_ROOT, manifestPath)} ← the PIN a downstream repo records`);
1093
+ console.error(` tree ${path.relative(REPO_ROOT, stageDir)}/`);
1094
+
1095
+ // Optional self-verify leg (task 1002218 / audit H3): prove the built artifact reproduces
1096
+ // its pin (+ optionally installs & boots) BEFORE it can be trusted or published. Runs after
1097
+ // the artifact is written; a failure exits non-zero so an unverified/broken artifact never
1098
+ // reaches the publish leg below or a downstream consumer.
1099
+ if (process.argv.includes('--self-verify')) {
1100
+ selfVerify({ tgzPath, sidecar, outDir, boot: process.argv.includes('--self-verify-boot') });
1101
+ }
1102
+
1103
+ // Post-build leak scan (task 1002220 / audit H6): independent verification that the BUILT
1104
+ // artifact carries no prior-instance identity, + a warn-level secret-shape scan over functional
1105
+ // files. Runs on every build and is FAIL-CLOSED: an un-allowlisted prior-instance literal aborts
1106
+ // the build. The trunk sweep (task 1003869) cleared the residue those literals used to represent,
1107
+ // so warning instead of failing would only let it creep back (task 1003870). --no-leak-scan is
1108
+ // the sole escape. A secret-shape hit stays a non-fatal warning — those 14 files were each
1109
+ // confirmed a test fixture (task 1003871) and the R88 functional-verbatim fix is preserved.
1110
+ if (!process.argv.includes('--no-leak-scan')) {
1111
+ const scanFiles = staged.map((s) => ({ path: s.name.startsWith(TAR_ROOT) ? s.name.slice(TAR_ROOT.length) : s.name, content: s.buf }));
1112
+ const scan = scanArtifactForLeaks(scanFiles);
1113
+ // Named, reasoned exceptions (task 1003869). A detector must carry the pattern it
1114
+ // detects and a "public IPs are flagged" test must be handed a public IP, so those
1115
+ // hits are real but not leaks. Each is listed per (file, literal) with its reason in
1116
+ // scripts/bongos/leak-scan-allowlist.js — never per bare file, which would let a NEW
1117
+ // leak ride into an already-listed file unseen.
1118
+ const { allowed, remaining } = partitionHits(scan.literalHits);
1119
+ if (allowed.length) {
1120
+ const byFile = [...new Set(allowed.map((h) => h.path))];
1121
+ console.error(`[leak-scan] ${allowed.length} hit(s) across ${byFile.length} file(s) covered by a named exception (scripts/bongos/leak-scan-allowlist.js).`);
1122
+ }
1123
+ const stale = unusedEntries(scan.literalHits);
1124
+ if (stale.length) {
1125
+ console.error(`[leak-scan] ! ${stale.length} allowlist entr(ies) matched nothing — the trunk got cleaner, so prune them:`);
1126
+ for (const e of stale) console.error(` ${e.path} [${e.literal}]`);
1127
+ }
1128
+ scan.literalHits = remaining;
1129
+ const verdict = leakScanVerdict(scan.literalHits);
1130
+ if (scan.literalHits.length) {
1131
+ const byLit = {};
1132
+ for (const h of scan.literalHits) byLit[h.sample] = (byLit[h.sample] || 0) + 1;
1133
+ const summary = Object.entries(byLit).sort((a, b) => b[1] - a[1]).map(([k, n]) => `${k}×${n}`).join(', ');
1134
+ const files = [...new Set(scan.literalHits.map((h) => h.path))];
1135
+ console.error('');
1136
+ console.error(`[leak-scan] FAILED — ${scan.literalHits.length} prior-instance literal hit(s) across ${files.length} shipped file(s): ${summary}`);
1137
+ for (const p of files.slice(0, 30)) console.error(` ${p}`);
1138
+ if (files.length > 30) console.error(` … +${files.length - 30} more file(s)`);
1139
+ console.error('[leak-scan] refusing to certify a leaky artifact. Either remove the literal at SOURCE (check what');
1140
+ console.error('[leak-scan] REGENERATES the file — a generator re-leaks on every run, task 1003911), or, if the hit is');
1141
+ console.error('[leak-scan] a detector carrying its own pattern, add a named (path, class) reason to');
1142
+ console.error('[leak-scan] scripts/bongos/leak-scan-allowlist.js. --no-leak-scan skips this gate entirely.');
1143
+ if (verdict.fatal) process.exit(1);
1144
+ } else {
1145
+ console.error('[leak-scan] ✓ no prior-instance literals in the built artifact.');
1146
+ }
1147
+ if (scan.secretWarnings.length) {
1148
+ console.error(`[leak-scan] ! ${scan.secretWarnings.length} functional file(s) carry a credential SHAPE (WARNING, not fatal — confirm none is a real credential; a real one must be removed at SOURCE):`);
1149
+ for (const w of scan.secretWarnings.slice(0, 20)) console.error(` ${w.path} [${w.shapes.join(', ')}]`);
1150
+ if (scan.secretWarnings.length > 20) console.error(` … +${scan.secretWarnings.length - 20} more`);
1151
+ } else {
1152
+ console.error('[leak-scan] ✓ no committed-credential shapes in functional files.');
1153
+ }
1154
+ }
1155
+
1156
+ // Optional publish leg (task 2089): --publish runs `npm publish` on the built
1157
+ // tarball. DRY-RUN by default; the real, permanent publish needs --publish --live
1158
+ // (+ npm auth). Kept AFTER the artifact is written so a publish failure never
1159
+ // costs the build; runs BEFORE the stdout pin so that pin stays the last line out.
1160
+ if (process.argv.includes('--publish')) {
1161
+ publishTarball({ tgzPath, live: process.argv.includes('--live') });
1162
+ }
1163
+
1164
+ // stdout carries the machine-readable pin (so CI / R85 can capture it).
1165
+ process.stdout.write(JSON.stringify({ core_version: version, source_commit: sha, tree_sha256: treeHash, tarball: sidecar.tarball }) + '\n');
1166
+ process.exit(0);
1167
+ }
1168
+
1169
+ module.exports = {
1170
+ MANIFEST_SCHEMA, ARTIFACT_NAME, TAR_ROOT, INNER_MANIFEST,
1171
+ coreVersion, sha256hex, canonicalTreeHash, normalizeMode,
1172
+ buildCoreManifest, withTarballInfo, tarballName, manifestName, stageDirName,
1173
+ octal, tarChecksum, ustarHeader, splitUstarName, buildTar,
1174
+ // task 1824 — the consumer-core file-classification layer (pure; unit-tested)
1175
+ isDocPath, functionalSecretLeaks, processCoreFile,
1176
+ // idea 1000543 — npm-never-installed files dropped from the pin so vendored `bongos upgrade` pin-verify matches
1177
+ isNpmStripped, NPM_STRIPPED_BASENAMES,
1178
+ // task 1004866 — the gitignored API spec/reference/client, generated into every tarball
1179
+ generateApiArtifacts,
1180
+ // task 2121 — agent-doc (CLAUDE.md/AGENTS.md) stub so a consumer's node_modules can't auto-load core memory
1181
+ isAgentDoc, CORE_AGENT_DOC_STUB,
1182
+ // task 1882 (ADR 0108 §2) — the real installable npm package
1183
+ CORE_DEP_NAMES, buildPackageJson, resolveLockDep, lockfileClosure, prunePackageLock,
1184
+ // task 2089 (ADR 0134) — the npm publish argv; PUBLIC since task 1003872 / ADR 0283
1185
+ publishArgs,
1186
+ // task 1002218 (audit H3) — build-time self-verify (reproduce pin + optional bare-install boot)
1187
+ selfVerify, reproducePinFromTree,
1188
+ // task 1002220 (audit H6) — post-build leak scan (prior-instance literals + functional secret shapes)
1189
+ scanArtifactForLeaks, PRIOR_INSTANCE_LITERALS,
1190
+ // task 1003870 — the fail-closed verdict the build acts on (pure, so a test can plant a literal)
1191
+ leakScanVerdict,
1192
+ // task 1002217 (audit H4) — the fixed neutral floor injected into the doc-redaction + fail-closed gate
1193
+ PRIOR_INSTANCE_FLOOR,
1194
+ // task 1003995 — --from-worktree's enumerator, for a core checkout with no git history
1195
+ walkWorktreeEntries,
1196
+ // task 1004218 — release-notes.json: the history-derived file, redacted as a doc and bounded
1197
+ releaseNotesArtifact,
1198
+ };
1199
+
1200
+ if (require.main === module) main();