@bongos/core 1.21.175 → 1.21.176

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