@bongos/core 1.21.175 → 1.21.177

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1719) hide show
  1. package/.bongos-core.json +3371 -1636
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +15 -15
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/config/scheduled-routines.json +3 -8
  58. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  59. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +1 -1
  60. package/docs/adr/0093-tranche-2-core-carve-sequence.md +1 -1
  61. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  62. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  63. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  64. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  65. package/docs/adr/README.md +2 -0
  66. package/docs/api/openapi.json +606 -44
  67. package/docs/api-reference.md +25 -12
  68. package/docs/architecture.md +8 -7
  69. package/docs/canonical-permissions.md +4 -4
  70. package/docs/copy-inventory.md +1370 -1411
  71. package/docs/copy-registry.json +2136 -2536
  72. package/docs/design/demonolith-plan.md +6 -6
  73. package/docs/design/modular-architecture/00-research-report.md +1 -1
  74. package/docs/design/project-startup-direction.md +2 -2
  75. package/docs/design/projects-hub-direction-v2.md +1 -1
  76. package/docs/design/reviews/hall-v2/README.md +2 -2
  77. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  78. package/docs/file-map.md +92 -96
  79. package/docs/handoff-template.md +5 -5
  80. package/docs/module-api-changelog.md +7 -3
  81. package/docs/modules-contract.md +8 -7
  82. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  83. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  84. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  85. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  86. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  87. package/docs/onboarding/diagrams/README.md +5 -9
  88. package/docs/onboarding/diagrams/assertions.json +3 -3
  89. package/docs/onboarding/slash-commands.md +2 -2
  90. package/docs/packs/artist.md +4 -4
  91. package/docs/packs/engineer.md +11 -10
  92. package/docs/packs/ideator.md +7 -7
  93. package/docs/page-inventory.json +20 -1
  94. package/docs/page-readings.json +4387 -4603
  95. package/docs/recipes/README.md +1 -1
  96. package/docs/recipes/audit-replay.md +4 -4
  97. package/docs/recipes/autobongos-windows-host.md +6 -6
  98. package/docs/recipes/bongos-cli-release.md +2 -2
  99. package/docs/recipes/claude-design-loop.md +7 -7
  100. package/docs/recipes/core-release-pipeline.md +19 -19
  101. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  102. package/docs/recipes/figma-design-loop.md +6 -6
  103. package/docs/recipes/gds-db-backup.md +9 -9
  104. package/docs/recipes/instance-deploy.md +3 -3
  105. package/docs/recipes/instance-first-run.md +1 -1
  106. package/docs/recipes/multi-builder-merge.md +2 -2
  107. package/docs/recipes/ops-gotchas.md +13 -10
  108. package/docs/recipes/packaging-the-core.md +6 -6
  109. package/docs/recipes/parallel-goal-waves.md +4 -4
  110. package/docs/recipes/private-npm-distribution.md +9 -9
  111. package/docs/recipes/redteam-patrol.md +5 -5
  112. package/docs/recipes/render-pilot.md +2 -2
  113. package/docs/recipes/reranking-a-goals-board.md +2 -2
  114. package/docs/recipes/search-index-ingestion.md +5 -5
  115. package/docs/recipes/self-host.md +1 -1
  116. package/docs/recipes/ship-and-regrade.md +4 -4
  117. package/docs/recipes/staging-environment.md +1 -1
  118. package/docs/recipes/standalone-live-docs.md +1 -1
  119. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  120. package/docs/recipes/upgrading-the-core.md +11 -11
  121. package/docs/recipes/windows-builders.md +18 -18
  122. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  123. package/docs/research/task-network-map-readability.md +3 -3
  124. package/migrations/core_278_builder_tester_tag.sql +18 -0
  125. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  126. package/modules/agents/lib/answer-hold.js +1 -1
  127. package/modules/agents/lib/gate.js +1 -1
  128. package/modules/agents/lib/validate.js +1 -1
  129. package/modules/autonomy/db.js +9 -0
  130. package/modules/autonomy/gauge.js +1 -1
  131. package/modules/autonomy/governor-docket.js +2 -2
  132. package/modules/autonomy/module.json +2 -2
  133. package/modules/autonomy/pollers/daily-checks.js +262 -0
  134. package/modules/autonomy/pollers/routine-timers.js +9 -7
  135. package/modules/autonomy/rank-roles.js +64 -0
  136. package/modules/autonomy/routes/autonomy.js +3 -3
  137. package/modules/autonomy/server-schedule.js +37 -0
  138. package/modules/builder-settings/interaction-prefs.js +1 -1
  139. package/modules/builder-settings/render-prefs.js +1 -1
  140. package/modules/builder-settings/routes/settings.js +1 -1
  141. package/modules/builder-settings/skill-prefs.js +2 -2
  142. package/modules/builder-settings/wandering-prefs.js +2 -2
  143. package/modules/copy-desk/module.json +2 -2
  144. package/modules/copy-desk/page-data.js +5 -5
  145. package/modules/copy-desk/page-decisions.js +13 -1
  146. package/modules/copy-desk/proposals.js +4 -4
  147. package/modules/copy-desk/registry.js +2 -2
  148. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  149. package/modules/copy-desk/routes/copy-desk.js +3 -12
  150. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  151. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  152. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  153. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  154. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  155. package/modules/design-styles/skills/README.md +4 -4
  156. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  157. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  158. package/modules/discord/bug-attachments.js +1 -1
  159. package/modules/discord/ship-broadcast.js +1 -1
  160. package/modules/economy/achievements.js +49 -7
  161. package/modules/economy/cost-classify.js +6 -6
  162. package/modules/economy/cost-report.js +1 -1
  163. package/modules/economy/cost.js +1 -1
  164. package/modules/economy/credits.js +2 -1
  165. package/modules/economy/idea-size.js +2 -2
  166. package/modules/economy/reward.js +2 -0
  167. package/modules/economy/routes/cost.js +1 -1
  168. package/modules/economy/streak.js +43 -4
  169. package/modules/government/asks.js +1 -1
  170. package/modules/government/board.js +19 -2
  171. package/modules/government/catalog.js +3 -0
  172. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  173. package/modules/government/protected-surfaces.json +48 -47
  174. package/modules/government/recommendations.js +6 -2
  175. package/modules/government/routes/government.js +1 -1
  176. package/modules/grading/generated-provenance.js +13 -5
  177. package/modules/grading/grade-engine.js +1 -1
  178. package/modules/grading/grader-rubric.json +1 -1
  179. package/modules/grading/grader-score.js +1 -1
  180. package/modules/grading/grader-workers/index.js +1 -1
  181. package/modules/grading/grader.js +1 -1
  182. package/modules/grading/routes/grade.js +1 -1
  183. package/modules/hall-ui/public/atlas.html +5 -7
  184. package/modules/hall-ui/public/atlas.js +1 -1
  185. package/modules/hall-ui/public/atlas.states.json +1 -1
  186. package/modules/hall-ui/public/blockers.css +9 -0
  187. package/modules/hall-ui/public/blockers.html +4 -4
  188. package/modules/hall-ui/public/blockers.js +29 -30
  189. package/modules/hall-ui/public/board-room.css +5 -17
  190. package/modules/hall-ui/public/board-room.html +5 -6
  191. package/modules/hall-ui/public/board-room.js +41 -23
  192. package/modules/hall-ui/public/board-room.states.json +1 -1
  193. package/modules/hall-ui/public/brand-apply.js +1 -1
  194. package/modules/hall-ui/public/brand-holes.js +1 -1
  195. package/modules/hall-ui/public/builders.js +40 -86
  196. package/modules/hall-ui/public/city-decide.js +18 -4
  197. package/modules/hall-ui/public/city.html +1 -1
  198. package/modules/hall-ui/public/collab.html +1 -1
  199. package/modules/hall-ui/public/commands.html +6 -9
  200. package/modules/hall-ui/public/copy-desk.html +1 -1
  201. package/modules/hall-ui/public/copy-desk.js +2 -2
  202. package/modules/hall-ui/public/craft-mode.js +4 -0
  203. package/modules/hall-ui/public/deploy.html +6 -2
  204. package/modules/hall-ui/public/deploy.js +21 -13
  205. package/modules/hall-ui/public/diagrams.css +1 -1
  206. package/modules/hall-ui/public/diagrams.html +5 -8
  207. package/modules/hall-ui/public/diagrams.states.json +1 -1
  208. package/modules/hall-ui/public/drachmae.html +3 -7
  209. package/modules/hall-ui/public/fleet.html +3 -2
  210. package/modules/hall-ui/public/fleet.js +0 -4
  211. package/modules/hall-ui/public/gate.html +7 -7
  212. package/modules/hall-ui/public/gate.js +58 -77
  213. package/modules/hall-ui/public/goal-map.html +1 -1
  214. package/modules/hall-ui/public/goals-page.js +5 -5
  215. package/modules/hall-ui/public/goals-render.js +10 -11
  216. package/modules/hall-ui/public/goals.css +10 -0
  217. package/modules/hall-ui/public/goals.html +14 -7
  218. package/modules/hall-ui/public/government.html +3 -5
  219. package/modules/hall-ui/public/government.js +1 -5
  220. package/modules/hall-ui/public/hall-render.js +117 -57
  221. package/modules/hall-ui/public/hall-widgets.js +11 -11
  222. package/modules/hall-ui/public/idea.html +1 -1
  223. package/modules/hall-ui/public/ideas.html +3 -1
  224. package/modules/hall-ui/public/ideas.js +1 -0
  225. package/modules/hall-ui/public/index.html +12 -6
  226. package/modules/hall-ui/public/index.states.json +1 -1
  227. package/modules/hall-ui/public/mine-lens.js +1 -1
  228. package/modules/hall-ui/public/modules.html +7 -10
  229. package/modules/hall-ui/public/modules.js +0 -2
  230. package/modules/hall-ui/public/my-agents.html +1 -1
  231. package/modules/hall-ui/public/palette.js +5 -5
  232. package/modules/hall-ui/public/primer.html +4 -9
  233. package/modules/hall-ui/public/profile-connections.js +10 -2
  234. package/modules/hall-ui/public/profile-roles.js +3 -10
  235. package/modules/hall-ui/public/profile.html +12 -10
  236. package/modules/hall-ui/public/profile.js +13 -17
  237. package/modules/hall-ui/public/project-settings.html +3 -4
  238. package/modules/hall-ui/public/project-settings.js +0 -3
  239. package/modules/hall-ui/public/ranks.html +5 -11
  240. package/modules/hall-ui/public/ranks.js +6 -8
  241. package/modules/hall-ui/public/roadmap.css +0 -2
  242. package/modules/hall-ui/public/roadmap.html +1 -1
  243. package/modules/hall-ui/public/roadmap.js +16 -51
  244. package/modules/hall-ui/public/roster.html +1 -1
  245. package/modules/hall-ui/public/sessions.html +6 -8
  246. package/modules/hall-ui/public/sessions.js +7 -7
  247. package/modules/hall-ui/public/settings.html +1 -1
  248. package/modules/hall-ui/public/shell-trail.js +1 -1
  249. package/modules/hall-ui/public/shell.js +17 -17
  250. package/modules/hall-ui/public/street-deck.css +2 -1
  251. package/modules/hall-ui/public/street-deck.js +10 -2
  252. package/modules/hall-ui/public/street-desk.js +16 -5
  253. package/modules/hall-ui/public/street.html +1 -1
  254. package/modules/hall-ui/public/studio-lib.js +4 -0
  255. package/modules/hall-ui/public/studio.css +2 -0
  256. package/modules/hall-ui/public/studio.html +1 -1
  257. package/modules/hall-ui/public/studio.js +27 -1
  258. package/modules/hall-ui/public/style.css +43 -26
  259. package/modules/hall-ui/public/task-detail.js +10 -7
  260. package/modules/hall-ui/public/task.css +2 -0
  261. package/modules/hall-ui/public/task.html +3 -1
  262. package/modules/hall-ui/public/task.js +23 -7
  263. package/modules/hall-ui/public/thinking.html +1 -1
  264. package/modules/hall-ui/public/tweak-editor.html +1 -1
  265. package/modules/hall-ui/public/vote-control.js +208 -0
  266. package/modules/hall-ui/public/watch.html +3 -5
  267. package/modules/hall-ui/public/watch.js +5 -4
  268. package/modules/hall-ui/public/welcome-boot.css +130 -0
  269. package/modules/hall-ui/public/welcome-boot.js +334 -0
  270. package/modules/hall-ui/public/welcome-day.webp +0 -0
  271. package/modules/hall-ui/public/welcome-night.webp +0 -0
  272. package/modules/hall-ui/public/work-summary.js +1 -1
  273. package/modules/hall-ui/public/work.css +1 -0
  274. package/modules/hall-ui/public/work.html +3 -1
  275. package/modules/hall-ui/public/work.js +2 -1
  276. package/modules/hall-ui/records/accomplishments.md +16 -0
  277. package/modules/hall-ui/records/hall-ask-card.md +9 -0
  278. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  279. package/modules/hall-ui/records/oversight-family.md +1 -1
  280. package/modules/hall-ui/records/profile-connections.md +2 -0
  281. package/modules/hall-ui/records/profile-roles.md +1 -1
  282. package/modules/hall-ui/records/reading-rooms.md +1 -1
  283. package/modules/hall-ui/records/welcome-tower.md +50 -0
  284. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  285. package/modules/ideas/projection.js +1 -1
  286. package/modules/ideas/routes/blockers.js +3 -3
  287. package/modules/ideas/routes/inbox.js +29 -1
  288. package/modules/ideas/routes/ratify-goal.js +1 -1
  289. package/modules/ideas/routing.js +1 -1
  290. package/modules/ideas/templates.js +1 -1
  291. package/modules/ideas/trail-descent.js +1 -1
  292. package/modules/ideas/trail-size.js +1 -1
  293. package/modules/ideas/votes.js +93 -0
  294. package/modules/lifecycle/abandon-leftovers.js +1 -1
  295. package/modules/lifecycle/cascade.js +1 -1
  296. package/modules/lifecycle/conflict-resolve.js +13 -21
  297. package/modules/lifecycle/criterion-ref.js +1 -1
  298. package/modules/lifecycle/db-analytics.js +57 -4
  299. package/modules/lifecycle/db-deps-criteria.js +1 -1
  300. package/modules/lifecycle/db-ship.js +2 -2
  301. package/modules/lifecycle/db-tasks.js +2 -2
  302. package/modules/lifecycle/db-versions.js +1 -1
  303. package/modules/lifecycle/db.js +2 -0
  304. package/modules/lifecycle/dead-deps.js +3 -3
  305. package/modules/lifecycle/dependency-advisory.js +3 -3
  306. package/modules/lifecycle/goal-category.js +1 -1
  307. package/modules/lifecycle/goal-forest.js +1 -1
  308. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  309. package/modules/lifecycle/kickoff-checklist.js +1 -1
  310. package/modules/lifecycle/kickoff-seed.js +1 -1
  311. package/modules/lifecycle/lifecycle.js +2 -0
  312. package/modules/lifecycle/merge-reach.js +29 -15
  313. package/modules/lifecycle/missing-dep-classify.js +3 -3
  314. package/modules/lifecycle/module.json +2 -1
  315. package/modules/lifecycle/page-tweak-approve.js +85 -1
  316. package/modules/lifecycle/page-tweak-hold.js +1 -1
  317. package/modules/lifecycle/publish-reconciler.js +1 -2
  318. package/modules/lifecycle/rot.js +1 -1
  319. package/modules/lifecycle/routes/artist-gate.js +1 -1
  320. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  321. package/modules/lifecycle/routes/goals.js +1 -1
  322. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  323. package/modules/lifecycle/routes/task-votes.js +54 -0
  324. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  325. package/modules/lifecycle/routes/tasks.js +2 -2
  326. package/modules/lifecycle/routes/versions.js +2 -2
  327. package/modules/lifecycle/ship-card.js +4 -4
  328. package/modules/lifecycle/ship-preflight.js +1 -1
  329. package/modules/lifecycle/task-classifier.js +1 -1
  330. package/modules/lifecycle/task-status.js +1 -1
  331. package/modules/lifecycle/task-visual-db.js +1 -1
  332. package/modules/memory/learnings.js +1 -1
  333. package/modules/memory/pollers/search-index.js +2 -2
  334. package/modules/memory/routes/learnings.js +1 -1
  335. package/modules/memory/routes/memory.js +1 -1
  336. package/modules/memory/search.js +2 -2
  337. package/modules/npm-release/release.js +1 -1
  338. package/modules/onboarding/howto-moments.js +1 -1
  339. package/modules/onboarding/newcomer-restock.js +3 -3
  340. package/modules/onboarding/onboarding.js +1 -1
  341. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  342. package/modules/platform-identity/origin-containment.js +1 -1
  343. package/modules/platform-identity/publish-gate.js +1 -1
  344. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  345. package/modules/provisioning/capacity.js +1 -1
  346. package/modules/provisioning/core-upgrade.js +15 -9
  347. package/modules/provisioning/credential-preflight.js +3 -3
  348. package/modules/provisioning/disconnect.js +1 -1
  349. package/modules/provisioning/dns-resolves.js +1 -1
  350. package/modules/provisioning/module.json +1 -1
  351. package/modules/provisioning/onboard-plan.js +1 -1
  352. package/modules/provisioning/paid-shape-gate.js +2 -2
  353. package/modules/provisioning/planet-physics.js +11 -2
  354. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  355. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  356. package/modules/provisioning/provisioning.js +2 -2
  357. package/modules/provisioning/render-lookup.js +1 -1
  358. package/modules/provisioning/render-standup.js +3 -3
  359. package/modules/provisioning/repo-private.js +1 -1
  360. package/modules/provisioning/routes/callback-page.js +1 -1
  361. package/modules/provisioning/routes/core-upgrade.js +23 -3
  362. package/modules/provisioning/routes/provisioning.js +2 -2
  363. package/modules/provisioning/routes/render-standup.js +1 -1
  364. package/modules/provisioning/routes/repo-private.js +1 -1
  365. package/modules/provisioning/soft-limits.js +1 -1
  366. package/modules/provisioning/starter-bundles.js +4 -2
  367. package/modules/provisioning/tests/provisioning.mjs +1 -1
  368. package/modules/public-landing/public/account.html +4 -6
  369. package/modules/public-landing/public/assets/cosmos.css +13 -6
  370. package/modules/public-landing/public/connections.html +4 -6
  371. package/modules/public-landing/public/contact.html +4 -6
  372. package/modules/public-landing/public/guild.html +4 -6
  373. package/modules/public-landing/public/index.html +11 -9
  374. package/modules/public-landing/public/invitations.html +4 -6
  375. package/modules/public-landing/public/privacy.html +4 -6
  376. package/modules/public-landing/public/projects.html +168 -46
  377. package/modules/public-landing/public/terms.html +4 -6
  378. package/modules/raise/content/copy.json +40 -0
  379. package/modules/raise/content/nda.html +39 -0
  380. package/modules/raise/content/settings.json +49 -0
  381. package/modules/raise/db.js +95 -0
  382. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  383. package/modules/raise/module.json +28 -0
  384. package/modules/raise/page.js +194 -0
  385. package/modules/raise/public/edit.js +152 -0
  386. package/modules/raise/public/favicon.svg +1 -0
  387. package/modules/raise/public/logo-ink.svg +1 -0
  388. package/modules/raise/public/logo-night.svg +1 -0
  389. package/modules/raise/public/mode.js +8 -0
  390. package/modules/raise/public/raise.css +234 -0
  391. package/modules/raise/public/raise.js +91 -0
  392. package/modules/raise/raise.js +174 -0
  393. package/modules/raise/routes/raise.js +152 -0
  394. package/modules/raise/views/gate.html +39 -0
  395. package/modules/raise/views/nda.html +21 -0
  396. package/modules/raise/views/page.html +133 -0
  397. package/modules/raise/web.js +72 -0
  398. package/modules/render-deploy/deploys.js +1 -1
  399. package/modules/render-deploy/render.js +2 -2
  400. package/modules/security/secret-scrub.js +3 -3
  401. package/modules/security/security.js +1 -1
  402. package/modules/security/tests/artifact_scan.mjs +1 -1
  403. package/modules/security/tests/mirror.mjs +1 -1
  404. package/modules/security/tests/scan_store.mjs +1 -1
  405. package/modules/sessions/db.js +2 -2
  406. package/modules/sessions/pulse.js +2 -2
  407. package/modules/sessions/routes/sessions.js +1 -1
  408. package/modules/specialities/specialities.js +1 -1
  409. package/modules/status-ui/public/README.md +3 -4
  410. package/modules/status-ui/public/index.html +5 -31
  411. package/modules/status-ui/public/status.js +6 -174
  412. package/modules/status-ui/public/style.css +4 -133
  413. package/modules/ui-design/docs/design-contract.md +3 -3
  414. package/modules/ui-design/kit/README.md +1 -1
  415. package/modules/ui-design/kit/serve.js +13 -4
  416. package/modules/ui-design/scripts/design-sync.js +1 -1
  417. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  418. package/modules/ui-design/scripts/validate-design.js +1 -1
  419. package/package-lock.json +27 -11
  420. package/package.json +2 -3
  421. package/release-notes.json +186 -0
  422. package/scripts/bongos/CLAUDE.md +15 -0
  423. package/scripts/bongos/abandon.js +137 -0
  424. package/scripts/bongos/accessibility-replay.js +195 -0
  425. package/scripts/bongos/address-park-sweep.sh +91 -0
  426. package/scripts/bongos/adopt-detect.js +123 -0
  427. package/scripts/bongos/adopt-import.js +111 -0
  428. package/scripts/bongos/adopt-preflight.js +187 -0
  429. package/scripts/bongos/adr-namespace.js +273 -0
  430. package/scripts/bongos/agent-invoke.js +689 -0
  431. package/scripts/bongos/agents-sync.js +502 -0
  432. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  433. package/scripts/bongos/api-artifacts.js +91 -0
  434. package/scripts/bongos/api.js +86 -0
  435. package/scripts/bongos/api.ps1 +26 -0
  436. package/scripts/bongos/architect-audit.js +294 -0
  437. package/scripts/bongos/artifact-audit.js +326 -0
  438. package/scripts/bongos/artifact-format.js +203 -0
  439. package/scripts/bongos/ask.js +231 -0
  440. package/scripts/bongos/audit-authorship.sh +324 -0
  441. package/scripts/bongos/audit-deps.js +189 -0
  442. package/scripts/bongos/audit-gate.js +121 -0
  443. package/scripts/bongos/audit-rank-roles.js +131 -0
  444. package/scripts/bongos/audit-replay.sh +205 -0
  445. package/scripts/bongos/autobongos-digest.js +123 -0
  446. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  447. package/scripts/bongos/autobongos-loop.js +210 -0
  448. package/scripts/bongos/autobongos-run.js +1361 -0
  449. package/scripts/bongos/autobongos-service.cmd +50 -0
  450. package/scripts/bongos/autobongos-service.ps1 +270 -0
  451. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  452. package/scripts/bongos/autobongos-verify.js +618 -0
  453. package/scripts/bongos/autonomy-gate.js +135 -0
  454. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  455. package/scripts/bongos/autonomy-gauge.js +84 -0
  456. package/scripts/bongos/backfill-cost.js +176 -0
  457. package/scripts/bongos/backfill-disciplines.js +144 -0
  458. package/scripts/bongos/backfill-session-earnings.js +123 -0
  459. package/scripts/bongos/backfill-session-types.js +87 -0
  460. package/scripts/bongos/backfill-sessions.js +411 -0
  461. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  462. package/scripts/bongos/backfill-task-rewards.js +413 -0
  463. package/scripts/bongos/backlog-review.js +399 -0
  464. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  465. package/scripts/bongos/backup.js +116 -0
  466. package/scripts/bongos/baseline-staleness.js +217 -0
  467. package/scripts/bongos/bfg-principal-token.js +65 -0
  468. package/scripts/bongos/bug-attachment-audit.js +149 -0
  469. package/scripts/bongos/bug-attachment-recover.js +198 -0
  470. package/scripts/bongos/bug-triage.js +292 -0
  471. package/scripts/bongos/build-bongos.js +94 -0
  472. package/scripts/bongos/bump-version.js +221 -0
  473. package/scripts/bongos/capture.js +481 -0
  474. package/scripts/bongos/category-advisory-guard.js +206 -0
  475. package/scripts/bongos/ci-grade.js +82 -0
  476. package/scripts/bongos/claim-recall.js +112 -0
  477. package/scripts/bongos/claim.js +789 -0
  478. package/scripts/bongos/claude-materialize.js +1200 -0
  479. package/scripts/bongos/claude-md-template.js +142 -0
  480. package/scripts/bongos/cleanup-orphans.js +74 -0
  481. package/scripts/bongos/cli-lib.js +1226 -0
  482. package/scripts/bongos/client-baseurl-guard.js +116 -0
  483. package/scripts/bongos/codemod-rename-scripts-gds.js +380 -0
  484. package/scripts/bongos/conductor-dispatch.js +535 -0
  485. package/scripts/bongos/context-pack.js +326 -0
  486. package/scripts/bongos/control-manifest.js +199 -0
  487. package/scripts/bongos/copy-apply.js +758 -0
  488. package/scripts/bongos/copy-inventory.js +571 -0
  489. package/scripts/bongos/core-origin-follow.js +185 -0
  490. package/scripts/bongos/core-pin-sync.js +260 -0
  491. package/scripts/bongos/cost-report.js +63 -0
  492. package/scripts/bongos/cost.js +47 -0
  493. package/scripts/bongos/credential-presence.js +296 -0
  494. package/scripts/bongos/cutover-codemod.js +240 -0
  495. package/scripts/bongos/db-backup-nightly.sh +232 -0
  496. package/scripts/bongos/db-backup-offsite.sh +267 -0
  497. package/scripts/bongos/demote.js +45 -0
  498. package/scripts/bongos/deploy-divergence.js +454 -0
  499. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  500. package/scripts/bongos/design-sync.js +12 -0
  501. package/scripts/bongos/dev-box-guard.js +166 -0
  502. package/scripts/bongos/dev-lib.js +722 -0
  503. package/scripts/bongos/dev.js +645 -0
  504. package/scripts/bongos/device-flow-help.js +72 -0
  505. package/scripts/bongos/diagnose-achievements.js +118 -0
  506. package/scripts/bongos/diagram-facts.js +355 -0
  507. package/scripts/bongos/discord-channels.js +77 -0
  508. package/scripts/bongos/do-api.js +109 -0
  509. package/scripts/bongos/doc-cli-guard.js +274 -0
  510. package/scripts/bongos/doc-comment-coverage.js +139 -0
  511. package/scripts/bongos/doc-control-claims.js +170 -0
  512. package/scripts/bongos/docs-entropy.js +453 -0
  513. package/scripts/bongos/doctor.js +493 -0
  514. package/scripts/bongos/enroll-control-plane.js +101 -0
  515. package/scripts/bongos/exec-path-guard.js +564 -0
  516. package/scripts/bongos/feedback-send.js +249 -0
  517. package/scripts/bongos/fetch-art-key.js +106 -0
  518. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  519. package/scripts/bongos/figma-design-sync.js +11 -0
  520. package/scripts/bongos/find-untested.js +371 -0
  521. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  522. package/scripts/bongos/fitness-checks-identity.js +332 -0
  523. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  524. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  525. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  526. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  527. package/scripts/bongos/fitness-lib.js +127 -0
  528. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  529. package/scripts/bongos/fitness-ratchets.js +594 -0
  530. package/scripts/bongos/fitness.js +1498 -0
  531. package/scripts/bongos/forwarder.js +80 -0
  532. package/scripts/bongos/gate-review.js +330 -0
  533. package/scripts/bongos/gating.js +348 -0
  534. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  535. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  537. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  538. package/scripts/bongos/gds-literal-scan.js +196 -0
  539. package/scripts/bongos/gen-api-client.js +576 -0
  540. package/scripts/bongos/gen-api-docs.js +1111 -0
  541. package/scripts/bongos/gen-atlas.js +366 -0
  542. package/scripts/bongos/gen-diagrams.js +608 -0
  543. package/scripts/bongos/gen-file-map.js +337 -0
  544. package/scripts/bongos/gen-freshness.js +32 -0
  545. package/scripts/bongos/gen-interaction-posture.js +122 -0
  546. package/scripts/bongos/gen-repo-map.js +540 -0
  547. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  548. package/scripts/bongos/gen-session-index.js +243 -0
  549. package/scripts/bongos/gen-sounds.js +176 -0
  550. package/scripts/bongos/git-merge-regen.js +254 -0
  551. package/scripts/bongos/go-live.js +1071 -0
  552. package/scripts/bongos/goal.js +272 -0
  553. package/scripts/bongos/government-walk.js +1477 -0
  554. package/scripts/bongos/grade-correlation-audit.js +310 -0
  555. package/scripts/bongos/grade-replay.js +237 -0
  556. package/scripts/bongos/grade-smoke.js +205 -0
  557. package/scripts/bongos/home-isolation-guard.js +126 -0
  558. package/scripts/bongos/hooks/pre-push.js +211 -0
  559. package/scripts/bongos/howto.js +145 -0
  560. package/scripts/bongos/http-api-client.js +81 -0
  561. package/scripts/bongos/identity-strip.js +75 -0
  562. package/scripts/bongos/init.js +1159 -0
  563. package/scripts/bongos/install-git-hooks.js +200 -0
  564. package/scripts/bongos/instance-apex.js +38 -0
  565. package/scripts/bongos/intent-retry.js +52 -0
  566. package/scripts/bongos/key-card.js +222 -0
  567. package/scripts/bongos/key-status.js +126 -0
  568. package/scripts/bongos/land-watch.js +201 -0
  569. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  570. package/scripts/bongos/learning-capture.js +145 -0
  571. package/scripts/bongos/lib.sh +74 -0
  572. package/scripts/bongos/linkify-refs.js +655 -0
  573. package/scripts/bongos/lint-infra-exec.js +70 -0
  574. package/scripts/bongos/lint-migrations.js +102 -0
  575. package/scripts/bongos/lint-workflow-exec.js +63 -0
  576. package/scripts/bongos/local-preview-lib.js +128 -0
  577. package/scripts/bongos/local-preview.js +82 -0
  578. package/scripts/bongos/login.js +360 -0
  579. package/scripts/bongos/main-audit.js +625 -0
  580. package/scripts/bongos/me.js +97 -0
  581. package/scripts/bongos/memory-map.js +176 -0
  582. package/scripts/bongos/merge-lock.js +71 -0
  583. package/scripts/bongos/migration-namespace.js +313 -0
  584. package/scripts/bongos/mirror-lineage-check.js +343 -0
  585. package/scripts/bongos/mirror-redact.js +350 -0
  586. package/scripts/bongos/module-artifact.js +289 -0
  587. package/scripts/bongos/module-assess-docs.js +238 -0
  588. package/scripts/bongos/module-assess-installs.js +228 -0
  589. package/scripts/bongos/module-assess-score.js +111 -0
  590. package/scripts/bongos/module-assess-security.js +252 -0
  591. package/scripts/bongos/module-assess-tests.js +278 -0
  592. package/scripts/bongos/module-assess-version.js +92 -0
  593. package/scripts/bongos/module-error-report.js +148 -0
  594. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  595. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  596. package/scripts/bongos/module-test-runner.js +414 -0
  597. package/scripts/bongos/module.js +1376 -0
  598. package/scripts/bongos/move-escalation.js +141 -0
  599. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  600. package/scripts/bongos/newcomer-floor.js +421 -0
  601. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  602. package/scripts/bongos/newcomer-floor.test.js +235 -0
  603. package/scripts/bongos/next-number.js +163 -0
  604. package/scripts/bongos/oauth-secret.js +202 -0
  605. package/scripts/bongos/onboard.js +267 -0
  606. package/scripts/bongos/onboarding-analyze.js +226 -0
  607. package/scripts/bongos/onboarding-config.js +179 -0
  608. package/scripts/bongos/onboarding-ship.js +92 -0
  609. package/scripts/bongos/pack-env-prefix.js +73 -0
  610. package/scripts/bongos/package-core.js +1200 -0
  611. package/scripts/bongos/page-inventory.js +348 -0
  612. package/scripts/bongos/page-reader.js +722 -0
  613. package/scripts/bongos/paste-token.js +212 -0
  614. package/scripts/bongos/plain-cards.js +351 -0
  615. package/scripts/bongos/portability-smoke-art.sh +85 -0
  616. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  617. package/scripts/bongos/preflight.js +214 -0
  618. package/scripts/bongos/probe-cache.js +246 -0
  619. package/scripts/bongos/prove-strict-versioning.js +284 -0
  620. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  621. package/scripts/bongos/provision-byo-host.js +68 -0
  622. package/scripts/bongos/provision-capacity.js +79 -0
  623. package/scripts/bongos/provision-caps.js +63 -0
  624. package/scripts/bongos/provision-config.js +233 -0
  625. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  626. package/scripts/bongos/provision-disconnect.js +88 -0
  627. package/scripts/bongos/provision-github-setup.js +168 -0
  628. package/scripts/bongos/provision-net.js +357 -0
  629. package/scripts/bongos/provision-pin-key.js +176 -0
  630. package/scripts/bongos/provision-pin-replay.js +126 -0
  631. package/scripts/bongos/provision-process.js +170 -0
  632. package/scripts/bongos/provision-render.js +201 -0
  633. package/scripts/bongos/provision-repo-auth.js +164 -0
  634. package/scripts/bongos/provision-repo-private.js +98 -0
  635. package/scripts/bongos/provision-repo.js +1337 -0
  636. package/scripts/bongos/provision-teardown.js +106 -0
  637. package/scripts/bongos/provision-units.js +469 -0
  638. package/scripts/bongos/provision.js +1479 -0
  639. package/scripts/bongos/publish-credential-check.js +66 -0
  640. package/scripts/bongos/publish-integration-gate.js +142 -0
  641. package/scripts/bongos/publish-manifest.js +440 -0
  642. package/scripts/bongos/publish-watch.js +268 -0
  643. package/scripts/bongos/pulse.js +338 -0
  644. package/scripts/bongos/push-main.js +56 -0
  645. package/scripts/bongos/push-path-brief.js +100 -0
  646. package/scripts/bongos/read-session-export.js +359 -0
  647. package/scripts/bongos/reauth.js +155 -0
  648. package/scripts/bongos/recall.js +183 -0
  649. package/scripts/bongos/redteam-patrol.js +437 -0
  650. package/scripts/bongos/regen-instance-docs.js +47 -0
  651. package/scripts/bongos/release-core.js +80 -0
  652. package/scripts/bongos/release-notes.js +271 -0
  653. package/scripts/bongos/release.js +139 -0
  654. package/scripts/bongos/rename-history-check.js +369 -0
  655. package/scripts/bongos/rename-ledger-prose.js +482 -0
  656. package/scripts/bongos/render-api.js +197 -0
  657. package/scripts/bongos/render-check.js +206 -0
  658. package/scripts/bongos/render-ideas.js +226 -0
  659. package/scripts/bongos/render-payload.js +85 -0
  660. package/scripts/bongos/repo-metrics.js +363 -0
  661. package/scripts/bongos/review-sheet.js +108 -0
  662. package/scripts/bongos/role-pack-guard.js +142 -0
  663. package/scripts/bongos/route-shadow-guard.js +175 -0
  664. package/scripts/bongos/routine-schedule.js +318 -0
  665. package/scripts/bongos/run-routine.js +257 -0
  666. package/scripts/bongos/run-unit-tests.js +654 -0
  667. package/scripts/bongos/runner-drift.js +151 -0
  668. package/scripts/bongos/sandbox-stage.js +459 -0
  669. package/scripts/bongos/scope-map-guard.js +300 -0
  670. package/scripts/bongos/scope-roster-guard.js +118 -0
  671. package/scripts/bongos/seam-wiring-guard.js +275 -0
  672. package/scripts/bongos/search-ingest-db.js +288 -0
  673. package/scripts/bongos/search-ingest-md.js +269 -0
  674. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  675. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  676. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  677. package/scripts/bongos/seed-staging.sh +117 -0
  678. package/scripts/bongos/seed-verify-criteria.js +124 -0
  679. package/scripts/bongos/sequence.js +597 -0
  680. package/scripts/bongos/session-cost.js +430 -0
  681. package/scripts/bongos/session-digest-build.js +293 -0
  682. package/scripts/bongos/session-digest.js +200 -0
  683. package/scripts/bongos/session-eval.js +631 -0
  684. package/scripts/bongos/session-transcript-build.js +155 -0
  685. package/scripts/bongos/session-transcript-upload.js +29 -0
  686. package/scripts/bongos/session.js +404 -0
  687. package/scripts/bongos/setup.js +646 -0
  688. package/scripts/bongos/ship-check.js +89 -0
  689. package/scripts/bongos/ship-deploy-target.js +393 -0
  690. package/scripts/bongos/ship-escalation.js +167 -0
  691. package/scripts/bongos/ship-finish.js +420 -0
  692. package/scripts/bongos/ship-flow.js +1217 -0
  693. package/scripts/bongos/ship-git.js +100 -0
  694. package/scripts/bongos/ship-grade-steps.js +547 -0
  695. package/scripts/bongos/ship-grade.js +426 -0
  696. package/scripts/bongos/ship-honesty.js +314 -0
  697. package/scripts/bongos/ship-io.js +139 -0
  698. package/scripts/bongos/ship-land.js +1130 -0
  699. package/scripts/bongos/ship-memory-sync.js +249 -0
  700. package/scripts/bongos/ship-merge-gate.js +225 -0
  701. package/scripts/bongos/ship-merge.js +466 -0
  702. package/scripts/bongos/ship-mode-ask.js +138 -0
  703. package/scripts/bongos/ship-mode-manual.js +54 -0
  704. package/scripts/bongos/ship-preflight-steps.js +399 -0
  705. package/scripts/bongos/ship-regen.js +291 -0
  706. package/scripts/bongos/ship-resume.js +201 -0
  707. package/scripts/bongos/ship-session-upload.js +313 -0
  708. package/scripts/bongos/ship-state.js +110 -0
  709. package/scripts/bongos/ship-surprise.js +84 -0
  710. package/scripts/bongos/ship-visual.js +75 -0
  711. package/scripts/bongos/ship.js +382 -0
  712. package/scripts/bongos/shipping-mode.js +71 -0
  713. package/scripts/bongos/skill-lint.js +250 -0
  714. package/scripts/bongos/skill-preflight.js +361 -0
  715. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  716. package/scripts/bongos/smoke-batch-release.sh +316 -0
  717. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  718. package/scripts/bongos/smoke-dependencies.sh +143 -0
  719. package/scripts/bongos/smoke-gds.js +256 -0
  720. package/scripts/bongos/smoke-write.sh +275 -0
  721. package/scripts/bongos/source-text-test-scan.js +106 -0
  722. package/scripts/bongos/spark.js +294 -0
  723. package/scripts/bongos/stale-worktrees.js +212 -0
  724. package/scripts/bongos/start-goals.js +102 -0
  725. package/scripts/bongos/start.js +1090 -0
  726. package/scripts/bongos/status.js +545 -0
  727. package/scripts/bongos/strand-watch.js +315 -0
  728. package/scripts/bongos/stranded-rows.js +200 -0
  729. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  730. package/scripts/bongos/surface.js +101 -0
  731. package/scripts/bongos/task.js +273 -0
  732. package/scripts/bongos/test-path-guard.js +99 -0
  733. package/scripts/bongos/triage.js +742 -0
  734. package/scripts/bongos/turn-end-sound.js +74 -0
  735. package/scripts/bongos/tweak-halt.js +70 -0
  736. package/scripts/bongos/tweak-renders.js +200 -0
  737. package/scripts/bongos/uat.js +120 -0
  738. package/scripts/bongos/ui-kit-transform.js +43 -0
  739. package/scripts/bongos/update-channel.js +512 -0
  740. package/scripts/bongos/update-sweep.js +829 -0
  741. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  742. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  743. package/scripts/bongos/upgrade-migrate.js +224 -0
  744. package/scripts/bongos/upgrade-operator.js +73 -0
  745. package/scripts/bongos/upgrade-outcome.js +174 -0
  746. package/scripts/bongos/upgrade.js +1499 -0
  747. package/scripts/bongos/validate-design.js +12 -0
  748. package/scripts/bongos/version-close.js +621 -0
  749. package/scripts/bongos/version-literal-guard.js +140 -0
  750. package/scripts/bongos/version-select.js +79 -0
  751. package/scripts/bongos/visual-review-nudge.js +39 -0
  752. package/scripts/bongos/wedge-remedy.js +174 -0
  753. package/scripts/bongos/worktree-claim-guard.js +130 -0
  754. package/scripts/bongos/worktree.js +449 -0
  755. package/scripts/discord/post.js +1 -1
  756. package/scripts/gds/README.md +9 -0
  757. package/scripts/gds/abandon.js +6 -136
  758. package/scripts/gds/accessibility-replay.js +5 -194
  759. package/scripts/gds/address-park-sweep.sh +7 -90
  760. package/scripts/gds/adopt-detect.js +5 -121
  761. package/scripts/gds/adopt-import.js +5 -109
  762. package/scripts/gds/adopt-preflight.js +5 -185
  763. package/scripts/gds/adr-namespace.js +5 -271
  764. package/scripts/gds/agent-invoke.js +5 -687
  765. package/scripts/gds/agents-sync.js +5 -500
  766. package/scripts/gds/api-alias-caller-scan.js +5 -255
  767. package/scripts/gds/api-artifacts.js +6 -0
  768. package/scripts/gds/api.js +6 -85
  769. package/scripts/gds/api.ps1 +8 -26
  770. package/scripts/gds/architect-audit.js +6 -293
  771. package/scripts/gds/artifact-audit.js +5 -324
  772. package/scripts/gds/artifact-format.js +6 -203
  773. package/scripts/gds/ask.js +5 -229
  774. package/scripts/gds/audit-authorship.sh +7 -328
  775. package/scripts/gds/audit-deps.js +6 -188
  776. package/scripts/gds/audit-gate.js +5 -119
  777. package/scripts/gds/audit-rank-roles.js +6 -171
  778. package/scripts/gds/audit-replay.sh +7 -204
  779. package/scripts/gds/autobongos-digest.js +5 -121
  780. package/scripts/gds/autobongos-grade-cap.js +5 -186
  781. package/scripts/gds/autobongos-loop.js +5 -208
  782. package/scripts/gds/autobongos-run.js +5 -1359
  783. package/scripts/gds/autobongos-service.cmd +8 -49
  784. package/scripts/gds/autobongos-service.ps1 +8 -270
  785. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  786. package/scripts/gds/autobongos-verify.js +5 -616
  787. package/scripts/gds/autonomy-gate.js +5 -133
  788. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  789. package/scripts/gds/autonomy-gauge.js +5 -82
  790. package/scripts/gds/backfill-cost.js +6 -175
  791. package/scripts/gds/backfill-disciplines.js +5 -142
  792. package/scripts/gds/backfill-session-earnings.js +5 -121
  793. package/scripts/gds/backfill-session-types.js +5 -85
  794. package/scripts/gds/backfill-sessions.js +5 -409
  795. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  796. package/scripts/gds/backfill-task-rewards.js +5 -411
  797. package/scripts/gds/backlog-review.js +6 -398
  798. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  799. package/scripts/gds/backup.js +6 -115
  800. package/scripts/gds/baseline-staleness.js +5 -215
  801. package/scripts/gds/bfg-principal-token.js +6 -64
  802. package/scripts/gds/bug-attachment-audit.js +5 -147
  803. package/scripts/gds/bug-attachment-recover.js +5 -196
  804. package/scripts/gds/bug-triage.js +6 -291
  805. package/scripts/gds/build-bongos.js +5 -92
  806. package/scripts/gds/bump-version.js +5 -219
  807. package/scripts/gds/capture.js +6 -480
  808. package/scripts/gds/category-advisory-guard.js +5 -205
  809. package/scripts/gds/ci-grade.js +6 -81
  810. package/scripts/gds/claim-recall.js +6 -111
  811. package/scripts/gds/claim.js +6 -788
  812. package/scripts/gds/claude-materialize.js +5 -1198
  813. package/scripts/gds/claude-md-template.js +5 -140
  814. package/scripts/gds/cleanup-orphans.js +6 -73
  815. package/scripts/gds/cli-lib.js +6 -1204
  816. package/scripts/gds/client-baseurl-guard.js +5 -114
  817. package/scripts/gds/conductor-dispatch.js +6 -534
  818. package/scripts/gds/context-pack.js +6 -325
  819. package/scripts/gds/control-manifest.js +5 -197
  820. package/scripts/gds/copy-apply.js +5 -756
  821. package/scripts/gds/copy-inventory.js +5 -569
  822. package/scripts/gds/core-origin-follow.js +5 -184
  823. package/scripts/gds/core-pin-sync.js +5 -258
  824. package/scripts/gds/cost-report.js +6 -62
  825. package/scripts/gds/cost.js +6 -46
  826. package/scripts/gds/credential-presence.js +5 -294
  827. package/scripts/gds/cutover-codemod.js +5 -239
  828. package/scripts/gds/db-backup-nightly.sh +7 -231
  829. package/scripts/gds/db-backup-offsite.sh +7 -266
  830. package/scripts/gds/demote.js +6 -44
  831. package/scripts/gds/deploy-divergence.js +6 -445
  832. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  833. package/scripts/gds/design-sync.js +5 -10
  834. package/scripts/gds/dev-box-guard.js +5 -164
  835. package/scripts/gds/dev-lib.js +5 -721
  836. package/scripts/gds/dev.js +5 -643
  837. package/scripts/gds/device-flow-help.js +5 -70
  838. package/scripts/gds/diagnose-achievements.js +5 -116
  839. package/scripts/gds/diagram-facts.js +6 -355
  840. package/scripts/gds/discord-channels.js +5 -75
  841. package/scripts/gds/do-api.js +6 -109
  842. package/scripts/gds/doc-cli-guard.js +5 -266
  843. package/scripts/gds/doc-comment-coverage.js +5 -137
  844. package/scripts/gds/doc-control-claims.js +5 -166
  845. package/scripts/gds/docs-entropy.js +5 -443
  846. package/scripts/gds/doctor.js +6 -492
  847. package/scripts/gds/enroll-control-plane.js +5 -99
  848. package/scripts/gds/exec-path-guard.js +5 -562
  849. package/scripts/gds/feedback-send.js +5 -247
  850. package/scripts/gds/fetch-art-key.js +5 -104
  851. package/scripts/gds/fetch-sound-prefs.js +5 -124
  852. package/scripts/gds/figma-design-sync.js +5 -9
  853. package/scripts/gds/find-untested.js +5 -369
  854. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  855. package/scripts/gds/fitness-checks-identity.js +5 -342
  856. package/scripts/gds/fitness-checks-packaging.js +5 -131
  857. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  858. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  859. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  860. package/scripts/gds/fitness-lib.js +5 -126
  861. package/scripts/gds/fitness-migration-contraction.js +5 -49
  862. package/scripts/gds/fitness-ratchets.js +5 -563
  863. package/scripts/gds/fitness.js +5 -1493
  864. package/scripts/gds/gate-review.js +5 -328
  865. package/scripts/gds/gating.js +5 -346
  866. package/scripts/gds/gds-literal-scan.js +5 -194
  867. package/scripts/gds/gen-api-client.js +5 -555
  868. package/scripts/gds/gen-api-docs.js +5 -1100
  869. package/scripts/gds/gen-atlas.js +5 -364
  870. package/scripts/gds/gen-diagrams.js +6 -607
  871. package/scripts/gds/gen-file-map.js +5 -335
  872. package/scripts/gds/gen-freshness.js +5 -31
  873. package/scripts/gds/gen-interaction-posture.js +5 -120
  874. package/scripts/gds/gen-repo-map.js +5 -538
  875. package/scripts/gds/gen-role-responsibilities.js +5 -133
  876. package/scripts/gds/gen-session-index.js +5 -241
  877. package/scripts/gds/gen-sounds.js +5 -174
  878. package/scripts/gds/git-merge-regen.js +6 -291
  879. package/scripts/gds/go-live.js +5 -1069
  880. package/scripts/gds/goal.js +6 -271
  881. package/scripts/gds/government-walk.js +5 -1475
  882. package/scripts/gds/grade-correlation-audit.js +5 -308
  883. package/scripts/gds/grade-replay.js +5 -235
  884. package/scripts/gds/grade-smoke.js +6 -204
  885. package/scripts/gds/home-isolation-guard.js +5 -125
  886. package/scripts/gds/hooks/pre-push.js +5 -209
  887. package/scripts/gds/howto.js +5 -143
  888. package/scripts/gds/http-api-client.js +6 -81
  889. package/scripts/gds/identity-strip.js +5 -74
  890. package/scripts/gds/init.js +5 -1157
  891. package/scripts/gds/install-git-hooks.js +5 -198
  892. package/scripts/gds/instance-apex.js +5 -37
  893. package/scripts/gds/intent-retry.js +5 -51
  894. package/scripts/gds/key-card.js +6 -221
  895. package/scripts/gds/key-status.js +5 -124
  896. package/scripts/gds/land-watch.js +5 -199
  897. package/scripts/gds/leak-scan-allowlist.js +5 -291
  898. package/scripts/gds/learning-capture.js +6 -144
  899. package/scripts/gds/lib.sh +7 -73
  900. package/scripts/gds/linkify-refs.js +6 -654
  901. package/scripts/gds/lint-infra-exec.js +5 -68
  902. package/scripts/gds/lint-migrations.js +5 -100
  903. package/scripts/gds/lint-workflow-exec.js +5 -61
  904. package/scripts/gds/local-preview-lib.js +6 -128
  905. package/scripts/gds/local-preview.js +6 -81
  906. package/scripts/gds/login.js +5 -358
  907. package/scripts/gds/main-audit.js +5 -623
  908. package/scripts/gds/me.js +6 -96
  909. package/scripts/gds/memory-map.js +5 -174
  910. package/scripts/gds/merge-lock.js +6 -70
  911. package/scripts/gds/migration-namespace.js +5 -311
  912. package/scripts/gds/mirror-lineage-check.js +5 -341
  913. package/scripts/gds/mirror-redact.js +5 -348
  914. package/scripts/gds/module-artifact.js +6 -289
  915. package/scripts/gds/module-assess-docs.js +6 -237
  916. package/scripts/gds/module-assess-installs.js +6 -227
  917. package/scripts/gds/module-assess-score.js +6 -110
  918. package/scripts/gds/module-assess-security.js +6 -251
  919. package/scripts/gds/module-assess-tests.js +6 -277
  920. package/scripts/gds/module-assess-version.js +6 -91
  921. package/scripts/gds/module-error-report.js +5 -146
  922. package/scripts/gds/module-test-runner.js +6 -413
  923. package/scripts/gds/module.js +5 -1374
  924. package/scripts/gds/move-escalation.js +5 -140
  925. package/scripts/gds/newcomer-floor.js +6 -420
  926. package/scripts/gds/newcomer-floor.test.js +6 -234
  927. package/scripts/gds/next-number.js +6 -162
  928. package/scripts/gds/oauth-secret.js +5 -200
  929. package/scripts/gds/onboard.js +5 -265
  930. package/scripts/gds/onboarding-analyze.js +6 -225
  931. package/scripts/gds/onboarding-config.js +6 -179
  932. package/scripts/gds/onboarding-ship.js +6 -91
  933. package/scripts/gds/pack-env-prefix.js +5 -72
  934. package/scripts/gds/package-core.js +5 -1102
  935. package/scripts/gds/page-inventory.js +5 -346
  936. package/scripts/gds/page-reader.js +5 -720
  937. package/scripts/gds/paste-token.js +6 -211
  938. package/scripts/gds/plain-cards.js +5 -350
  939. package/scripts/gds/portability-smoke-art.sh +7 -84
  940. package/scripts/gds/portability-smoke-memory.sh +7 -175
  941. package/scripts/gds/preflight.js +5 -212
  942. package/scripts/gds/probe-cache.js +5 -244
  943. package/scripts/gds/prove-strict-versioning.js +6 -283
  944. package/scripts/gds/provision-auto-upgrade.js +5 -161
  945. package/scripts/gds/provision-byo-host.js +5 -67
  946. package/scripts/gds/provision-capacity.js +5 -78
  947. package/scripts/gds/provision-caps.js +5 -62
  948. package/scripts/gds/provision-config.js +5 -232
  949. package/scripts/gds/provision-core-upgrade.js +5 -1165
  950. package/scripts/gds/provision-disconnect.js +5 -87
  951. package/scripts/gds/provision-github-setup.js +5 -167
  952. package/scripts/gds/provision-net.js +5 -356
  953. package/scripts/gds/provision-pin-key.js +5 -175
  954. package/scripts/gds/provision-pin-replay.js +5 -125
  955. package/scripts/gds/provision-process.js +5 -169
  956. package/scripts/gds/provision-render.js +5 -200
  957. package/scripts/gds/provision-repo-auth.js +5 -163
  958. package/scripts/gds/provision-repo-private.js +5 -97
  959. package/scripts/gds/provision-repo.js +5 -1336
  960. package/scripts/gds/provision-teardown.js +5 -105
  961. package/scripts/gds/provision-units.js +5 -468
  962. package/scripts/gds/provision.js +5 -1477
  963. package/scripts/gds/publish-credential-check.js +6 -65
  964. package/scripts/gds/publish-integration-gate.js +5 -140
  965. package/scripts/gds/publish-manifest.js +5 -437
  966. package/scripts/gds/publish-watch.js +5 -266
  967. package/scripts/gds/pulse.js +6 -335
  968. package/scripts/gds/push-main.js +5 -54
  969. package/scripts/gds/push-path-brief.js +5 -98
  970. package/scripts/gds/read-session-export.js +5 -357
  971. package/scripts/gds/reauth.js +6 -154
  972. package/scripts/gds/recall.js +6 -182
  973. package/scripts/gds/redteam-patrol.js +5 -435
  974. package/scripts/gds/regen-instance-docs.js +5 -45
  975. package/scripts/gds/release-core.js +5 -78
  976. package/scripts/gds/release-notes.js +5 -270
  977. package/scripts/gds/release.js +6 -138
  978. package/scripts/gds/rename-history-check.js +5 -367
  979. package/scripts/gds/rename-ledger-prose.js +5 -480
  980. package/scripts/gds/render-api.js +5 -196
  981. package/scripts/gds/render-check.js +5 -204
  982. package/scripts/gds/render-ideas.js +6 -225
  983. package/scripts/gds/render-payload.js +5 -84
  984. package/scripts/gds/repo-metrics.js +6 -362
  985. package/scripts/gds/review-sheet.js +5 -106
  986. package/scripts/gds/role-pack-guard.js +5 -141
  987. package/scripts/gds/route-shadow-guard.js +5 -173
  988. package/scripts/gds/routine-schedule.js +5 -281
  989. package/scripts/gds/run-routine.js +5 -255
  990. package/scripts/gds/run-unit-tests.js +6 -659
  991. package/scripts/gds/runner-drift.js +5 -149
  992. package/scripts/gds/sandbox-stage.js +6 -458
  993. package/scripts/gds/scope-map-guard.js +5 -299
  994. package/scripts/gds/scope-roster-guard.js +5 -117
  995. package/scripts/gds/seam-wiring-guard.js +5 -274
  996. package/scripts/gds/search-ingest-db.js +6 -287
  997. package/scripts/gds/search-ingest-md.js +6 -268
  998. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  999. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1000. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1001. package/scripts/gds/seed-staging.sh +7 -116
  1002. package/scripts/gds/seed-verify-criteria.js +6 -124
  1003. package/scripts/gds/sequence.js +6 -596
  1004. package/scripts/gds/session-cost.js +6 -429
  1005. package/scripts/gds/session-digest-build.js +6 -293
  1006. package/scripts/gds/session-digest.js +6 -199
  1007. package/scripts/gds/session-eval.js +6 -630
  1008. package/scripts/gds/session-transcript-build.js +6 -155
  1009. package/scripts/gds/session-transcript-upload.js +6 -29
  1010. package/scripts/gds/session.js +6 -403
  1011. package/scripts/gds/setup.js +6 -645
  1012. package/scripts/gds/ship-check.js +5 -85
  1013. package/scripts/gds/ship-deploy-target.js +5 -392
  1014. package/scripts/gds/ship-escalation.js +5 -166
  1015. package/scripts/gds/ship-finish.js +5 -419
  1016. package/scripts/gds/ship-flow.js +5 -1216
  1017. package/scripts/gds/ship-git.js +5 -99
  1018. package/scripts/gds/ship-grade-steps.js +5 -546
  1019. package/scripts/gds/ship-grade.js +5 -425
  1020. package/scripts/gds/ship-honesty.js +5 -312
  1021. package/scripts/gds/ship-io.js +5 -138
  1022. package/scripts/gds/ship-land.js +5 -1129
  1023. package/scripts/gds/ship-memory-sync.js +5 -248
  1024. package/scripts/gds/ship-merge-gate.js +5 -224
  1025. package/scripts/gds/ship-merge.js +5 -465
  1026. package/scripts/gds/ship-mode-ask.js +5 -137
  1027. package/scripts/gds/ship-mode-manual.js +5 -53
  1028. package/scripts/gds/ship-preflight-steps.js +5 -398
  1029. package/scripts/gds/ship-regen.js +5 -313
  1030. package/scripts/gds/ship-resume.js +5 -200
  1031. package/scripts/gds/ship-session-upload.js +5 -312
  1032. package/scripts/gds/ship-state.js +5 -109
  1033. package/scripts/gds/ship-surprise.js +5 -83
  1034. package/scripts/gds/ship-visual.js +5 -74
  1035. package/scripts/gds/ship.js +5 -380
  1036. package/scripts/gds/shipping-mode.js +5 -69
  1037. package/scripts/gds/skill-lint.js +5 -248
  1038. package/scripts/gds/skill-preflight.js +5 -359
  1039. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1040. package/scripts/gds/smoke-batch-release.sh +7 -315
  1041. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1042. package/scripts/gds/smoke-dependencies.sh +7 -142
  1043. package/scripts/gds/smoke-gds.js +6 -255
  1044. package/scripts/gds/smoke-write.sh +7 -274
  1045. package/scripts/gds/source-text-test-scan.js +7 -0
  1046. package/scripts/gds/spark.js +6 -293
  1047. package/scripts/gds/stale-worktrees.js +5 -210
  1048. package/scripts/gds/start-goals.js +5 -101
  1049. package/scripts/gds/start.js +6 -1089
  1050. package/scripts/gds/status.js +6 -544
  1051. package/scripts/gds/strand-watch.js +5 -313
  1052. package/scripts/gds/stranded-rows.js +5 -198
  1053. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1054. package/scripts/gds/surface.js +5 -100
  1055. package/scripts/gds/task.js +6 -272
  1056. package/scripts/gds/test-path-guard.js +5 -97
  1057. package/scripts/gds/triage.js +6 -741
  1058. package/scripts/gds/turn-end-sound.js +5 -72
  1059. package/scripts/gds/tweak-halt.js +5 -68
  1060. package/scripts/gds/tweak-renders.js +5 -198
  1061. package/scripts/gds/uat.js +6 -119
  1062. package/scripts/gds/ui-kit-transform.js +5 -41
  1063. package/scripts/gds/update-channel.js +5 -510
  1064. package/scripts/gds/update-sweep.js +5 -827
  1065. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1066. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1067. package/scripts/gds/upgrade-migrate.js +5 -223
  1068. package/scripts/gds/upgrade-operator.js +6 -73
  1069. package/scripts/gds/upgrade-outcome.js +5 -173
  1070. package/scripts/gds/upgrade.js +5 -1497
  1071. package/scripts/gds/validate-design.js +5 -10
  1072. package/scripts/gds/version-close.js +6 -620
  1073. package/scripts/gds/version-literal-guard.js +5 -138
  1074. package/scripts/gds/version-select.js +5 -77
  1075. package/scripts/gds/visual-review-nudge.js +5 -38
  1076. package/scripts/gds/wedge-remedy.js +5 -173
  1077. package/scripts/gds/worktree-claim-guard.js +5 -129
  1078. package/scripts/gds/worktree.js +6 -448
  1079. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1080. package/scripts/hall-preview/server.js +2 -2
  1081. package/scripts/migrate.sh +3 -3
  1082. package/scripts/public-mirror-export.js +3 -3
  1083. package/scripts/security/dep-audit.js +50 -124
  1084. package/scripts/setup-builder.js +7 -7
  1085. package/src/bongos/api-errors.js +1 -0
  1086. package/src/bongos/api-prefix.js +1 -1
  1087. package/src/bongos/auth-github.js +19 -3
  1088. package/src/bongos/auth-idp.js +7 -0
  1089. package/src/bongos/claim-attribution.js +2 -2
  1090. package/src/bongos/core-moves.js +1 -1
  1091. package/src/bongos/core-update.js +3 -3
  1092. package/src/bongos/craft-mode.js +2 -2
  1093. package/src/bongos/db-kernel.js +15 -3
  1094. package/src/bongos/db.js +30 -4
  1095. package/src/bongos/github-repos.js +1 -1
  1096. package/src/bongos/llm-cache.js +1 -1
  1097. package/src/bongos/llm-pricing.js +1 -1
  1098. package/src/bongos/metrics.js +1 -1
  1099. package/src/bongos/middleware/rate-limit.js +2 -2
  1100. package/src/bongos/module-listing.js +93 -1
  1101. package/src/bongos/module-scope-map.js +90 -85
  1102. package/src/bongos/module-store.js +1 -1
  1103. package/src/bongos/module-submissions.js +1 -1
  1104. package/src/bongos/optimizer.js +1 -1
  1105. package/src/bongos/package-registry.js +1 -1
  1106. package/src/bongos/path-match.js +1 -1
  1107. package/src/bongos/permission-path-check.js +3 -3
  1108. package/src/bongos/platform-visibility-gate.js +3 -5
  1109. package/src/bongos/prelaunch-gate.js +7 -6
  1110. package/src/bongos/route-rank-check.js +2 -2
  1111. package/src/bongos/routes/auth.js +15 -2
  1112. package/src/bongos/routes/backup.js +1 -1
  1113. package/src/bongos/routes/builders.js +29 -1
  1114. package/src/bongos/routes/me.js +49 -18
  1115. package/src/bongos/routes/modules.js +29 -9
  1116. package/src/bongos/routes/public.js +3 -72
  1117. package/src/bongos/schema-lag.js +1 -1
  1118. package/src/bongos/sensitive-surfaces.js +1 -1
  1119. package/src/bongos/serve-internal.js +65 -16
  1120. package/src/bongos/software-update.js +2 -2
  1121. package/src/bongos/upgrade-hold.js +3 -3
  1122. package/src/hall-look.js +6 -5
  1123. package/src/module-api.js +3 -3
  1124. package/src/module-loader/catalog.js +1 -1
  1125. package/src/module-loader/error-tally.js +3 -3
  1126. package/src/module-loader/manifest-schema.js +3 -3
  1127. package/src/platform-server.js +10 -0
  1128. package/src/role-responsibilities.js +1 -1
  1129. package/src/stale-timer.js +2 -2
  1130. package/tests/accessibility_replay.mjs +1 -1
  1131. package/tests/activity_rollup_order_db.mjs +1 -1
  1132. package/tests/activity_snapshots_db.mjs +1 -1
  1133. package/tests/adopt_detect.mjs +1 -1
  1134. package/tests/adopt_import.mjs +1 -1
  1135. package/tests/adopt_preflight.mjs +1 -1
  1136. package/tests/adr_0089_scope.mjs +10 -7
  1137. package/tests/adr_0162_citation.mjs +1 -1
  1138. package/tests/adr_0162_gate_citation.mjs +1 -1
  1139. package/tests/agent_invoke.mjs +1 -1
  1140. package/tests/agent_invoke_live.mjs +3 -3
  1141. package/tests/agents_cron_trigger.mjs +2 -2
  1142. package/tests/agents_roster.mjs +1 -1
  1143. package/tests/agents_sync.mjs +4 -4
  1144. package/tests/allow_rule_guard.mjs +20 -20
  1145. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1146. package/tests/api_alias_exceptions.mjs +7 -6
  1147. package/tests/api_artifacts.mjs +214 -0
  1148. package/tests/api_cli_flags.mjs +3 -3
  1149. package/tests/api_client.mjs +56 -54
  1150. package/tests/api_docs.mjs +30 -9
  1151. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1152. package/tests/api_msys_path_repair.mjs +2 -2
  1153. package/tests/architect.mjs +1 -1
  1154. package/tests/art_stage.mjs +2 -2
  1155. package/tests/artifact_audit.mjs +2 -2
  1156. package/tests/atlas.mjs +1 -1
  1157. package/tests/audit_deps.mjs +1 -1
  1158. package/tests/audit_gate.mjs +1 -1
  1159. package/tests/auth_flow_slice1.mjs +3 -3
  1160. package/tests/auth_inactive_builder.mjs +43 -5
  1161. package/tests/auth_session_expiry_db.mjs +16 -4
  1162. package/tests/auth_session_ttl.mjs +23 -0
  1163. package/tests/authorship_audit.mjs +2 -2
  1164. package/tests/autobongos_cadence.mjs +1 -1
  1165. package/tests/autobongos_fence.mjs +1 -1
  1166. package/tests/autobongos_grade_cap.mjs +2 -2
  1167. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1168. package/tests/autobongos_host_access.mjs +3 -3
  1169. package/tests/autobongos_loop.mjs +17 -17
  1170. package/tests/autobongos_service_ps1.mjs +3 -3
  1171. package/tests/autobongos_tweak_lane.mjs +2 -2
  1172. package/tests/autobongos_verify.mjs +2 -2
  1173. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1174. package/tests/autonomy_config_idle.mjs +1 -1
  1175. package/tests/autonomy_daily_checks.mjs +201 -0
  1176. package/tests/autonomy_digest.mjs +1 -1
  1177. package/tests/autonomy_gate.mjs +1 -1
  1178. package/tests/autonomy_gauge.mjs +2 -2
  1179. package/tests/autonomy_runner_identity.mjs +1 -1
  1180. package/tests/backfill_sessions.mjs +8 -8
  1181. package/tests/backfill_subagent_rewards.mjs +1 -1
  1182. package/tests/backfill_task_rewards.mjs +2 -2
  1183. package/tests/backlog_review.mjs +3 -3
  1184. package/tests/baseline_staleness.mjs +2 -2
  1185. package/tests/bfg.mjs +11 -5
  1186. package/tests/bfg_write.mjs +20 -11
  1187. package/tests/blockers_hall.mjs +14 -4
  1188. package/tests/blockers_page_ui.mjs +56 -12
  1189. package/tests/bongos_dispatch.mjs +5 -5
  1190. package/tests/bongos_login.mjs +2 -2
  1191. package/tests/bug_attachment_audit.mjs +1 -1
  1192. package/tests/bug_attachment_recover.mjs +2 -2
  1193. package/tests/bug_triage.mjs +3 -3
  1194. package/tests/build_info.mjs +1 -1
  1195. package/tests/builder_tester_tag.mjs +184 -0
  1196. package/tests/bump_version.mjs +3 -3
  1197. package/tests/canonical_profile_url.mjs +1 -1
  1198. package/tests/capture_error_format.mjs +1 -1
  1199. package/tests/capture_goal_routing.mjs +2 -2
  1200. package/tests/category_advisory_guard.mjs +3 -3
  1201. package/tests/claim_error_surface.mjs +2 -2
  1202. package/tests/claim_from_task_and_home.mjs +1 -1
  1203. package/tests/claim_gate_open_blocker.mjs +7 -4
  1204. package/tests/claim_gate_rebase.mjs +12 -8
  1205. package/tests/claim_recall.mjs +4 -4
  1206. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1207. package/tests/claude_materialize.mjs +68 -68
  1208. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1209. package/tests/cli_allowlist_permissions.mjs +11 -11
  1210. package/tests/cli_dispatcher.mjs +2 -2
  1211. package/tests/cli_err_code.mjs +6 -6
  1212. package/tests/cli_exit_no_abort.mjs +7 -7
  1213. package/tests/cli_lib_formatters.mjs +2 -2
  1214. package/tests/cli_sessions.mjs +5 -5
  1215. package/tests/cli_surface.mjs +15 -15
  1216. package/tests/cli_token_reissue.mjs +2 -2
  1217. package/tests/client_baseurl_guard.mjs +1 -1
  1218. package/tests/client_bundle_route.mjs +35 -4
  1219. package/tests/cloud_bongos_pack.mjs +1 -1
  1220. package/tests/community_leaderboard_db.mjs +1 -1
  1221. package/tests/conductor.mjs +18 -18
  1222. package/tests/conflict_resolve.mjs +14 -16
  1223. package/tests/consumer_layout_boot.mjs +12 -12
  1224. package/tests/context_pack.mjs +6 -6
  1225. package/tests/control_manifest.mjs +4 -4
  1226. package/tests/copy_desk_page_reads.mjs +1 -1
  1227. package/tests/copy_desk_page_release.mjs +192 -0
  1228. package/tests/copy_inventory.mjs +2 -2
  1229. package/tests/core_auto_upgrade.mjs +1 -1
  1230. package/tests/core_move_notice.mjs +2 -2
  1231. package/tests/core_origin_follow.mjs +7 -7
  1232. package/tests/core_pin_sync.mjs +3 -3
  1233. package/tests/core_upgrade_door.mjs +2 -2
  1234. package/tests/core_upgrade_owner_door.mjs +34 -1
  1235. package/tests/core_upgrade_runner.mjs +19 -19
  1236. package/tests/credential_presence.mjs +2 -2
  1237. package/tests/credit_grant.mjs +3 -3
  1238. package/tests/credit_log_single_writer.mjs +5 -5
  1239. package/tests/criterion_ref_status.mjs +2 -2
  1240. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1241. package/tests/cutover_codemod.mjs +2 -4
  1242. package/tests/db_backup_nightly.mjs +1 -1
  1243. package/tests/db_backup_offsite.mjs +1 -1
  1244. package/tests/db_ownership_handover.mjs +2 -2
  1245. package/tests/dead_deps.mjs +3 -3
  1246. package/tests/dependency_advisory.mjs +1 -1
  1247. package/tests/deploy_audit_gate.mjs +4 -4
  1248. package/tests/deploy_divergence_line.mjs +36 -16
  1249. package/tests/deploy_page_projects.mjs +35 -4
  1250. package/tests/dev_lib.mjs +2 -2
  1251. package/tests/dev_windows.mjs +2 -2
  1252. package/tests/diagram_facts_offset.mjs +1 -1
  1253. package/tests/diagram_repo_slug.mjs +1 -1
  1254. package/tests/diff_derived_signals.mjs +2 -2
  1255. package/tests/dns_preflight.mjs +2 -2
  1256. package/tests/do_api.mjs +3 -3
  1257. package/tests/doc_cli_guard.mjs +28 -28
  1258. package/tests/doc_comment_coverage.mjs +1 -1
  1259. package/tests/doc_control_claims.mjs +11 -11
  1260. package/tests/docs_entropy.mjs +2 -2
  1261. package/tests/docs_openapi_route.mjs +8 -6
  1262. package/tests/doctor_hooks.mjs +1 -1
  1263. package/tests/edit_hints.mjs +3 -2
  1264. package/tests/effective_visibility_predicate.mjs +1 -19
  1265. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1266. package/tests/exec_path_guard.mjs +4 -4
  1267. package/tests/executed_closure.mjs +18 -12
  1268. package/tests/file_map.mjs +1 -1
  1269. package/tests/find_untested.mjs +13 -13
  1270. package/tests/first_admin_bootstrap.mjs +1 -1
  1271. package/tests/fitness.mjs +16 -16
  1272. package/tests/fitness_gds_ratchet.mjs +2 -2
  1273. package/tests/fitness_installed_core.mjs +3 -3
  1274. package/tests/fitness_no_raw_nul.mjs +1 -1
  1275. package/tests/fitness_ratchets.mjs +3 -3
  1276. package/tests/fitness_scope_roster.mjs +2 -2
  1277. package/tests/fitness_two_root.mjs +8 -8
  1278. package/tests/fixtures/accessibility-replay.json +5 -5
  1279. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1280. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1281. package/tests/fixtures/page-ledger.mjs +22 -0
  1282. package/tests/fixtures/session-506-digest.json +5 -5
  1283. package/tests/gate_approvals.mjs +50 -0
  1284. package/tests/gate_review.mjs +8 -8
  1285. package/tests/gating_review_retired.mjs +2 -2
  1286. package/tests/gen_freshness.mjs +3 -3
  1287. package/tests/git_guard.mjs +3 -3
  1288. package/tests/git_merge_regen.mjs +41 -65
  1289. package/tests/github_one_trip.mjs +4 -4
  1290. package/tests/github_pick_up.mjs +2 -2
  1291. package/tests/github_push_merge_driver.mjs +1 -1
  1292. package/tests/go_live.mjs +3 -2
  1293. package/tests/goal_category.mjs +1 -1
  1294. package/tests/goal_cli.mjs +2 -2
  1295. package/tests/goal_create_spec_entry.mjs +1 -1
  1296. package/tests/goal_invite_consent.mjs +3 -1
  1297. package/tests/goal_move.mjs +1 -1
  1298. package/tests/goal_working_area.mjs +1 -1
  1299. package/tests/government_agent_asks.mjs +7 -7
  1300. package/tests/government_board_room_copy.mjs +6 -1
  1301. package/tests/government_board_view.mjs +39 -0
  1302. package/tests/government_board_vote_ui.mjs +39 -1
  1303. package/tests/government_config.mjs +2 -2
  1304. package/tests/government_live_proof_shape.mjs +1 -1
  1305. package/tests/government_protected_surfaces.mjs +54 -53
  1306. package/tests/government_require_permission.mjs +9 -1
  1307. package/tests/government_vanilla_boot.mjs +1 -1
  1308. package/tests/government_vocabulary.mjs +2 -2
  1309. package/tests/government_walk.mjs +2 -2
  1310. package/tests/grade_body_limit.mjs +6 -4
  1311. package/tests/grade_correlation_audit.mjs +3 -3
  1312. package/tests/grade_diff_hash.mjs +1 -1
  1313. package/tests/grade_engine_replay.mjs +2 -2
  1314. package/tests/grade_server_authoritative.mjs +1 -1
  1315. package/tests/grade_unavailable_display.mjs +1 -1
  1316. package/tests/grader.mjs +8 -24
  1317. package/tests/grader_generated_provenance.mjs +14 -14
  1318. package/tests/grader_no_artifact.mjs +1 -1
  1319. package/tests/grader_prompt_fencing.mjs +1 -1
  1320. package/tests/grader_quality_window_overflow.mjs +1 -1
  1321. package/tests/grader_reader_lens.mjs +3 -3
  1322. package/tests/grader_regrade_delta.mjs +1 -1
  1323. package/tests/grader_unbacked_score.mjs +2 -2
  1324. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1325. package/tests/hall_asset_cache.mjs +127 -0
  1326. package/tests/hall_audit.mjs +63 -0
  1327. package/tests/hall_board_world.mjs +20 -0
  1328. package/tests/hall_city_card_words.mjs +61 -0
  1329. package/tests/hall_client_request_shape.mjs +5 -1
  1330. package/tests/hall_home_ships_bounded.mjs +160 -0
  1331. package/tests/hall_landing_boot.mjs +15 -2
  1332. package/tests/hall_nav.mjs +33 -0
  1333. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1334. package/tests/hall_oversight_world.mjs +44 -4
  1335. package/tests/hall_palette.mjs +12 -9
  1336. package/tests/hall_preview_security.mjs +1 -1
  1337. package/tests/hall_profile_world.mjs +17 -0
  1338. package/tests/hall_reading_world.mjs +16 -1
  1339. package/tests/hall_roster_world.mjs +2 -1
  1340. package/tests/hall_studio_world.mjs +4 -1
  1341. package/tests/hall_work_history_id.mjs +39 -0
  1342. package/tests/held_tweak_reporting.mjs +4 -4
  1343. package/tests/helpers.mjs +3 -3
  1344. package/tests/home_bounded_reads.mjs +1 -1
  1345. package/tests/home_isolation_guard.mjs +1 -1
  1346. package/tests/hook_core_resolve.mjs +7 -7
  1347. package/tests/hook_user_agents.mjs +1 -1
  1348. package/tests/hooks_drain.mjs +2 -2
  1349. package/tests/host_topology_skips.mjs +1 -1
  1350. package/tests/howto_guide.mjs +1 -1
  1351. package/tests/howto_moments.mjs +3 -3
  1352. package/tests/hub_account_page.mjs +1 -1
  1353. package/tests/idea_capture_grades.mjs +2 -2
  1354. package/tests/idea_develop_spark.mjs +1 -1
  1355. package/tests/idea_filed_via.mjs +2 -2
  1356. package/tests/idea_ideate_full.mjs +1 -1
  1357. package/tests/idea_spark_mark.mjs +1 -1
  1358. package/tests/idea_spark_queue.mjs +1 -1
  1359. package/tests/idea_triage.mjs +1 -1
  1360. package/tests/idea_triage_grade.mjs +3 -3
  1361. package/tests/idea_vote_permission.mjs +113 -0
  1362. package/tests/idea_votes_fold_db.mjs +123 -0
  1363. package/tests/infra_exec_paths.mjs +12 -12
  1364. package/tests/init.mjs +2 -2
  1365. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1366. package/tests/instance_feedback.mjs +9 -9
  1367. package/tests/instance_mismatch_guard.mjs +2 -2
  1368. package/tests/integration_parked_ratchet.mjs +24 -2
  1369. package/tests/intent_retry.mjs +1 -1
  1370. package/tests/interaction_posture.mjs +3 -3
  1371. package/tests/invite_expiry_db.mjs +1 -1
  1372. package/tests/joinability_invite_only.mjs +1 -1
  1373. package/tests/karma_vote_lists.mjs +270 -0
  1374. package/tests/key-card.mjs +2 -2
  1375. package/tests/key-status.mjs +2 -2
  1376. package/tests/knip_ratchet_ambient.mjs +2 -2
  1377. package/tests/known_failing_ratchet.mjs +1 -1
  1378. package/tests/land_watch.mjs +2 -2
  1379. package/tests/landing_legal_pages.mjs +1 -1
  1380. package/tests/landing_page.mjs +2 -2
  1381. package/tests/leaderboard_roles.mjs +4 -1
  1382. package/tests/leak_scan_allowlist.mjs +8 -8
  1383. package/tests/leak_scan_fail_closed.mjs +1 -1
  1384. package/tests/lib_sh_resolution.mjs +9 -9
  1385. package/tests/lifecycle-card.mjs +7 -7
  1386. package/tests/linkify_check.mjs +2 -2
  1387. package/tests/linkify_refs.mjs +1 -1
  1388. package/tests/llm-cache-route.mjs +1 -1
  1389. package/tests/local_preview.mjs +2 -2
  1390. package/tests/main_audit.mjs +3 -3
  1391. package/tests/main_audit_attestation.mjs +1 -1
  1392. package/tests/main_audit_db_roster.mjs +2 -2
  1393. package/tests/main_worktree_busy_reason.mjs +3 -3
  1394. package/tests/markdown_line_endings.mjs +2 -2
  1395. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1396. package/tests/membership_kind_lockstep.mjs +1 -1
  1397. package/tests/memory_isolation.mjs +16 -8
  1398. package/tests/memory_map.mjs +2 -2
  1399. package/tests/memory_pull.mjs +33 -25
  1400. package/tests/merge_driver_register.mjs +3 -3
  1401. package/tests/migration_allocation.mjs +2 -2
  1402. package/tests/migration_namespace.mjs +1 -1
  1403. package/tests/migrations_forward_safe.mjs +1 -1
  1404. package/tests/mingle.mjs +1 -1
  1405. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1406. package/tests/mirror_lineage_proof.mjs +2 -2
  1407. package/tests/mirror_redact.mjs +4 -4
  1408. package/tests/missing_dep_classify.mjs +3 -3
  1409. package/tests/module-scope-map.mjs +22 -22
  1410. package/tests/module_api_lazy.mjs +1 -1
  1411. package/tests/module_assess_docs.mjs +2 -2
  1412. package/tests/module_assess_installs.mjs +3 -3
  1413. package/tests/module_assess_price_parity.mjs +5 -5
  1414. package/tests/module_assess_score.mjs +5 -5
  1415. package/tests/module_assess_security.mjs +4 -4
  1416. package/tests/module_assess_tests.mjs +3 -3
  1417. package/tests/module_assessments_migration.mjs +1 -1
  1418. package/tests/module_catalog.mjs +2 -2
  1419. package/tests/module_cli.mjs +3 -3
  1420. package/tests/module_entitlements.mjs +1 -1
  1421. package/tests/module_error_counts.mjs +1 -1
  1422. package/tests/module_install.mjs +4 -4
  1423. package/tests/module_loader.mjs +3 -1
  1424. package/tests/module_owned_tests.mjs +1 -1
  1425. package/tests/module_release_channels.mjs +1 -1
  1426. package/tests/module_store_howto.mjs +3 -3
  1427. package/tests/module_store_listing.mjs +139 -2
  1428. package/tests/module_store_publish.mjs +4 -4
  1429. package/tests/module_store_publish_route.mjs +1 -1
  1430. package/tests/module_store_reassess.mjs +1 -1
  1431. package/tests/module_store_registry_migration.mjs +1 -1
  1432. package/tests/module_test_runner.mjs +3 -3
  1433. package/tests/module_update.mjs +4 -4
  1434. package/tests/module_upgrade_updates.mjs +1 -1
  1435. package/tests/move_escalation.mjs +2 -2
  1436. package/tests/nav_permission_atoms.mjs +3 -2
  1437. package/tests/needs_rebase.mjs +7 -3
  1438. package/tests/newcomer_floor.mjs +1 -1
  1439. package/tests/next_number.mjs +1 -1
  1440. package/tests/no_artifact_escalation.mjs +3 -3
  1441. package/tests/npm_release_where.mjs +1 -1
  1442. package/tests/oauth_secret.mjs +2 -2
  1443. package/tests/onboard.mjs +6 -6
  1444. package/tests/onboarding_gate.mjs +2 -2
  1445. package/tests/opt_in_skill_modules.mjs +3 -3
  1446. package/tests/own_scope_guard.mjs +1 -1
  1447. package/tests/own_session_revoke.mjs +4 -1
  1448. package/tests/package_core.mjs +10 -11
  1449. package/tests/page_inventory.mjs +5 -5
  1450. package/tests/page_reader.mjs +7 -7
  1451. package/tests/page_tweak_hold.mjs +6 -6
  1452. package/tests/parallel-load.mjs +1 -1
  1453. package/tests/paste_token_api_base.mjs +1 -1
  1454. package/tests/paste_token_session_store.mjs +2 -2
  1455. package/tests/pending_invite_purge_db.mjs +1 -1
  1456. package/tests/permission_path.mjs +1 -1
  1457. package/tests/pin_replay.mjs +1 -1
  1458. package/tests/pin_write_key.mjs +7 -7
  1459. package/tests/plain_cards.mjs +15 -15
  1460. package/tests/pr_assign.mjs +1 -1
  1461. package/tests/pre_push_hook.mjs +3 -3
  1462. package/tests/preflight_checks.mjs +2 -2
  1463. package/tests/prelaunch_gate.mjs +1 -1
  1464. package/tests/privacy_matrix.mjs +1 -1
  1465. package/tests/probe_cache.mjs +6 -6
  1466. package/tests/profile_connections_ui.mjs +4 -3
  1467. package/tests/profile_fields.mjs +11 -1
  1468. package/tests/profile_privacy_owner_view.mjs +1 -1
  1469. package/tests/profile_role_headline.mjs +10 -9
  1470. package/tests/project_admin_console_model.mjs +1 -1
  1471. package/tests/projects_hub.mjs +1 -1
  1472. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1473. package/tests/promote_goal_id.mjs +6 -6
  1474. package/tests/promotion_sweep.mjs +1 -1
  1475. package/tests/provision.mjs +24 -24
  1476. package/tests/provision_account_identity.mjs +2 -2
  1477. package/tests/provision_byo_host.mjs +1 -1
  1478. package/tests/provision_caddy_wiring.mjs +2 -2
  1479. package/tests/provision_disconnect.mjs +2 -2
  1480. package/tests/provision_dns_first.mjs +1 -1
  1481. package/tests/provision_render.mjs +9 -9
  1482. package/tests/provision_repo_private.mjs +3 -3
  1483. package/tests/provision_resource_caps.mjs +5 -5
  1484. package/tests/provision_restart.mjs +3 -3
  1485. package/tests/provision_settings_apply.mjs +7 -7
  1486. package/tests/provision_teardown_address.mjs +2 -2
  1487. package/tests/provisioning_capacity.mjs +5 -5
  1488. package/tests/provisioning_credential_preflight.mjs +1 -1
  1489. package/tests/provisioning_disconnect.mjs +1 -1
  1490. package/tests/provisioning_error_note_scope.mjs +4 -4
  1491. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1492. package/tests/provisioning_planet_physics.mjs +16 -0
  1493. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1494. package/tests/provisioning_settings_env.mjs +1 -1
  1495. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1496. package/tests/public_mirror_export.mjs +1 -1
  1497. package/tests/publish_integration_gate.mjs +2 -2
  1498. package/tests/publish_manifest.mjs +6 -6
  1499. package/tests/publish_watch.mjs +1 -1
  1500. package/tests/push_path_brief.mjs +2 -2
  1501. package/tests/raise.mjs +248 -0
  1502. package/tests/rank_roles_audit.mjs +1 -1
  1503. package/tests/rank_tier_single_source.mjs +2 -2
  1504. package/tests/rate_limit_public.mjs +1 -1
  1505. package/tests/read_default_meter.mjs +2 -2
  1506. package/tests/read_session_export.mjs +1 -1
  1507. package/tests/rebase_gate_set_aside.mjs +1 -1
  1508. package/tests/recall_cli.mjs +1 -1
  1509. package/tests/recall_corpus_health.mjs +3 -2
  1510. package/tests/recall_hints.mjs +1 -1
  1511. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1512. package/tests/redteam_patrol.mjs +2 -2
  1513. package/tests/regrade_actual_minutes.mjs +2 -2
  1514. package/tests/regrade_eligibility.mjs +2 -2
  1515. package/tests/release_core.mjs +2 -2
  1516. package/tests/release_notes.mjs +4 -4
  1517. package/tests/rename_history_restraint.mjs +3 -3
  1518. package/tests/rename_ledger_prose.mjs +6 -6
  1519. package/tests/render_api.mjs +1 -1
  1520. package/tests/render_check.mjs +4 -4
  1521. package/tests/render_deploy.mjs +1 -1
  1522. package/tests/repo_info_binding.mjs +1 -1
  1523. package/tests/repo_map.mjs +5 -5
  1524. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1525. package/tests/reward_mode_surfacing.mjs +1 -1
  1526. package/tests/role_responsibilities.mjs +1 -1
  1527. package/tests/route_permission_check.mjs +1 -1
  1528. package/tests/route_shadow_guard.mjs +1 -1
  1529. package/tests/route_validation.mjs +1 -1
  1530. package/tests/routine_capture_kind.mjs +24 -13
  1531. package/tests/routine_schedule.mjs +51 -9
  1532. package/tests/run_routine.mjs +5 -5
  1533. package/tests/run_routine_two_root.mjs +5 -5
  1534. package/tests/runner_drift.mjs +17 -17
  1535. package/tests/sandbox_stage.mjs +5 -5
  1536. package/tests/scope_map_guard.mjs +7 -7
  1537. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1538. package/tests/scripts_gds_forwarders.mjs +224 -0
  1539. package/tests/scrubber_corpus.mjs +2 -2
  1540. package/tests/seam_wiring_guard.mjs +1 -1
  1541. package/tests/search_ingest.mjs +2 -2
  1542. package/tests/search_ingest_db.mjs +1 -1
  1543. package/tests/search_ingest_nul.mjs +6 -6
  1544. package/tests/seed_verify_criteria.mjs +3 -3
  1545. package/tests/sequence.mjs +3 -3
  1546. package/tests/served_paths_shipped.mjs +3 -3
  1547. package/tests/session_506_regression.mjs +1 -1
  1548. package/tests/session_accessibility.mjs +1 -1
  1549. package/tests/session_caps.mjs +1 -1
  1550. package/tests/session_cost.mjs +1 -1
  1551. package/tests/session_digest.mjs +2 -2
  1552. package/tests/session_eval.mjs +6 -6
  1553. package/tests/session_index.mjs +1 -1
  1554. package/tests/session_records.mjs +4 -4
  1555. package/tests/session_rename_fallback.mjs +2 -2
  1556. package/tests/session_reward_on_land.mjs +7 -149
  1557. package/tests/session_reward_on_land_db.mjs +191 -0
  1558. package/tests/session_reward_reconcile.mjs +6 -88
  1559. package/tests/session_reward_reconcile_db.mjs +132 -0
  1560. package/tests/session_transcript.mjs +1 -1
  1561. package/tests/sessions_kit_pager.mjs +2 -1
  1562. package/tests/setup_device_flow_fallback.mjs +2 -2
  1563. package/tests/setup_smoke.mjs +12 -5
  1564. package/tests/setup_status_facts.mjs +54 -12
  1565. package/tests/ship_autolinkify.mjs +2 -2
  1566. package/tests/ship_automerge_injection.mjs +1 -1
  1567. package/tests/ship_base_flag.mjs +1 -1
  1568. package/tests/ship_broadcast_routing.mjs +1 -1
  1569. package/tests/ship_broadcast_server.mjs +2 -2
  1570. package/tests/ship_builder_model.mjs +1 -1
  1571. package/tests/ship_cannot_lie.mjs +9 -9
  1572. package/tests/ship_card.mjs +2 -2
  1573. package/tests/ship_ci_deploy.mjs +7 -7
  1574. package/tests/ship_error_shape.mjs +1 -1
  1575. package/tests/ship_land_ci_not_started.mjs +3 -3
  1576. package/tests/ship_land_conflict.mjs +3 -3
  1577. package/tests/ship_land_proof.mjs +3 -3
  1578. package/tests/ship_land_red_pr.mjs +5 -5
  1579. package/tests/ship_merge_gate.mjs +14 -14
  1580. package/tests/ship_mode.mjs +1 -1
  1581. package/tests/ship_mode_first_ship.mjs +4 -4
  1582. package/tests/ship_mode_hands_off.mjs +8 -8
  1583. package/tests/ship_post_land_verify.mjs +1 -1
  1584. package/tests/ship_preflight.mjs +19 -19
  1585. package/tests/ship_premerge.mjs +1 -1
  1586. package/tests/ship_publish_error.mjs +2 -2
  1587. package/tests/ship_push_diagnosis.mjs +1 -1
  1588. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1589. package/tests/ship_resume.mjs +4 -4
  1590. package/tests/ship_smoke_gate.mjs +1 -1
  1591. package/tests/ship_upload_skip.mjs +1 -1
  1592. package/tests/ship_upstream_deletion.mjs +1 -1
  1593. package/tests/ship_vendored_instance.mjs +8 -8
  1594. package/tests/ship_visual_regrade.mjs +3 -3
  1595. package/tests/ship_zero_commit.mjs +1 -1
  1596. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1597. package/tests/skill_friction_kind.mjs +1 -1
  1598. package/tests/skill_grade_recover.mjs +1 -1
  1599. package/tests/skill_grader_health.mjs +1 -1
  1600. package/tests/skill_lint.mjs +1 -1
  1601. package/tests/skill_menu_ruling.mjs +1 -1
  1602. package/tests/skill_preflight.mjs +7 -7
  1603. package/tests/skip_is_not_pass.mjs +22 -1
  1604. package/tests/smoke_dependencies_witness.mjs +2 -2
  1605. package/tests/smoke_preflight.mjs +1 -1
  1606. package/tests/smoke_target.mjs +2 -2
  1607. package/tests/smoke_write_contract.mjs +2 -2
  1608. package/tests/sound_player.mjs +8 -8
  1609. package/tests/source_text_test_ratchet.mjs +97 -0
  1610. package/tests/speciality_corpus_scope.mjs +1 -1
  1611. package/tests/speciality_session_skills.mjs +1 -1
  1612. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1613. package/tests/stale_timer.mjs +3 -3
  1614. package/tests/stale_worktrees.mjs +1 -1
  1615. package/tests/start_env_guard.mjs +1 -1
  1616. package/tests/start_goal_first.mjs +3 -3
  1617. package/tests/start_inbox_count.mjs +1 -1
  1618. package/tests/start_rebase_warning.mjs +1 -1
  1619. package/tests/status_default_version.mjs +3 -3
  1620. package/tests/status_mirror_sync.mjs +1 -1
  1621. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1622. package/tests/stop_refcheck.mjs +1 -1
  1623. package/tests/strand_watch.mjs +1 -1
  1624. package/tests/stranded_rows.mjs +1 -1
  1625. package/tests/stuck_detector.mjs +14 -14
  1626. package/tests/sweep_app_account.mjs +3 -3
  1627. package/tests/task_cli.mjs +2 -2
  1628. package/tests/task_detail_ui.mjs +11 -1
  1629. package/tests/task_discipline_required.mjs +2 -2
  1630. package/tests/task_list_paging.mjs +1 -1
  1631. package/tests/task_visual_slots.mjs +2 -2
  1632. package/tests/terms_acceptance.mjs +1 -1
  1633. package/tests/terms_grandfather_db.mjs +1 -1
  1634. package/tests/test_path_guard.mjs +1 -1
  1635. package/tests/triage_development.mjs +1 -1
  1636. package/tests/tweak_batch_apply.mjs +2 -2
  1637. package/tests/tweak_land_heal.mjs +3 -3
  1638. package/tests/tweak_unattended.mjs +3 -3
  1639. package/tests/ui_design_skills.mjs +2 -2
  1640. package/tests/unit_report_status.mjs +2 -2
  1641. package/tests/unit_runner_serial.mjs +2 -2
  1642. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1643. package/tests/update_channel.mjs +2 -2
  1644. package/tests/update_channel_db.mjs +4 -4
  1645. package/tests/update_subscription_engine.mjs +26 -26
  1646. package/tests/update_sweep_home.mjs +14 -14
  1647. package/tests/upgrade.mjs +11 -11
  1648. package/tests/upgrade_artist_gate.mjs +4 -4
  1649. package/tests/upgrade_commit_identity.mjs +2 -2
  1650. package/tests/upgrade_migrate.mjs +7 -7
  1651. package/tests/upgrade_operator.mjs +2 -2
  1652. package/tests/upgrade_outcome.mjs +2 -2
  1653. package/tests/upgrade_persist_pin.mjs +5 -5
  1654. package/tests/upkeep_home.mjs +1 -1
  1655. package/tests/version_close.mjs +2 -2
  1656. package/tests/version_close_cli.mjs +2 -2
  1657. package/tests/version_close_route.mjs +1 -1
  1658. package/tests/version_literals.mjs +23 -23
  1659. package/tests/visual_review.mjs +5 -5
  1660. package/tests/wedge_remedy.mjs +5 -5
  1661. package/tests/welcome_boot.mjs +116 -0
  1662. package/tests/welcome_boot_browser.mjs +271 -0
  1663. package/tests/wizard_born_first_board.mjs +3 -3
  1664. package/tests/wizard_demo.mjs +1 -1
  1665. package/tests/wizard_one_page.mjs +4 -3
  1666. package/tests/wizard_physics.mjs +3 -1
  1667. package/tests/wizard_physics_more.mjs +42 -3
  1668. package/tests/work_title_wrap.mjs +1 -1
  1669. package/tests/workflow_exec_paths.mjs +6 -6
  1670. package/tests/worktree_claim_guard.mjs +1 -1
  1671. package/tests/worktree_helper.mjs +2 -2
  1672. package/tests/write_validation_gaps.mjs +3 -3
  1673. package/scripts/gds/api.sh +0 -6
  1674. package/scripts/gds/artifact-staleness.js +0 -267
  1675. package/scripts/gds/audit-exports.js +0 -128
  1676. package/scripts/gds/classify-discipline.js +0 -153
  1677. package/scripts/gds/codemod-rename-src-gds.js +0 -145
  1678. package/scripts/gds/coreB-carve-proof.sh +0 -725
  1679. package/scripts/gds/goal-names.js +0 -102
  1680. package/scripts/gds/rename-goals.js +0 -109
  1681. package/scripts/gds/resolve-skill-model.js +0 -57
  1682. package/scripts/gds/security-baseline-check.sh +0 -180
  1683. package/scripts/gds/seed-adopt-tasks.js +0 -75
  1684. package/scripts/gds/seed-api-contract-goal-tasks.js +0 -141
  1685. package/scripts/gds/seed-board-room-tasks.js +0 -196
  1686. package/scripts/gds/seed-bongos-app-tasks.js +0 -294
  1687. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +0 -81
  1688. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +0 -100
  1689. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +0 -307
  1690. package/scripts/gds/seed-bongos-module-system-tasks.js +0 -346
  1691. package/scripts/gds/seed-bongos-tasks.js +0 -214
  1692. package/scripts/gds/seed-bongos-v1-seo-tasks.js +0 -104
  1693. package/scripts/gds/seed-bv1-community-tasks.js +0 -131
  1694. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +0 -133
  1695. package/scripts/gds/seed-bv1-profile-page-tasks.js +0 -161
  1696. package/scripts/gds/seed-bv1-r01-delta-tasks.js +0 -154
  1697. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +0 -277
  1698. package/scripts/gds/seed-gds-v4-tasks.js +0 -624
  1699. package/scripts/gds/seed-governance-tasks.js +0 -340
  1700. package/scripts/gds/seed-medusa-tasks.js +0 -440
  1701. package/scripts/gds/seed-module-upstreaming.js +0 -219
  1702. package/scripts/gds/seed-productization-tasks.js +0 -235
  1703. package/scripts/gds/seed-project-admin-console-tasks.js +0 -88
  1704. package/scripts/gds/seed-provisioning-tasks.js +0 -83
  1705. package/scripts/gds/seed-strict-versioning-tasks.js +0 -275
  1706. package/scripts/gds/seed-v2-world-tasks.js +0 -283
  1707. package/scripts/gds/spike-task-map.js +0 -899
  1708. package/scripts/migrate_cost_ledger.sh +0 -178
  1709. package/scripts/status-probe.mjs +0 -213
  1710. package/src/bongos/uptime-poller.js +0 -93
  1711. package/tests/artifact_staleness.mjs +0 -207
  1712. package/tests/goal_names.mjs +0 -120
  1713. package/tests/government_fold_bench.mjs +0 -50
  1714. package/tests/spike_task_map.mjs +0 -422
  1715. package/tests/status-probe.mjs +0 -89
  1716. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1717. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1718. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1719. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -0,0 +1,1159 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ //
4
+ // scripts/bongos/init.js — `bongos init`: scaffold a NEW Cloud Bongos instance.
5
+ //
6
+ // GDS-V4 · V4.R65 · task 1204 (ADR 0062 §7). The self-serve replacement for the
7
+ // hand-written 35–83 KB seed-*.js-per-version pattern. It:
8
+ // 1. gathers a spec (interactive interview, or --from <spec.json>),
9
+ // 2. writes the instance config — config/branding.json + config/modules.json
10
+ // (lean OVERRIDES; config/*.neutral.json fills the rest, src/branding.js),
11
+ // 3. seeds the first version + its done-when goal via POST /api/bongos/versions
12
+ // (the primitive added in this same task), then files the starter task and
13
+ // the human-only KICKOFF steps as real, tracked tasks via POST /tasks,
14
+ // 4. points the owner at docs/branding-fill-prompt.md for the LOOK (a locked
15
+ // project rule: an owner brands with their OWN LLM — init never generates
16
+ // branding) and prints the remaining manual steps.
17
+ //
18
+ // It deliberately does NOT try to make launch one command: a fresh instance
19
+ // needs irreducibly-manual owner steps (a GitHub OAuth app, first sign-in).
20
+ // init's value is that it writes what it can AND turns the rest into a claimable,
21
+ // tracked checklist so nothing is silently skipped.
22
+ //
23
+ // Infra arm (ADR 0111 §3, task 1946): when the owner opts into production hosting,
24
+ // the interview's infra answers (hosting shape, bring-your-own domain, credential
25
+ // ref, tier) become a real provisioning REQUEST — a POST to the provisioning
26
+ // module's /provisioning/instances, which enqueues a provision intent the
27
+ // control-plane runner drains — instead of only a manual "production topology"
28
+ // task. OAuth-app creation + first sign-in stay guided/manual (no clean API). If
29
+ // the target instance doesn't have the provisioning module enabled, init falls
30
+ // back to filing the manual task (nothing is silently dropped).
31
+ //
32
+ // Safety: refuses to overwrite an existing config/branding.json unless --force
33
+ // (so running it inside an already-configured instance — e.g. OTB — can't
34
+ // clobber it). Use --dry-run to preview every file + API call without doing any.
35
+ //
36
+ // --adopt (brownfield, ADR 0121): the greenfield body above assumes a blank slate —
37
+ // it refuses where config/branding.json exists, and --force OVERWRITES. `--adopt` is
38
+ // the opposite: it LAYERS Cloud Bongos onto an EXISTING repo (app code, git history,
39
+ // a package.json). It writes the lean config only where absent, adds the pinned
40
+ // @bongos/core dependency to the owner's package.json without touching any other
41
+ // field, and materializes .claude/ ADDITIVELY — for any pre-existing file it
42
+ // MERGES-or-LEAVES-AND-REPORTS, it NEVER overwrites, and it does not reuse the --force
43
+ // path. It deliberately does NOT seed a synthetic "V1 — Prove the loop": capturing the
44
+ // repo's real version/goal + importing its backlog is a later real-state step, and the
45
+ // full conflict pre-flight is a later step too — this file lands the mode skeleton +
46
+ // additive config layering (task 2042). Every other onboarding leg is identical.
47
+ //
48
+ // Usage:
49
+ // bongos init interactive interview (greenfield — a NEW instance)
50
+ // bongos init --adopt LAYER onto an existing repo (brownfield; never clobbers).
51
+ // Runs a conflict PRE-FLIGHT + accept-gate: nothing writes
52
+ // until you confirm (interactive y/N) or pass --accept.
53
+ // bongos init --adopt --accept apply the adopt without the interactive prompt (CI / non-interactive)
54
+ // bongos init --from spec.json non-interactive (CI / the C8 self-build proof)
55
+ // bongos init --dry-run print the plan; write nothing, call nothing
56
+ // bongos init --dir <path> target dir for the config files (default: cwd)
57
+ // bongos init --no-seed write config only; skip the version/task seeding
58
+ // bongos init --force overwrite existing config files (greenfield only; ignored by --adopt)
59
+ // bongos init --vendor-core <tgz> greenfield only: vendor the @bongos/core .tgz + pin
60
+ // package.json to file:vendor/… + generate package-lock.json,
61
+ // so the scaffold is `npm ci`-installable (ADR 0108 gap 1/4).
62
+ // Without it the scaffold pins the caret range, which
63
+ // resolves from the public npm registry (--registry-core).
64
+ // bongos init --registry-core greenfield only: keep the caret pin and generate
65
+ // package-lock.json from the registry. @bongos/core is
66
+ // PUBLIC (task 1003872), so this needs no token, no login
67
+ // and no .npmrc — it resolves from the default registry
68
+ // like any other dependency.
69
+ // Mutually exclusive with --vendor-core (registry vs tarball).
70
+
71
+ const fs = require('node:fs');
72
+ const path = require('node:path');
73
+ const readline = require('node:readline');
74
+ const { apiCall, arg, hasFlag } = require('./cli-lib');
75
+ const { DEFAULT_HIERARCHY } = require('../../src/bongos/hierarchy-config');
76
+ const { resolveCoreRoot, FALLBACK_ENV_PREFIX } = require('../../src/instance-config'); // ADR 0108 §1: where the core package lives
77
+ const { materializeClaude } = require('./claude-materialize'); // ADR 0108 §3 (W3): copy .claude/ into the instance
78
+ const { detectStack, formatStackSummary } = require('./adopt-detect'); // ADR 0121 §Decision 4 (task 2043): inspect an existing repo before layering
79
+ const { resolveBacklogTasks, DEFAULT_MAX: BACKLOG_MAX } = require('./adopt-import'); // ADR 0121 §Decision 3 (task 2044): import an existing backlog
80
+ const { preflightAdopt, formatPreflight } = require('./adopt-preflight'); // ADR 0121 §Decision 5 (task 2045): the accept-gated conflict pre-flight
81
+
82
+ const KNOWN_MODULES = ['game', 'art-pipeline', 'discord'];
83
+
84
+ // The provisioning hosting shapes — a small mirror of modules/provisioning's
85
+ // HOSTING_SHAPES. init deliberately does NOT import the (optional) provisioning
86
+ // module: it stays self-contained and lets the server be the authority on a
87
+ // request (POST /provisioning/instances validates slug/shape, and returns 404 when
88
+ // the module isn't enabled on the target instance — init then falls back to filing
89
+ // the manual production-topology task). ADR 0111 §3.
90
+ // ADR 0323: 'byo-host' is the free front door and the default; 'co-tenant' is RETIRED
91
+ // and the server refuses it outright, so it is absent here DELIBERATELY. Leaving it in
92
+ // would let init write a spec the create route then 403s — a local list that accepts
93
+ // more than the server does is worse than no list, because the refusal arrives a step
94
+ // later with no useful message. Dropping it means `--shape co-tenant` fails here, naming
95
+ // the shapes that work.
96
+ //
97
+ // 'dedicated' left for the same reason, one step further on: ADR 0327 decision 4 deleted
98
+ // the shape outright, so it is not merely refused but unstorable (migration
99
+ // provisioning_027 folded its value into 'cloud-host'). 'standalone' was renamed to
100
+ // 'cloud-host' by the same migration. Both were requestable from here until task 1004182.
101
+ const HOSTING_SHAPES = ['byo-host', 'cloud-host'];
102
+
103
+ // The Cloud Bongos core npm package an instance pins as a dependency (ADR 0108).
104
+ // `bongos init --adopt` LAYERS this onto an existing repo's package.json; `bongos
105
+ // upgrade` later re-pins it to a vendored `file:` tarball. Named so the adopt
106
+ // layering and the upgrade re-pin agree on the dependency name.
107
+ const CORE_PKG = '@bongos/core';
108
+
109
+ const isObj = (v) => v && typeof v === 'object' && !Array.isArray(v);
110
+
111
+ // The version RANGE `--adopt` writes for the core dep: a caret over the running
112
+ // core's CORE_VERSION — the declared intent. The CONCRETE artifact (a registry
113
+ // install, or the vendored `file:` tarball a `bongos upgrade` pins) is resolved by
114
+ // provisioning / upgrade per ADR 0108, not by init. Falls back to a safe floor if
115
+ // module-api can't be resolved (e.g. a partial checkout).
116
+ function coreDepRange() {
117
+ let v;
118
+ try { v = require('../../src/module-api').CORE_VERSION; } catch { v = null; }
119
+ return `^${v || '1.0.0'}`;
120
+ }
121
+
122
+ // The running core's bare version (no caret) — for deriving the vendored tarball name
123
+ // when `--vendor-core`'s tarball is non-canonically named. Fail-soft like coreDepRange().
124
+ function coreVersionSafe() {
125
+ try { return require('../../src/module-api').CORE_VERSION; } catch { return null; }
126
+ }
127
+
128
+ // The npm scripts a STANDALONE greenfield instance runs. They MIRROR how the control
129
+ // plane runs a standalone instance (scripts/bongos/provision.js): `hall` = the systemd
130
+ // ExecStart (`node <core>/src/platform-server.js`), `migrate` = standaloneMigrateCmd
131
+ // (`bash <core>/scripts/migrate.sh`). Keeping them identical means `npm run hall` /
132
+ // `npm run migrate` on the instance behave like production, and `bongos upgrade`'s
133
+ // `npm run migrate` step resolves to the core's migrate.sh (ADR 0108).
134
+ // The hall is deliberately NOT `start` (task 1004484): `npm start` belongs to the
135
+ // project's own app, and a host like Render reads it as "how this app starts" — given the
136
+ // hall there, the deploy has no database and times out. Nothing runs an instance's
137
+ // `npm start`: the box unit and `bongos dev` both start platform-server.js directly.
138
+ const INSTANCE_CORE_PKG_DIR = 'node_modules/@bongos/core';
139
+ const INSTANCE_HALL_SCRIPT = `node ${INSTANCE_CORE_PKG_DIR}/src/platform-server.js`;
140
+ const INSTANCE_MIGRATE_SCRIPT = `bash ${INSTANCE_CORE_PKG_DIR}/scripts/migrate.sh`;
141
+
142
+ // PURE (exported for tests) — build/augment the greenfield instance package.json so a
143
+ // fresh instance is `npm ci`-installable and runnable (ADR 0108 greenfield gap 1/4,
144
+ // task 2053): the @bongos/core dependency (the `file:` tarball pin when a tarball is
145
+ // vendored, else the declared caret range — the CARET RESOLVES NOWHERE on npm, which is
146
+ // exactly why the vendored path pins `file:`) plus the hall/migrate npm scripts a
147
+ // standalone instance runs. Preserves any pre-existing fields + scripts (fills only what
148
+ // is missing); greenfield OWNS the core dep, so it is always (re)set to `coreDep`. Never
149
+ // spawns npm — generating the lockfile is a separate imperative step in main().
150
+ // `moduleDeps` (ADR 0138 / task 2160): the merged external npm deps of the modules this
151
+ // instance ENABLES. @bongos/core ships lean (express+pg, ADR 0108), so a bundled module that
152
+ // needs more (e.g. discord → discord.js) declares it in its module.json `dependencies`, and the
153
+ // consumer's package.json must carry it or boot crashes on the missing module (rehearsal F2).
154
+ // Precedence: module deps FILL gaps, an explicit pre-existing pin WINS over them, @bongos/core
155
+ // is always (re)set. With no moduleDeps this is byte-identical to before.
156
+ function buildInstancePackageJson(existing, { name = 'cloudbongos-instance', coreDep, moduleDeps } = {}) {
157
+ const dep = coreDep || coreDepRange();
158
+ const pkg = isObj(existing) ? { ...existing } : {};
159
+ if (!pkg.name) pkg.name = name;
160
+ if (pkg.private === undefined) pkg.private = true;
161
+ pkg.scripts = { ...(isObj(pkg.scripts) ? pkg.scripts : {}) };
162
+ // A scaffold from before task 1004484 wrote the hall as `start`; move exactly that
163
+ // command (never an owner's own start) to `hall`, unless they already have a `hall`.
164
+ if (pkg.scripts.start === INSTANCE_HALL_SCRIPT && !pkg.scripts.hall) {
165
+ pkg.scripts.hall = pkg.scripts.start;
166
+ delete pkg.scripts.start;
167
+ }
168
+ if (!pkg.scripts.hall) pkg.scripts.hall = INSTANCE_HALL_SCRIPT;
169
+ if (!pkg.scripts.migrate) pkg.scripts.migrate = INSTANCE_MIGRATE_SCRIPT;
170
+ pkg.dependencies = {
171
+ ...(isObj(moduleDeps) ? moduleDeps : {}),
172
+ ...(isObj(pkg.dependencies) ? pkg.dependencies : {}),
173
+ [CORE_PKG]: dep,
174
+ };
175
+ return pkg;
176
+ }
177
+
178
+ // The external npm deps a single module declares in its module.json `dependencies` (ADR 0138).
179
+ // I/O (reads the core-package module manifest); fail-soft → {} when absent/unreadable.
180
+ function moduleDeclaredDeps(moduleKey, { coreRoot = resolveCoreRoot(), fsImpl = fs } = {}) {
181
+ try {
182
+ const mj = JSON.parse(fsImpl.readFileSync(path.join(coreRoot, 'modules', moduleKey, 'module.json'), 'utf8'));
183
+ return isObj(mj.dependencies) ? mj.dependencies : {};
184
+ } catch {
185
+ return {};
186
+ }
187
+ }
188
+
189
+ // Merge the declared deps of every ENABLED module (modulesConfig = { modules: { key: bool } })
190
+ // into one object. PURE — `readDeps(key)` is injected (defaults to moduleDeclaredDeps) so this is
191
+ // testable with no disk. A later-enabled module's range wins on a key collision (rare).
192
+ function enabledModuleDeps(modulesConfig, { readDeps = (k) => moduleDeclaredDeps(k) } = {}) {
193
+ const enabled = isObj(modulesConfig) && isObj(modulesConfig.modules) ? modulesConfig.modules : {};
194
+ const out = {};
195
+ for (const [key, on] of Object.entries(enabled)) {
196
+ if (on === true) Object.assign(out, readDeps(key));
197
+ }
198
+ return out;
199
+ }
200
+
201
+ // ---------------------------------------------------------------------------
202
+ // Pure builders (exported for tests — no I/O, no network)
203
+ // ---------------------------------------------------------------------------
204
+
205
+ // A url-safe slug for a criterion_id derived from a short label.
206
+ function slugify(s, fallback = 'goal') {
207
+ const out = String(s || '')
208
+ .toLowerCase()
209
+ .replace(/[^a-z0-9]+/g, '-')
210
+ .replace(/^-+|-+$/g, '')
211
+ .slice(0, 48);
212
+ return out || fallback;
213
+ }
214
+
215
+ // The DNS/db-safe instance slug a provisioning request carries — derived from an
216
+ // explicit spec.provisioning.slug or the product name, lowercased/dashed, then
217
+ // clamped to the module's 2–40-char rule (the server validates it too). Pure.
218
+ function provisioningSlug(spec) {
219
+ const p = (spec && spec.provisioning) || {};
220
+ const base = p.slug || (spec && spec.identity && spec.identity.productName) || '';
221
+ return slugify(base, 'instance').slice(0, 40).replace(/-+$/, '');
222
+ }
223
+
224
+ // The POST /api/bongos/provisioning/instances body built from the interview's infra
225
+ // answers — or null when the owner didn't opt into provisioning (no spec.provisioning
226
+ // block). THE ADR 0111 §3 ARM: infra answers become a real provisioning REQUEST (a
227
+ // provisioning_intents row the control-plane runner drains) instead of only a manual
228
+ // runbook task. Pure — no I/O; the caller POSTs it. Shape defaults to the cheapest
229
+ // byo-host ($0 to us — the owner supplies the host) per the budget DNA (ADR 0323).
230
+ function provisioningRequest(spec) {
231
+ const p = spec && spec.provisioning;
232
+ if (!isObj(p)) return null;
233
+ const shape = HOSTING_SHAPES.includes(p.shape) ? p.shape : 'byo-host';
234
+ const body = { slug: provisioningSlug(spec), hosting_shape: shape };
235
+ if (p.domain) body.domain = String(p.domain).trim();
236
+ if (p.targetRef) body.target_ref = String(p.targetRef).trim();
237
+ if (p.tier) body.tier = String(p.tier).trim();
238
+ return body;
239
+ }
240
+
241
+ // The kickoff checklist itself (and the production-topology step the provisioning
242
+ // module can automate) now live in modules/lifecycle/kickoff-checklist.js — ONE list shared
243
+ // with the lifecycle module, which files the same steps at the founder's first
244
+ // sign-in on the control-plane path (task 1003239). init keeps its names.
245
+ const { kickoffChecklist, productionTopologyKickoff } = require('../../modules/lifecycle/kickoff-checklist');
246
+
247
+ // The lean instance branding.json: ONLY the fields the owner supplied. Everything
248
+ // else (theme, copy, rank labels, box subdomain pattern) resolves from
249
+ // config/branding.neutral.json via src/branding.js. Writing less keeps an
250
+ // instance's overrides legible and lets vanilla defaults flow through.
251
+ function buildBrandingConfig(spec) {
252
+ const id = spec.identity || {};
253
+ const productName = id.productName;
254
+ const origin = (spec.domains && spec.domains.publicOrigin) || 'http://localhost:3000';
255
+ const branding = {
256
+ _note: `${productName} — instance brand pack (overrides over config/branding.neutral.json). ` +
257
+ 'Authored by `bongos init`. Fill the LOOK (palette/fonts/wordmark) with your own LLM via docs/branding-fill-prompt.md.',
258
+ identity: {
259
+ productName,
260
+ worldName: id.worldName || productName,
261
+ company: { name: (id.company && id.company.name) || '', site: (id.company && id.company.site) || '' },
262
+ },
263
+ llmProjectName: productName,
264
+ domains: {
265
+ publicOrigin: origin,
266
+ buildersOrigin: origin,
267
+ statusOrigin: origin,
268
+ oauthOrigin: origin,
269
+ },
270
+ repo: { owner: spec.repo.owner, name: spec.repo.name },
271
+ firstAdmin: spec.firstAdmin,
272
+ currency: { label: (spec.currency && spec.currency.label) || 'credits', symbol: (spec.currency && spec.currency.symbol) || '' },
273
+ envPrefix: spec.envPrefix || FALLBACK_ENV_PREFIX,
274
+ // Every instance gets its OWN session/config dir (task 1002626). Without
275
+ // this, instance-config.js falls back to the shared 'cloudbongos' dir, so
276
+ // every un-branded instance on a machine reads/writes the SAME
277
+ // ~/.config/cloudbongos/bongos-session.json — signing in to one silently
278
+ // evicts the CLI session of every other, including the hub. Same slug
279
+ // family as the package name + provisioning slug.
280
+ configDir: spec.configDir ? String(spec.configDir).trim() : slugify(productName, 'instance'),
281
+ };
282
+ if (spec.tagline) branding.copy = { tagline: spec.tagline };
283
+ return branding;
284
+ }
285
+
286
+ // modules.json — every known module, explicit boolean. Default OFF (vanilla).
287
+ function buildModulesConfig(spec) {
288
+ const on = new Set(Array.isArray(spec.modules) ? spec.modules : []);
289
+ const modules = {};
290
+ for (const m of KNOWN_MODULES) modules[m] = on.has(m);
291
+ return { modules };
292
+ }
293
+
294
+ // hierarchy.json — the work-tier preset (ADR 0086 §1). The six-tier default with
295
+ // the instance's optional overrides applied: spec.hierarchy.labels ({tierKey:
296
+ // label}), spec.hierarchy.enabled ({tierKey: bool}), spec.hierarchy.roles
297
+ // ({scope/membership/criteria: tierKey}). Most instances keep the canonical six
298
+ // tiers, so this writes them explicitly (self-documenting), resolved over the
299
+ // baked DEFAULT_HIERARCHY by src/bongos/hierarchy-config.js at load.
300
+ function buildHierarchyConfig(spec) {
301
+ const h = isObj(spec.hierarchy) ? spec.hierarchy : {};
302
+ const labels = isObj(h.labels) ? h.labels : {};
303
+ const enabled = isObj(h.enabled) ? h.enabled : {};
304
+ const tiers = DEFAULT_HIERARCHY.tiers.map((t) => ({
305
+ key: t.key,
306
+ label: typeof labels[t.key] === 'string' && labels[t.key].trim() ? labels[t.key].trim() : t.label,
307
+ enabled: typeof enabled[t.key] === 'boolean' ? enabled[t.key] : t.enabled,
308
+ }));
309
+ const roles = { ...DEFAULT_HIERARCHY.roles, ...(isObj(h.roles) ? h.roles : {}) };
310
+ const productName = (spec.identity && spec.identity.productName) || 'Instance';
311
+ return {
312
+ _note: `${productName} — work-hierarchy tiers (ADR 0086 §1): per-tier label/enabled + roles ` +
313
+ '(which tier carries scope_modules / members / done-when criteria), resolved over the six-tier ' +
314
+ 'default in src/bongos/hierarchy-config.js. Authored by `bongos init`.',
315
+ tiers,
316
+ roles,
317
+ };
318
+ }
319
+
320
+ // PURE — layer the pinned core dependency into a parsed package.json (ADR 0121
321
+ // §Decision 2 / task 2042). NEVER clobbers: if `@bongos/core` is already a dep
322
+ // (in dependencies OR devDependencies) it returns the object untouched with
323
+ // action:'present'; if there is no package.json at all it MINTS a minimal one
324
+ // (action:'created'); otherwise it ADDS the dep, preserving every existing field and
325
+ // key order (action:'added'). The `--force`-overwrite path is never involved. The
326
+ // caller only writes the file for 'added'/'created' — 'present' stays byte-untouched.
327
+ function mergeCoreDependency(pkg, { corePkg = CORE_PKG, coreRange, name = 'cloudbongos-instance' } = {}) {
328
+ const range = coreRange || coreDepRange();
329
+ if (!isObj(pkg)) {
330
+ return { pkg: { name, private: true, dependencies: { [corePkg]: range } }, action: 'created' };
331
+ }
332
+ const already = (isObj(pkg.dependencies) && pkg.dependencies[corePkg]) ||
333
+ (isObj(pkg.devDependencies) && pkg.devDependencies[corePkg]);
334
+ if (already) return { pkg, action: 'present' };
335
+ // Spread keeps the original key order — `dependencies` stays where it was (or is
336
+ // appended if absent). We add exactly one key; we never reorder or drop theirs.
337
+ const next = { ...pkg, dependencies: { ...(isObj(pkg.dependencies) ? pkg.dependencies : {}), [corePkg]: range } };
338
+ return { pkg: next, action: 'added' };
339
+ }
340
+
341
+ // The kickoff checklist, as tasks — the steps init CANNOT do for you (the shared
342
+ // list, self-host shape). Production topology is omitted when the owner opted into
343
+ // provisioning: the control-plane runner covers that leg (ADR 0111 §3).
344
+ function kickoffTasks(spec) {
345
+ return kickoffChecklist(spec, { provisioned: !!provisioningRequest(spec) });
346
+ }
347
+
348
+ // Normalize a raw spec (from --from or the interview) to canonical shape +
349
+ // defaults. Pure.
350
+ function normalizeSpec(raw = {}) {
351
+ const spec = { ...raw };
352
+ spec.identity = spec.identity || {};
353
+ spec.repo = spec.repo || {};
354
+ spec.version = spec.version || {};
355
+ spec.modules = Array.isArray(spec.modules) ? spec.modules.filter((m) => KNOWN_MODULES.includes(m)) : [];
356
+ if (!spec.version.status) spec.version.status = 'building';
357
+ // Provisioning (ADR 0111 §3) — a block ⇒ the owner opted in. Coerce the shape to a
358
+ // known value (default byo-host, the free front door) and trim the free-text refs; drop the
359
+ // block entirely when absent so provisioningRequest() reads it as "not requested".
360
+ if (isObj(spec.provisioning)) {
361
+ const p = spec.provisioning;
362
+ spec.provisioning = {
363
+ shape: HOSTING_SHAPES.includes(p.shape) ? p.shape : 'byo-host',
364
+ ...(p.slug ? { slug: String(p.slug).trim() } : {}),
365
+ ...(p.domain ? { domain: String(p.domain).trim() } : {}),
366
+ ...(p.targetRef ? { targetRef: String(p.targetRef).trim() } : {}),
367
+ ...(p.tier ? { tier: String(p.tier).trim() } : {}),
368
+ };
369
+ } else {
370
+ delete spec.provisioning;
371
+ }
372
+ return spec;
373
+ }
374
+
375
+ // Validate a normalized spec → array of human-readable error strings ([] = ok).
376
+ // Version fields are required whenever init will SEED — greenfield always, and
377
+ // `--adopt` too (task 2044: adopt reflects the repo's REAL current version/goal, not
378
+ // a synthetic V1). Only `--adopt --no-seed` (layering-only, the task-2042 skeleton
379
+ // behavior) skips them, since it files nothing.
380
+ function validateSpec(spec, { adopt = false, noSeed = false } = {}) {
381
+ const errs = [];
382
+ if (!spec.identity || !spec.identity.productName) errs.push('identity.productName is required');
383
+ if (!spec.repo || !spec.repo.owner || !spec.repo.name) errs.push('repo.owner and repo.name are required');
384
+ if (!spec.firstAdmin) errs.push('firstAdmin (the founding owner GitHub login) is required');
385
+ const seeds = !(adopt && noSeed);
386
+ if (seeds) {
387
+ const noun = adopt ? 'your current version/milestone' : 'the first version';
388
+ if (!spec.version || !spec.version.id) errs.push(`version.id is required (e.g. "V1") — ${noun}`);
389
+ if (!spec.version || !spec.version.name) errs.push('version.name is required');
390
+ if (!spec.version || !spec.version.done_when) errs.push(`version.done_when is required (what "done" means for ${noun})`);
391
+ }
392
+ for (const m of spec.modules || []) {
393
+ if (!KNOWN_MODULES.includes(m)) errs.push(`unknown module "${m}" (known: ${KNOWN_MODULES.join(', ')})`);
394
+ }
395
+ if (spec.provisioning) {
396
+ if (!HOSTING_SHAPES.includes(spec.provisioning.shape)) {
397
+ errs.push(`provisioning.shape must be one of: ${HOSTING_SHAPES.join(', ')}`);
398
+ }
399
+ if (provisioningSlug(spec).length < 2) {
400
+ errs.push('provisioning: could not derive a valid instance slug (need ≥2 chars of [a-z0-9-]) — set identity.productName or provisioning.slug');
401
+ }
402
+ }
403
+ return errs;
404
+ }
405
+
406
+ // Build the POST /api/bongos/versions body from the spec (pure). The first version's
407
+ // done_when goal becomes both the version blurb and one done-when criterion, so
408
+ // /status has a finish line to roll up from day one.
409
+ function versionPayload(spec) {
410
+ const v = spec.version;
411
+ return {
412
+ id: v.id,
413
+ name: v.name,
414
+ status: v.status || 'building',
415
+ done_when: v.done_when,
416
+ criteria: [{ criterion_id: v.criterion_id ? slugify(v.criterion_id) : 'first-goal', criterion_md: v.done_when }],
417
+ };
418
+ }
419
+
420
+ // ---------------------------------------------------------------------------
421
+ // Interview (interactive)
422
+ // ---------------------------------------------------------------------------
423
+
424
+ function ask(rl, question, def) {
425
+ const suffix = def ? ` [${def}]` : '';
426
+ return new Promise((resolve) => rl.question(`${question}${suffix}\n> `, (a) => resolve((a || '').trim() || def || '')));
427
+ }
428
+
429
+ async function interview({ adopt = false } = {}) {
430
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
431
+ try {
432
+ console.log(adopt
433
+ ? "\nLet's adopt Cloud Bongos onto your existing repo.\n (layering only — pre-existing files are left untouched, never overwritten)\n"
434
+ : "\nLet's stand up a new Cloud Bongos instance.\n");
435
+ const productName = await ask(rl, 'Project name?');
436
+ const tagline = await ask(rl, 'One-line tagline? (optional)');
437
+ const repoRaw = await ask(rl, 'GitHub repo the work lands in? (owner/name)');
438
+ const firstAdmin = await ask(rl, 'First owner (GitHub login)?');
439
+ const currency = await ask(rl, 'Name for the reward currency?', 'credits');
440
+ const publicOrigin = await ask(rl, 'Where will it run?', 'http://localhost:3000');
441
+
442
+ const modules = [];
443
+ console.log('\nFeature modules (all off = plain build platform):');
444
+ for (const m of KNOWN_MODULES) {
445
+ const yn = (await ask(rl, ` Enable "${m}"? (y/N)`, 'N')).toLowerCase();
446
+ if (yn === 'y' || yn === 'yes') modules.push(m);
447
+ }
448
+
449
+ // The version + goal. Greenfield seeds a SYNTHETIC first version; --adopt reflects
450
+ // the repo's REAL current version/milestone + open goal (ADR 0121 §Decision 3 /
451
+ // task 2044) — same questions, real-state framing, no "Prove the loop" default.
452
+ console.log(adopt ? '\nYour CURRENT version / milestone (adopt reflects real state):' : '\nYour first version:');
453
+ const versionId = await ask(rl, ' Version id?', adopt ? '' : 'V1');
454
+ const versionName = await ask(rl, ' Version name?', adopt ? '' : `${versionId} — Prove the loop`);
455
+ const doneWhen = await ask(rl, adopt ? ' What is the current goal — what does "done" mean right now?' : ` What does "done" mean for ${versionName}?`,
456
+ adopt ? '' : 'A task goes claim → grade → ship, with credits, on this instance.');
457
+ // Greenfield asks for one optional starter; --adopt IMPORTS the existing backlog
458
+ // (GitHub issues / a local TODO·ROADMAP·BACKLOG file) at seed time, so instead it
459
+ // just offers to point at a backlog file when auto-detection might miss it.
460
+ const starter = adopt ? '' : await ask(rl, ' First starter task to claim? (optional)');
461
+ const backlogFile = adopt ? await ask(rl, ' Path to a backlog file to import? (optional — blank = auto-detect TODO/ROADMAP/BACKLOG or GitHub issues)') : '';
462
+
463
+ // Production hosting (ADR 0111 §3) — opt-in. When the owner answers these infra
464
+ // questions, init files a real provisioning REQUEST via the API (not just a manual
465
+ // runbook task). Default N: most inits are localhost/dev and shouldn't queue infra.
466
+ console.log('\nProduction hosting (optional — needs the provisioning module + control-plane credentials):');
467
+ let provisioning;
468
+ const wantProv = (await ask(rl, ' Provision production hosting now? (y/N)', 'N')).toLowerCase();
469
+ if (wantProv === 'y' || wantProv === 'yes') {
470
+ // Describes each shape by WHAT IT DOES and never by its owner-facing product
471
+ // name. The stored value → owner-facing label translation lives in exactly one
472
+ // place — SHAPE_LABEL in modules/public-landing/public/projects.html (ADR 0323,
473
+ // and this module's CLAUDE.md says so) — so glossing '"cloud host"' here would
474
+ // be a second copy of it, in a file no designer renaming the product would
475
+ // think to open. A CLI prompt naming the stored value it is about to write is
476
+ // the right register anyway: this asks for a column value, not for a purchase.
477
+ const shape = (await ask(rl, ' Hosting shape? (byo-host = you run it on your own host / cloud-host = its own repo + pinned @bongos/core, stood up for you)', 'byo-host')).toLowerCase();
478
+ const domain = await ask(rl, ' Domain you own — bring-your-own (blank = the platform assigns <slug>.<its apex> when configured)?');
479
+ const targetRef = await ask(rl, ' Target credential ref? (which control-plane creds the runner should use; optional)');
480
+ // No tier question any more. It existed only for 'dedicated', which ADR 0327
481
+ // decision 4 deleted: on the owner's own platform account a bigger plan is a
482
+ // setting they choose, not a hosting shape we model. `tier` stays in the spec
483
+ // shape below because a previously-written spec may still carry one.
484
+ const tier = '';
485
+ provisioning = {
486
+ shape: HOSTING_SHAPES.includes(shape) ? shape : 'byo-host',
487
+ domain: domain || undefined,
488
+ targetRef: targetRef || undefined,
489
+ tier: tier || undefined,
490
+ };
491
+ }
492
+
493
+ const [owner, name] = repoRaw.includes('/') ? repoRaw.split('/') : [repoRaw, ''];
494
+ const spec = {
495
+ identity: { productName },
496
+ tagline: tagline || undefined,
497
+ repo: { owner, name },
498
+ firstAdmin,
499
+ currency: { label: currency },
500
+ domains: { publicOrigin },
501
+ modules,
502
+ };
503
+ spec.version = { id: versionId, name: versionName, done_when: doneWhen };
504
+ if (starter) spec.starterTasks = [{ title: starter, kind: 'unclassified' }];
505
+ if (backlogFile) spec.backlogFile = backlogFile;
506
+ if (provisioning) spec.provisioning = provisioning;
507
+ return spec;
508
+ } finally {
509
+ rl.close();
510
+ }
511
+ }
512
+
513
+ // ---------------------------------------------------------------------------
514
+ // Write + seed
515
+ // ---------------------------------------------------------------------------
516
+
517
+ // PURE (exported for tests) — the root START-HERE guide (task 1002404, goal
518
+ // 1000052; task 1003881 made it LAYER onto an existing README instead of
519
+ // skipping one — see layerReadme below). A freshly-CLONED instance must tell a human what to run FIRST: the
520
+ // `bongos` CLI ships INSIDE the not-yet-installed @bongos/core package, so
521
+ // `npm install` has to come before any `bongos` command (including `bongos dev`).
522
+ // `bongos init` runs npm install during scaffolding, but a later `git clone` of
523
+ // the committed instance repo skips that — so this file is the signpost the clone
524
+ // carries. Owner-friendly and plain-language (the owner may not be an engineer).
525
+ function buildReadme(branding = {}) {
526
+ const identity = branding.identity || {};
527
+ const name = identity.productName || 'This Cloud Bongos instance';
528
+ const origin = (branding.domains && branding.domains.publicOrigin) || '';
529
+ const loginLine = origin
530
+ ? `3. \`bongos login ${origin}\` — only if you're signed in to a *different* instance (\`bongos dev\` signs you in the first time).`
531
+ : `3. \`bongos login <your-instance-url>\` — only if you're signed in to a *different* instance (\`bongos dev\` signs you in the first time).`;
532
+ return [
533
+ `# ${name}`,
534
+ '',
535
+ 'A **Cloud Bongos** instance — an AI-first build platform: AI agents claim tasks and write the code; a human owner sets scope and the gates.',
536
+ '',
537
+ '## Start here (first run)',
538
+ '',
539
+ 'Just cloned this repo? Run these **in order**. The `bongos` CLI ships *inside* the `@bongos/core` dependency, so step 1 comes first — until it runs there is no `bongos` command:',
540
+ '',
541
+ '1. `npm install` — installs the toolchain (this is what creates the `bongos` command).',
542
+ '2. `bongos dev` — one command to run this instance locally: starts Postgres, builds the tables, launches the server, and signs you in.',
543
+ loginLine,
544
+ '4. `bongos start` — see what you can work on. (Inside Claude Code, the same thing is `/builder-start`.)',
545
+ '',
546
+ 'Requires Node >= 22 and Postgres installed locally (macOS/Linux; on Windows use WSL). If anything looks off, `bongos doctor` checks your setup and prints the fix.',
547
+ '',
548
+ '## Where to look next',
549
+ '',
550
+ '- `CLAUDE.md` — how this project is built (the operating manual agents read first).',
551
+ '- `bongos --help` — the full CLI: claim, ship, status, recall, and more.',
552
+ '',
553
+ ].join('\n');
554
+ }
555
+
556
+ // The START-HERE content as an APPENDABLE section, for a repo that already has a
557
+ // README of its own. Fenced by a stable marker so re-running init is idempotent and so
558
+ // an owner can find (and delete) the block we added.
559
+ //
560
+ // WHY this is not just buildReadme: an ADOPTED repo always has a README, and the
561
+ // write-if-absent rule below therefore skipped the first-run guide on every single adopt
562
+ // — silently, logging "already present — left untouched" as though nothing were owed.
563
+ // That removed the one human-facing instruction to run `npm install`, without which the
564
+ // repo has no `bongos` command at all. Appending mirrors how the adopt path already
565
+ // treats .gitignore: keep what the owner wrote, add only what the instance needs.
566
+ const README_MARKER = '<!-- cloud-bongos:start-here -->';
567
+
568
+ function buildReadmeSection(branding = {}) {
569
+ const guide = buildReadme(branding);
570
+ // Reuse the canonical guide, demoted one heading level so it nests under the owner's
571
+ // own README, and drop its H1 title (their README already has one).
572
+ const body = guide
573
+ .split('\n')
574
+ .slice(1) // drop "# <product>"
575
+ .join('\n')
576
+ .replace(/^## /gm, '### ')
577
+ .trim();
578
+ return `${README_MARKER}\n\n## Working on this project (Cloud Bongos)\n\n${body}\n`;
579
+ }
580
+
581
+ // Append the START-HERE section to an existing README unless it is already there.
582
+ // PURE (text in → text out) so the idempotence is unit-testable without fs.
583
+ // Returns { text, action } where action is 'appended' | 'present'.
584
+ function appendReadmeSection(existing, section) {
585
+ const prev = String(existing == null ? '' : existing);
586
+ if (prev.includes(README_MARKER)) return { text: prev, action: 'present' };
587
+ return { text: `${prev.replace(/\n*$/, '\n')}\n---\n\n${section}`, action: 'appended' };
588
+ }
589
+
590
+ // Put the first-run guide in the repo's README whichever state it is in: mint the whole
591
+ // guide when there is no README, else append the marked section. Shared by the greenfield
592
+ // and adopt paths so neither can silently owe it. Returns the action taken.
593
+ function layerReadme(branding, { dir, dryRun, log = console.log } = {}) {
594
+ const readmePath = path.join(dir, 'README.md');
595
+ if (!fs.existsSync(readmePath)) {
596
+ if (dryRun) { log(` [dry-run] would write README.md (first-run START-HERE)`); return 'created'; }
597
+ fs.writeFileSync(readmePath, buildReadme(branding));
598
+ log(` ✓ wrote README.md (first-run START-HERE)`);
599
+ return 'created';
600
+ }
601
+ const { text, action } = appendReadmeSection(fs.readFileSync(readmePath, 'utf8'), buildReadmeSection(branding));
602
+ if (action === 'present') {
603
+ log(' • README.md already carries the Cloud Bongos start-here section — left untouched.');
604
+ return 'present';
605
+ }
606
+ if (dryRun) { log(' [dry-run] would append the Cloud Bongos start-here section to the existing README.md'); return 'appended'; }
607
+ fs.writeFileSync(readmePath, text);
608
+ log(' ✓ appended the Cloud Bongos start-here section to README.md (your own content is untouched)');
609
+ return 'appended';
610
+ }
611
+
612
+ function writeConfigs(spec, { dir, force, dryRun, coreDep, log = console.log }) {
613
+ const configDir = path.join(dir, 'config');
614
+ const brandingPath = path.join(configDir, 'branding.json');
615
+ const modulesPath = path.join(configDir, 'modules.json');
616
+ const hierarchyPath = path.join(configDir, 'hierarchy.json');
617
+ const pkgPath = path.join(dir, 'package.json');
618
+ const readmePath = path.join(dir, 'README.md');
619
+ const branding = buildBrandingConfig(spec);
620
+ const modules = buildModulesConfig(spec);
621
+ const hierarchy = buildHierarchyConfig(spec);
622
+ // Greenfield OWNS package.json (ADR 0108 gap 1/4, task 2053): mint it — or augment one
623
+ // from a prior --force run — so the scaffold is `npm ci`-installable + runnable. Augment,
624
+ // never blind-overwrite, so a re-run keeps any hand-added fields/scripts.
625
+ const pkgName = slugify((spec.identity && spec.identity.productName) || '', 'cloudbongos-instance');
626
+ let existingPkg = null;
627
+ if (fs.existsSync(pkgPath)) { try { existingPkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); } catch { existingPkg = null; } }
628
+ // Compose the deps of the ENABLED modules (ADR 0138 / task 2160) so an instance that turns a
629
+ // bundled module on gets that module's npm deps (e.g. discord → discord.js) in its package.json,
630
+ // rather than crashing at boot on a dep @bongos/core deliberately doesn't carry (rehearsal F2).
631
+ const moduleDeps = enabledModuleDeps(modules);
632
+ const pkg = buildInstancePackageJson(existingPkg, { name: pkgName, coreDep, moduleDeps });
633
+ const pinNote = pkg.dependencies[CORE_PKG];
634
+
635
+ if (dryRun) {
636
+ log(`\n[dry-run] would write ${brandingPath}:`);
637
+ log(JSON.stringify(branding, null, 2));
638
+ log(`\n[dry-run] would write ${modulesPath}:`);
639
+ log(JSON.stringify(modules, null, 2));
640
+ log(`\n[dry-run] would write ${hierarchyPath}:`);
641
+ log(JSON.stringify(hierarchy, null, 2));
642
+ log(`\n[dry-run] would write ${pkgPath} (pins ${CORE_PKG} → ${pinNote}):`);
643
+ log(JSON.stringify(pkg, null, 2));
644
+ log(`\n[dry-run] would write ${readmePath} (root START-HERE first-run guide) if absent`);
645
+ return { brandingPath, modulesPath, hierarchyPath, pkgPath, readmePath, wrote: false };
646
+ }
647
+ if (fs.existsSync(brandingPath) && !force) {
648
+ throw new Error(`${brandingPath} already exists — refusing to overwrite. Use --force to replace, or run init in a fresh --dir.`);
649
+ }
650
+ fs.mkdirSync(configDir, { recursive: true });
651
+ fs.writeFileSync(brandingPath, JSON.stringify(branding, null, 2) + '\n');
652
+ fs.writeFileSync(modulesPath, JSON.stringify(modules, null, 2) + '\n');
653
+ fs.writeFileSync(hierarchyPath, JSON.stringify(hierarchy, null, 2) + '\n');
654
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
655
+ log(` ✓ wrote ${path.relative(dir, brandingPath)}`);
656
+ log(` ✓ wrote ${path.relative(dir, modulesPath)}`);
657
+ log(` ✓ wrote ${path.relative(dir, hierarchyPath)}`);
658
+ log(` ✓ wrote ${path.relative(dir, pkgPath)} (pins ${CORE_PKG} → ${pinNote})`);
659
+ // README START-HERE (task 1002404, layering added by task 1003881): mint it when
660
+ // absent, else APPEND the marked section. Never a blind overwrite — an owner's own
661
+ // README content always survives, which is why the guide stopped being skipped.
662
+ layerReadme(branding, { dir, dryRun: false, log });
663
+ return { brandingPath, modulesPath, hierarchyPath, pkgPath, readmePath, wrote: true };
664
+ }
665
+
666
+ // `--adopt` config layering (ADR 0121 §Decision 2 / task 2042). The additive
667
+ // sibling of writeConfigs: it does NOT refuse where config/branding.json exists and
668
+ // it NEVER overwrites. For each lean config file it WRITES only when absent, and
669
+ // LEAVES-AND-REPORTS when present. The greenfield writeConfigs — with its --force
670
+ // overwrite — is deliberately not reused: a brownfield repo is exactly where an
671
+ // overwrite is expensive. Returns { wrote:[names], left:[names] }.
672
+ function layerConfigs(spec, { dir, dryRun, log = console.log }) {
673
+ const configDir = path.join(dir, 'config');
674
+ const targets = [
675
+ ['branding.json', buildBrandingConfig(spec)],
676
+ ['modules.json', buildModulesConfig(spec)],
677
+ ['hierarchy.json', buildHierarchyConfig(spec)],
678
+ ];
679
+ const wrote = [];
680
+ const left = [];
681
+ for (const [name, content] of targets) {
682
+ const p = path.join(configDir, name);
683
+ if (fs.existsSync(p)) {
684
+ left.push(name);
685
+ log(` • config/${name} already present — left untouched (adopt never overwrites).`);
686
+ continue;
687
+ }
688
+ wrote.push(name);
689
+ if (dryRun) { log(` [dry-run] would write config/${name}`); continue; }
690
+ fs.mkdirSync(configDir, { recursive: true });
691
+ fs.writeFileSync(p, JSON.stringify(content, null, 2) + '\n');
692
+ log(` ✓ wrote config/${name}`);
693
+ }
694
+ return { wrote, left };
695
+ }
696
+
697
+ // `--adopt` package.json layering (ADR 0121 §Decision 2 / task 2042): add the
698
+ // pinned @bongos/core dependency to the owner's EXISTING package.json without
699
+ // touching any other field, or MINT a minimal one when the repo has none. When the
700
+ // dep is already present the file is left byte-untouched (no reserialize). An
701
+ // unparseable package.json is left alone with a report — adopt never risks
702
+ // corrupting a file it can't safely rewrite. Returns { action, path }.
703
+ function layerPackageJson(spec, { dir, dryRun, log = console.log, coreRange = coreDepRange() } = {}) {
704
+ const p = path.join(dir, 'package.json');
705
+ let existing = null;
706
+ if (fs.existsSync(p)) {
707
+ try { existing = JSON.parse(fs.readFileSync(p, 'utf8')); }
708
+ catch (e) {
709
+ log(` • package.json exists but is not valid JSON (${e.message}) — left untouched; add "${CORE_PKG}": "${coreRange}" to its dependencies by hand.`);
710
+ return { action: 'unparseable', path: p };
711
+ }
712
+ }
713
+ const name = slugify((spec.identity && spec.identity.productName) || '', 'cloudbongos-instance');
714
+ const { pkg, action } = mergeCoreDependency(existing, { coreRange, name });
715
+ if (action === 'present') {
716
+ log(` • ${CORE_PKG} already a dependency — package.json left untouched.`);
717
+ return { action, path: p };
718
+ }
719
+ const verb = action === 'created' ? 'create package.json pinning' : 'add';
720
+ const tail = action === 'added' ? ' to dependencies (existing fields preserved)' : '';
721
+ if (dryRun) { log(` [dry-run] would ${verb} ${CORE_PKG}@${coreRange}${tail}`); return { action, path: p }; }
722
+ fs.writeFileSync(p, JSON.stringify(pkg, null, 2) + '\n');
723
+ log(` ✓ ${action === 'created' ? 'created package.json pinning' : 'added'} ${CORE_PKG}@${coreRange}${tail}`);
724
+ return { action, path: p };
725
+ }
726
+
727
+ async function seedViaApi(spec, { dryRun, log = console.log, api = apiCall } = {}) {
728
+ const vp = versionPayload(spec);
729
+ const starters = Array.isArray(spec.starterTasks) ? spec.starterTasks : [];
730
+ const kickoff = kickoffTasks(spec);
731
+ const pr = provisioningRequest(spec); // ADR 0111 §3 — null unless the owner opted in
732
+
733
+ if (dryRun) {
734
+ log(`\n[dry-run] would POST /api/bongos/versions:`);
735
+ log(JSON.stringify(vp, null, 2));
736
+ log(`\n[dry-run] would create ${starters.length} starter + ${kickoff.length} kickoff task(s) under ${vp.id}.`);
737
+ if (pr) {
738
+ log(`\n[dry-run] would POST /api/bongos/provisioning/instances:`);
739
+ log(JSON.stringify(pr, null, 2));
740
+ log(` (queues a 'provision' intent; the control-plane runner stands up hosting — ADR 0111 §2/§3.`);
741
+ log(` production-topology is left OFF the kickoff list since it's now automated.)`);
742
+ }
743
+ return { seeded: false };
744
+ }
745
+
746
+ // 1. version + first goal
747
+ const vres = await api('POST', '/api/bongos/versions', vp);
748
+ if (!vres.ok && vres.status !== 409) {
749
+ throw new Error(`POST /versions failed (${vres.status}): ${JSON.stringify(vres.data)}`);
750
+ }
751
+ // The version's first goal — every task below needs its id (BV1.R11 refuses a
752
+ // goal-less task, and R03 refuses creating a goal on a version that is already
753
+ // 'building', which is what versionPayload makes). POST /versions now returns it
754
+ // alongside the version (task 1003701); on the 409 re-run path the version is
755
+ // already there, so read its goals back instead.
756
+ let goalId = vres.ok && vres.data && vres.data.goal ? vres.data.goal.id : null;
757
+ if (vres.status === 409) {
758
+ log(` • version ${vp.id} already exists — continuing.`);
759
+ const gres = await api('GET', `/api/bongos/goals?version=${encodeURIComponent(vp.id)}`);
760
+ const goals = gres.ok ? (Array.isArray(gres.data) ? gres.data : (gres.data && gres.data.goals) || []) : [];
761
+ const open = goals.find((g) => g && g.status === 'open' && !g.is_maintenance) || goals.find((g) => g && g.status === 'open');
762
+ goalId = open ? open.id : null;
763
+ } else {
764
+ log(` ✓ created version ${vp.id} + its first goal`);
765
+ }
766
+ // Fail LOUD rather than filing a wave of tasks the server will refuse one by one:
767
+ // with no goal every POST below returns 400 goal_id_required, and the run would
768
+ // report a pile of identical failures instead of the single reason behind them.
769
+ if (goalId == null) {
770
+ throw new Error(
771
+ `could not determine a goal for version ${vp.id} — every task needs one (goal_id_required). ` +
772
+ `The version exists but has no open goal to file under; create one and re-run.`
773
+ );
774
+ }
775
+ const criterionId = vp.criteria[0].criterion_id;
776
+
777
+ // A tracked kickoff/starter task (status ready). Returns true on success.
778
+ // The whole point of filing these is "nothing is silently skipped" — so a
779
+ // rejected POST must be LOUD: every failure is collected with its reason and
780
+ // reported against the expected count, never absorbed into a smaller total.
781
+ let attempted = 0;
782
+ const failures = [];
783
+ const postTask = async (t, extra = {}) => {
784
+ attempted++;
785
+ const res = await api('POST', '/api/bongos/tasks', {
786
+ version_id: vp.id, goal_id: goalId, title: t.title, description: t.description || '', status: 'ready',
787
+ kind: t.kind || 'infra', discipline: t.discipline || 'engineer', source: 'bongos-init', ...extra,
788
+ });
789
+ if (!res.ok) failures.push({ title: t.title, status: res.status, detail: JSON.stringify(res.data) });
790
+ return res.ok;
791
+ };
792
+
793
+ // 2. starter task(s) — linked to the first goal so /status rolls them up
794
+ let created = 0;
795
+ for (const t of starters) {
796
+ // task 1002988: `discipline: undefined` used to sit in this extras object, and
797
+ // because `...extra` spreads AFTER postTask's own `t.discipline || 'engineer'`
798
+ // it clobbered that default back to nothing — which is why a freshly scaffolded
799
+ // instance was born with role-less starter tasks. Dropped, so starters inherit
800
+ // the same default every other seeded task already got.
801
+ if (await postTask(t, { kind: t.kind || 'unclassified', criterion_ids: [criterionId] })) created++;
802
+ }
803
+ // 3. kickoff steps as tracked tasks
804
+ for (const t of kickoff) {
805
+ if (await postTask(t)) created++;
806
+ }
807
+
808
+ // 4. Provisioning arm (ADR 0111 §3): the infra answers become a real provisioning
809
+ // REQUEST, not just a manual runbook task. kickoffTasks already omitted the
810
+ // production-topology step when pr is set — so if the request can't be enqueued
811
+ // (module not enabled on the target instance → 404, or a transient failure), we
812
+ // re-file that manual step here so the leg is never silently dropped.
813
+ let provisioned = false;
814
+ if (pr) {
815
+ const pres = await api('POST', '/api/bongos/provisioning/instances', pr);
816
+ if (pres.ok) {
817
+ provisioned = true;
818
+ const inst = (pres.data && pres.data.instance) || {};
819
+ const cost = Number(inst.cost_estimate_usd || 0);
820
+ // Report the ROW's domain, not the request's: the server may have
821
+ // auto-assigned <slug>.<instanceBase> to a domainless request (task
822
+ // 1002704) — the operator must hear the address they actually got.
823
+ const addr = inst.domain
824
+ ? `, ${inst.domain}${pr.domain ? '' : ' (auto-assigned — attach your own domain any time to replace it)'}`
825
+ : ', no address yet';
826
+ log(` ✓ requested provisioning of instance "${pr.slug}" (${pr.hosting_shape}${addr})` +
827
+ `${cost ? ` — est. $${cost}/mo` : ''} — a provision intent is queued for the control-plane runner`);
828
+ } else {
829
+ const why = pres.status === 404
830
+ ? 'the provisioning module is not enabled on this instance'
831
+ : `the provisioning request failed (${pres.status}: ${JSON.stringify(pres.data)})`;
832
+ log(` • ${why} — filing the manual production-topology task instead`);
833
+ if (await postTask(productionTopologyKickoff())) created++;
834
+ }
835
+ }
836
+
837
+ const kickoffLabel = provisioned ? `${kickoff.length} kickoff + provisioning request` : `${kickoff.length} kickoff`;
838
+ if (failures.length) {
839
+ log(` ✗ ${failures.length} of ${attempted} task(s) FAILED to file — the checklist below is INCOMPLETE:`);
840
+ for (const f of failures) log(` ✗ "${f.title}" (${f.status}): ${f.detail}`);
841
+ }
842
+ log(` ${failures.length ? '⚠' : '✓'} filed ${created} of ${attempted} task(s) (${starters.length} starter + ${kickoffLabel})`);
843
+ return { seeded: true, created, attempted, failures, provisioned };
844
+ }
845
+
846
+ // ---------------------------------------------------------------------------
847
+ // adopt (brownfield) — LAYER onto an existing repo (ADR 0121 / task 2042)
848
+ // ---------------------------------------------------------------------------
849
+
850
+ // Interactive accept-gate for the pre-flight (ADR 0121 §Decision 5). Default No, so a
851
+ // bare Enter never writes. Only reached when there are no BLOCKING findings (those hard-
852
+ // stop before the prompt). Split out for testability (injectable input/output).
853
+ function confirmProceed({ input = process.stdin, output = process.stdout } = {}) {
854
+ const rl = readline.createInterface({ input, output });
855
+ return new Promise((resolve) => rl.question('\nProceed with layering + seeding onto this repo? (y/N) ', (a) => { rl.close(); resolve(/^y(es)?$/i.test((a || '').trim())); }));
856
+ }
857
+
858
+ // The brownfield sibling of main()'s greenfield body: LAYER Cloud Bongos onto an
859
+ // EXISTING repo without clobbering, then reflect its REAL state. It (1) detects the
860
+ // stack (task 2043), (2) runs an accept-gated conflict PRE-FLIGHT (task 2045) — nothing
861
+ // is written until the owner accepts — then, on accept, (3) writes the lean config where
862
+ // absent + adds the pinned core dep + copies .claude/ ADDITIVELY (task 2042) and (4)
863
+ // seeds the repo's REAL version/goal + IMPORTS its existing backlog (task 2044), NOT a
864
+ // synthetic "V1 — Prove the loop". `--dry-run` previews everything and writes nothing;
865
+ // `--no-seed` layers without seeding. Returns a process exit code.
866
+ // `coreDep`/`vendorPlan` (task 1002562): adopt used to ALWAYS write the caret range,
867
+ // which resolves NOWHERE on npm — so an adopted repo could not `npm ci --omit=dev`, the
868
+ // exact command the provisioner runs on the box. Greenfield already had --vendor-core for
869
+ // this; passing the same resolved pin through here makes an adopted repo equally
870
+ // installable. Omitted (a plain `bongos init --adopt` on a laptop) → the caret, unchanged.
871
+ async function runAdopt(spec, { dir, dryRun, noSeed = false, accept = false, coreDep = null, vendorPlan = null, log = console.log }) {
872
+ log(`\nAdopting Cloud Bongos onto the existing repo at "${dir}"${dryRun ? ' (dry run — nothing will be written or created)' : ''}:`);
873
+ log(' Layering — pre-existing files are left untouched; nothing is overwritten.');
874
+
875
+ // Inspect the tree BEFORE writing anything (ADR 0121 §Decision 4 / task 2043) so
876
+ // layering fits what is already here.
877
+ const stack = detectStack({ dir });
878
+ log('\nDetected stack + layout:');
879
+ for (const line of formatStackSummary(stack)) log(` • ${line}`);
880
+
881
+ // Conflict PRE-FLIGHT (ADR 0121 §Decision 5 / task 2045): report the blast radius, then
882
+ // gate the writes on the owner's acceptance. --dry-run previews without writing, so it
883
+ // needs no gate; a real run proceeds only on --accept or an interactive yes.
884
+ const report = preflightAdopt({ dir, stack });
885
+ log('\nConflict pre-flight (nothing is written until you accept):');
886
+ for (const line of formatPreflight(report)) log(line);
887
+ log(` → ${report.counts.blocking} blocking · ${report.counts.warning} warning · ${report.counts.info} ok`);
888
+ if (!dryRun) {
889
+ // A BLOCKING finding (e.g. a migration that WILL collide) is a hard stop — it can't
890
+ // be waved through with --accept; the owner must resolve it and re-run.
891
+ if (report.hasBlocking) {
892
+ log(`\n✗ ${report.counts.blocking} BLOCKING conflict(s) above — resolve them, then re-run. Nothing was written.`);
893
+ return 2;
894
+ }
895
+ const proceed = accept || (process.stdin.isTTY ? await confirmProceed() : false);
896
+ if (!proceed) {
897
+ log('\nPre-flight only — nothing was written. Re-run with --accept (or confirm interactively) to apply.');
898
+ return 0;
899
+ }
900
+ }
901
+
902
+ const cfg = layerConfigs(spec, { dir, dryRun, log });
903
+ const pkg = layerPackageJson(spec, { dir, dryRun, log, ...(coreDep ? { coreRange: coreDep } : {}) });
904
+ // The first-run guide, which adopt used to skip entirely: an adopted repo always has a
905
+ // README, so the greenfield write-if-absent rule never fired and the one instruction to
906
+ // run `npm install` was silently owed on every adopt.
907
+ layerReadme(buildBrandingConfig(spec), { dir, dryRun, log });
908
+
909
+ // Vendor the pinned core tarball + generate the lockfile, mirroring the greenfield
910
+ // --vendor-core steps, so the adopted repo is `npm ci --omit=dev`-installable (ADR 0108).
911
+ // Skipped when layerPackageJson found the dep ALREADY present — re-pinning someone's
912
+ // existing declaration is an overwrite, and adopt never overwrites.
913
+ if (vendorPlan && pkg.action !== 'present' && pkg.action !== 'unparseable') {
914
+ const upgrade = require('./upgrade');
915
+ if (dryRun) {
916
+ log(`\n [dry-run] would vendor ${vendorPlan.tgz} → ${vendorPlan.vendorRel} and run \`npm install\` to generate package-lock.json`);
917
+ } else {
918
+ log('\nVendoring the pinned @bongos/core + generating the lockfile:');
919
+ upgrade.vendorTarball({ instanceDir: dir, fromTgz: vendorPlan.tgz, targetVersion: vendorPlan.version });
920
+ log(` ✓ vendored ${vendorPlan.vendorRel}`);
921
+ const inst = upgrade.npmInstall(dir);
922
+ if (!inst.ok) {
923
+ log(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated; run \`npm install\` in ${dir} by hand before provisioning.`);
924
+ } else {
925
+ log(' ✓ npm install → package-lock.json generated (node_modules/@bongos/core installed)');
926
+ }
927
+ }
928
+ } else if (vendorPlan && pkg.action === 'present') {
929
+ log(` • ${CORE_PKG} was already declared — left as-is; the vendored tarball was NOT pinned over it.`);
930
+ }
931
+
932
+ log('\nMaterializing the .claude/ methodology surface (additive — existing files left untouched):');
933
+ const claude = materializeClaude({ coreRoot: resolveCoreRoot(), instanceDir: dir, dryRun, overwrite: false, log });
934
+
935
+ // Reflect REAL state (ADR 0121 §Decision 3 / task 2044): import the existing backlog,
936
+ // then seed the repo's REAL version/goal + the imported tasks + the (identical) human-
937
+ // only kickoff steps via the same seedViaApi greenfield uses — so the ledger starts
938
+ // truthful, not empty. `--no-seed` layers only (the task-2042 skeleton behavior).
939
+ let backlog = { source: 'none', tasks: [], truncated: false };
940
+ if (!noSeed) {
941
+ const githubToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN || null;
942
+ backlog = await resolveBacklogTasks({ dir, repo: spec.repo, githubToken, backlogFile: spec.backlogFile, onWarn: (m) => log(` • ${m}`) });
943
+ // Imported tasks ride in as starterTasks so seedViaApi links them to the goal's criterion.
944
+ if (backlog.tasks.length) spec.starterTasks = [...(spec.starterTasks || []), ...backlog.tasks];
945
+ const importNote = backlog.tasks.length
946
+ ? `${backlog.tasks.length} imported task(s) from ${backlog.source}${backlog.truncated ? ` (capped at ${BACKLOG_MAX})` : ''}`
947
+ : 'no backlog found (capture tasks later)';
948
+ log(`\nReflecting real state — seeding version "${spec.version && spec.version.id}" + goal + ${importNote}:`);
949
+ const seedResult = (await seedViaApi(spec, { dryRun, log })) || {};
950
+ if (Array.isArray(seedResult.failures) && seedResult.failures.length) {
951
+ log(`\n ⚠ ${seedResult.failures.length} seed task(s) failed to file (details above) — re-file them by hand or re-run the seed; the tracked checklist is incomplete until they exist.`);
952
+ }
953
+ } else {
954
+ log('\n (--no-seed: layered config only; skipped real-state seeding)');
955
+ }
956
+
957
+ const leftFiles = cfg.left.length
958
+ + (Array.isArray(claude.skippedFiles) ? claude.skippedFiles.length : 0)
959
+ + (pkg.action === 'present' || pkg.action === 'unparseable' ? 1 : 0);
960
+
961
+ log(`\n${dryRun ? 'Dry run complete — re-run without --dry-run (and --accept) to apply.' : 'Adopted.'} Next:`);
962
+ if (report.counts.warning > 0) log(` • ${report.counts.warning} pre-flight warning(s) above — reconcile them (esp. migrations / CI check names) as you settle in.`);
963
+ if (leftFiles > 0) log(` • ${leftFiles} pre-existing file(s) were left untouched — reconcile them against what a fresh instance ships.`);
964
+ log(' • fill the look: hand docs/branding-fill-prompt.md to your own LLM (or keep your existing branding).');
965
+ log(` • sign in as ${spec.firstAdmin} to seat yourself as the founding owner.`);
966
+ return 0;
967
+ }
968
+
969
+ // ---------------------------------------------------------------------------
970
+ // main
971
+ // ---------------------------------------------------------------------------
972
+
973
+ async function main(argv) {
974
+ const args = argv.slice(2);
975
+ const fromPath = arg('--from', args);
976
+ const dir = path.resolve(arg('--dir', args) || process.cwd());
977
+ const dryRun = hasFlag('--dry-run', args);
978
+ const force = hasFlag('--force', args);
979
+ const noSeed = hasFlag('--no-seed', args);
980
+ const adopt = hasFlag('--adopt', args); // brownfield: LAYER onto an existing repo (ADR 0121)
981
+ const accept = hasFlag('--accept', args) || hasFlag('--yes', args) || hasFlag('-y', args); // adopt pre-flight accept-gate (§Decision 5)
982
+ const vendorCore = arg('--vendor-core', args); // greenfield: vendor + file:-pin a core .tgz, then generate the lockfile (ADR 0108 gap 1/4, task 2053)
983
+ const registryCore = hasFlag('--registry-core', args); // greenfield: keep the caret pin and generate the lockfile from the public registry (task 1003878)
984
+
985
+ if (adopt && force) {
986
+ console.error('init: --force is a greenfield-only overwrite; --adopt never overwrites, so --force is ignored.');
987
+ }
988
+ if (vendorCore && registryCore) {
989
+ console.error('init: --vendor-core and --registry-core are mutually exclusive — the vendored tarball and the registry pull are two ways to resolve the same core dependency. Pick one.');
990
+ return 1;
991
+ }
992
+
993
+ let raw;
994
+ if (fromPath) {
995
+ try {
996
+ raw = JSON.parse(fs.readFileSync(path.resolve(fromPath), 'utf8'));
997
+ } catch (e) {
998
+ console.error(`init: could not read spec ${fromPath}: ${e.message}`);
999
+ return 1;
1000
+ }
1001
+ } else {
1002
+ raw = await interview({ adopt });
1003
+ }
1004
+
1005
+ const spec = normalizeSpec(raw);
1006
+ const errs = validateSpec(spec, { adopt, noSeed });
1007
+ if (errs.length) {
1008
+ console.error('\ninit: the spec is incomplete:');
1009
+ for (const e of errs) console.error(` • ${e}`);
1010
+ return 1;
1011
+ }
1012
+
1013
+ // Core-dep resolution (ADR 0108 gap 1/4, task 2053). With --vendor-core, pin
1014
+ // package.json to the vendored `file:` tarball (the caret range resolves NOWHERE on npm,
1015
+ // so a caret-only scaffold can't `npm ci`); the tarball is copied + the lockfile generated
1016
+ // below. Without it, the scaffold carries the declared caret (a local/dev scaffold the
1017
+ // owner resolves another way). Reuses the bongos-upgrade vendoring + install steps.
1018
+ //
1019
+ // Resolved BEFORE the adopt branch (task 1002562) because BOTH paths need it: an adopted
1020
+ // repo has to be `npm ci`-installable by the provisioner exactly like a scaffolded one.
1021
+ const upgrade = require('./upgrade');
1022
+ let coreDep = null; // null → writeConfigs/layerPackageJson write the caret range
1023
+ let vendorPlan = null;
1024
+ if (vendorCore) {
1025
+ const tgz = path.resolve(vendorCore);
1026
+ if (!fs.existsSync(tgz)) {
1027
+ console.error(`init: --vendor-core tarball not found: ${tgz}`);
1028
+ return 1;
1029
+ }
1030
+ const version = upgrade.versionFromTgzPath(tgz) || coreVersionSafe();
1031
+ if (!version) {
1032
+ console.error(`init: could not derive the core version from ${path.basename(tgz)} — expected a tarball named ${upgrade.ARTIFACT}-<version>.tgz (produced by \`node scripts/bongos/package-core.js\`).`);
1033
+ return 1;
1034
+ }
1035
+ const vendorRel = upgrade.vendorRelFor(version);
1036
+ coreDep = `file:${vendorRel}`;
1037
+ vendorPlan = { tgz, version, vendorRel };
1038
+ }
1039
+
1040
+ // Brownfield (ADR 0121): a distinct LAYER + real-state path — never the greenfield
1041
+ // scaffold/overwrite below. Its own report + next-steps live in runAdopt.
1042
+ if (adopt) return await runAdopt(spec, { dir, dryRun, noSeed, accept, coreDep, vendorPlan });
1043
+
1044
+ console.log(`\nScaffolding "${spec.identity.productName}"${dryRun ? ' (dry run — nothing will be written or created)' : ''}:`);
1045
+ writeConfigs(spec, { dir, force, dryRun, coreDep });
1046
+
1047
+ // Vendor the pinned @bongos/core tarball + generate the lockfile so the scaffold is
1048
+ // `npm ci --omit=dev`-installable by the provisioner (ADR 0108 gap 1/4, task 2053). The
1049
+ // `npm install` here is the ONLY heavy step — it CREATES package-lock.json from the file:
1050
+ // tarball; the provisioner later runs `npm ci` against that committed lockfile.
1051
+ if (vendorPlan) {
1052
+ if (dryRun) {
1053
+ console.log(`\n[dry-run] would vendor ${vendorPlan.tgz} → ${vendorPlan.vendorRel} and run \`npm install\` to generate package-lock.json`);
1054
+ } else {
1055
+ console.log('\nVendoring the pinned @bongos/core + generating the lockfile:');
1056
+ upgrade.vendorTarball({ instanceDir: dir, fromTgz: vendorPlan.tgz, targetVersion: vendorPlan.version });
1057
+ console.log(` ✓ vendored ${vendorPlan.vendorRel}`);
1058
+ const inst = upgrade.npmInstall(dir);
1059
+ if (!inst.ok) {
1060
+ console.error(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated; run \`npm install\` in ${dir} by hand before provisioning.`);
1061
+ } else {
1062
+ console.log(' ✓ npm install → package-lock.json generated (node_modules/@bongos/core installed)');
1063
+ }
1064
+ }
1065
+ }
1066
+
1067
+ // Registry-install path: keep the caret pin writeConfigs wrote and generate
1068
+ // package-lock.json from the registry, so a later `npm ci` is reproducible.
1069
+ //
1070
+ // This used to write an env-fed npm auth file and skip the lockfile when no credential was
1071
+ // present, because @bongos/core published PRIVATE. It is public now (task 1003872), so it
1072
+ // resolves from the default registry like any other dependency: no auth file, no credential,
1073
+ // and no tokenless-404 branch to explain (task 1003878).
1074
+ if (registryCore) {
1075
+ if (dryRun) {
1076
+ console.log('\n[dry-run] would run `npm install` to generate package-lock.json from the registry');
1077
+ } else {
1078
+ console.log('\nWiring the registry-install path:');
1079
+ const inst = upgrade.npmInstall(dir);
1080
+ if (!inst.ok) {
1081
+ console.error(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated. @bongos/core is public, so this is a real failure (network, registry outage, or an unpublished version), not a missing credential.`);
1082
+ } else {
1083
+ console.log(' ✓ npm install → package-lock.json generated (pulled @bongos/core from the registry)');
1084
+ }
1085
+ }
1086
+ }
1087
+
1088
+ // Materialize the .claude/ methodology surface (ADR 0108 §3 / W3): Claude Code reads skills +
1089
+ // hooks + settings.json from the project root, never node_modules, so init copies them from the
1090
+ // core package into the instance and rewrites `node scripts/bongos/<x>.js` → the `bongos` bin.
1091
+ // A no-op when the instance dir IS the core checkout (self-copy guard).
1092
+ console.log('\nMaterializing the .claude/ methodology surface:');
1093
+ materializeClaude({ coreRoot: resolveCoreRoot(), instanceDir: dir, dryRun, log: console.log });
1094
+
1095
+ // Regenerate the per-instance API artifacts (OpenAPI spec + api-reference + typed
1096
+ // client) from the PINNED core's routes so this fresh consumer's COMMITTED artifacts
1097
+ // match its core from day one — not the core package's build-time snapshot (task 2141).
1098
+ // They ship as CORE starters (task 2078 — the hall/docs must render before first regen)
1099
+ // yet are per-instance GENERATED; `bongos upgrade` does the same on a bump, this closes
1100
+ // the gap at standup. Best-effort: a hiccup warns, never fails init — the instance-root
1101
+ // drift guard (fitness `gen-api-docs --check` + the api_client byte-identity test)
1102
+ // catches any lag on the consumer's first CI.
1103
+ if (dryRun) {
1104
+ console.log('\n[dry-run] would regenerate the API artifacts (OpenAPI spec + reference + typed client) from the pinned core');
1105
+ console.log('[dry-run] would seed the whole-file navigation docs (session-log index) from the pinned core');
1106
+ } else {
1107
+ console.log('\nRegenerating the API artifacts from the pinned core (OpenAPI spec + reference + typed client):');
1108
+ const regen = upgrade.regenerateApiArtifacts({ instanceDir: dir, coreRoot: resolveCoreRoot() });
1109
+ if (regen.ok) console.log(` ✓ regenerated (${regen.ran.join(', ')}) → docs/api/ + docs/api-reference.md + clients/bongos-client/`);
1110
+ else console.error(` ! API-artifact regen skipped (${regen.reason}) — regenerate in ${dir} by hand; the instance-root fitness gate flags the lag otherwise.`);
1111
+ // Seed the whole-file navigation docs (session-log index) so a fresh instance's docs/ isn't
1112
+ // empty before its first deploy-regen (ADR 0110 / task 1002314). Gitignored on the instance —
1113
+ // this is a local seed; the ongoing refresh is regen-instance-docs.js on deploy + `bongos
1114
+ // upgrade`. Best-effort, mirrors the api-artifacts line: a hiccup warns, never fails init.
1115
+ console.log('\nSeeding the navigation docs from the pinned core (session-log index):');
1116
+ const nav = upgrade.regenerateNavDocs({ instanceDir: dir, coreRoot: resolveCoreRoot() });
1117
+ if (nav.ok) console.log(` ✓ seeded (${nav.ran.join(', ')}) → docs/`);
1118
+ else console.error(` ! nav-doc seed incomplete (failed: ${nav.failed.map((f) => f.gen).join(', ')}) — the deploy regen (regen-instance-docs.js) retries.`);
1119
+ }
1120
+
1121
+ let seedResult = {};
1122
+ if (!noSeed) seedResult = (await seedViaApi(spec, { dryRun })) || {};
1123
+ else console.log(' (--no-seed: skipped version/task seeding)');
1124
+
1125
+ console.log(`\n${dryRun ? 'Dry run complete.' : 'Done.'} Next:`);
1126
+ if (Array.isArray(seedResult.failures) && seedResult.failures.length) {
1127
+ console.log(` ⚠ ${seedResult.failures.length} seed task(s) failed to file (details above) — re-file them by hand or re-run the seed; the tracked checklist is incomplete until they exist.`);
1128
+ }
1129
+ console.log(' • fill the look: hand docs/branding-fill-prompt.md to your own LLM');
1130
+ console.log(` • sign in as ${spec.firstAdmin} to become the owner, then run \`bongos start\` to see the kickoff tasks`);
1131
+ console.log(' • work through the kickoff tasks the way you would any task: claim → ship');
1132
+ if (seedResult.provisioned) {
1133
+ console.log(` • the control-plane runner (\`bongos provision run-intents --apply\`) will stand up your hosting — watch it in the hall's Instances panel`);
1134
+ } else if (provisioningRequest(spec) && !dryRun) {
1135
+ console.log(' • provisioning wasn\'t enqueued (module off / request failed) — the manual production-topology task is in your queue');
1136
+ }
1137
+ return 0;
1138
+ }
1139
+
1140
+ module.exports = {
1141
+ buildBrandingConfig, buildModulesConfig, buildHierarchyConfig, buildReadme, kickoffTasks, normalizeSpec,
1142
+ validateSpec, versionPayload, slugify, writeConfigs, seedViaApi, interview, main,
1143
+ provisioningSlug, provisioningRequest, productionTopologyKickoff,
1144
+ // --adopt (brownfield layering, ADR 0121 / task 2042)
1145
+ mergeCoreDependency, coreDepRange, layerConfigs, layerPackageJson, runAdopt,
1146
+ buildReadmeSection, appendReadmeSection, layerReadme, README_MARKER,
1147
+ KNOWN_MODULES, HOSTING_SHAPES, CORE_PKG,
1148
+ // greenfield installability (ADR 0108 gap 1/4, task 2053)
1149
+ buildInstancePackageJson, coreVersionSafe, INSTANCE_HALL_SCRIPT, INSTANCE_MIGRATE_SCRIPT,
1150
+ // enabled-module dep composition (ADR 0138 / task 2160)
1151
+ moduleDeclaredDeps, enabledModuleDeps,
1152
+ };
1153
+
1154
+ if (require.main === module) {
1155
+ main(process.argv).then((code) => process.exit(code)).catch((err) => {
1156
+ console.error(`init: ${err.message}`);
1157
+ process.exit(1);
1158
+ });
1159
+ }