@bongos/core 1.21.175 → 1.21.176

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