@bongos/core 1.21.175 → 1.21.177

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