@bongos/core 1.21.174 → 1.21.176

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1744) hide show
  1. package/.bongos-core.json +3565 -1515
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +14 -14
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  58. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  59. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  60. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  61. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  62. package/docs/adr/README.md +2 -0
  63. package/docs/api/openapi.json +606 -44
  64. package/docs/api-reference.md +25 -12
  65. package/docs/architecture.md +8 -7
  66. package/docs/canonical-permissions.md +3 -3
  67. package/docs/copy-inventory.md +1389 -1437
  68. package/docs/copy-registry.json +2160 -2634
  69. package/docs/design/demonolith-plan.md +6 -6
  70. package/docs/design/modular-architecture/00-research-report.md +1 -1
  71. package/docs/design/project-startup-direction.md +2 -2
  72. package/docs/design/projects-hub-direction-v2.md +1 -1
  73. package/docs/design/reviews/hall-v2/README.md +2 -2
  74. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  75. package/docs/file-map.md +89 -88
  76. package/docs/handoff-template.md +4 -4
  77. package/docs/module-api-changelog.md +6 -2
  78. package/docs/modules-contract.md +8 -7
  79. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  80. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  81. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  82. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  83. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  84. package/docs/onboarding/diagrams/README.md +2 -2
  85. package/docs/onboarding/diagrams/assertions.json +2 -2
  86. package/docs/onboarding/slash-commands.md +2 -2
  87. package/docs/packs/artist.md +4 -4
  88. package/docs/packs/engineer.md +11 -10
  89. package/docs/packs/ideator.md +7 -7
  90. package/docs/page-inventory.json +25 -1
  91. package/docs/page-readings.json +4388 -4602
  92. package/docs/recipes/README.md +1 -1
  93. package/docs/recipes/audit-replay.md +4 -4
  94. package/docs/recipes/autobongos-windows-host.md +6 -6
  95. package/docs/recipes/bongos-cli-release.md +2 -2
  96. package/docs/recipes/claude-design-loop.md +7 -7
  97. package/docs/recipes/core-release-pipeline.md +19 -19
  98. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  99. package/docs/recipes/figma-design-loop.md +6 -6
  100. package/docs/recipes/gds-db-backup.md +9 -9
  101. package/docs/recipes/instance-deploy.md +3 -3
  102. package/docs/recipes/instance-first-run.md +1 -1
  103. package/docs/recipes/multi-builder-merge.md +2 -2
  104. package/docs/recipes/ops-gotchas.md +10 -9
  105. package/docs/recipes/packaging-the-core.md +6 -6
  106. package/docs/recipes/parallel-goal-waves.md +4 -4
  107. package/docs/recipes/private-npm-distribution.md +9 -9
  108. package/docs/recipes/redteam-patrol.md +5 -5
  109. package/docs/recipes/render-pilot.md +2 -2
  110. package/docs/recipes/reranking-a-goals-board.md +2 -2
  111. package/docs/recipes/search-index-ingestion.md +5 -5
  112. package/docs/recipes/self-host.md +1 -1
  113. package/docs/recipes/ship-and-regrade.md +4 -4
  114. package/docs/recipes/staging-environment.md +1 -1
  115. package/docs/recipes/standalone-live-docs.md +1 -1
  116. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  117. package/docs/recipes/upgrading-the-core.md +11 -11
  118. package/docs/recipes/windows-builders.md +18 -18
  119. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  120. package/docs/research/task-network-map-readability.md +3 -3
  121. package/migrations/core_278_builder_tester_tag.sql +18 -0
  122. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  123. package/modules/agents/lib/answer-hold.js +1 -1
  124. package/modules/agents/lib/gate.js +1 -1
  125. package/modules/agents/lib/validate.js +1 -1
  126. package/modules/autonomy/gauge.js +1 -1
  127. package/modules/autonomy/governor-docket.js +2 -2
  128. package/modules/autonomy/pollers/routine-timers.js +3 -3
  129. package/modules/autonomy/routes/autonomy.js +3 -3
  130. package/modules/builder-settings/interaction-prefs.js +1 -1
  131. package/modules/builder-settings/render-prefs.js +1 -1
  132. package/modules/builder-settings/routes/settings.js +1 -1
  133. package/modules/builder-settings/skill-prefs.js +2 -2
  134. package/modules/builder-settings/wandering-prefs.js +2 -2
  135. package/modules/copy-desk/module.json +2 -2
  136. package/modules/copy-desk/page-data.js +5 -5
  137. package/modules/copy-desk/page-decisions.js +13 -1
  138. package/modules/copy-desk/proposals.js +4 -4
  139. package/modules/copy-desk/registry.js +2 -2
  140. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  141. package/modules/copy-desk/routes/copy-desk.js +3 -12
  142. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  143. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  144. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  145. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  146. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  147. package/modules/design-styles/skills/README.md +4 -4
  148. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  149. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  150. package/modules/discord/bug-attachments.js +1 -1
  151. package/modules/discord/ship-broadcast.js +1 -1
  152. package/modules/economy/achievements.js +49 -7
  153. package/modules/economy/cost-classify.js +6 -6
  154. package/modules/economy/cost-report.js +1 -1
  155. package/modules/economy/cost.js +1 -1
  156. package/modules/economy/credits.js +2 -1
  157. package/modules/economy/idea-size.js +2 -2
  158. package/modules/economy/reward.js +2 -0
  159. package/modules/economy/routes/cost.js +1 -1
  160. package/modules/economy/streak.js +43 -4
  161. package/modules/government/asks.js +1 -1
  162. package/modules/government/board.js +19 -2
  163. package/modules/government/catalog.js +3 -0
  164. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  165. package/modules/government/protected-surfaces.json +48 -47
  166. package/modules/government/recommendations.js +6 -2
  167. package/modules/government/routes/government.js +1 -1
  168. package/modules/grading/generated-provenance.js +13 -5
  169. package/modules/grading/grade-engine.js +1 -1
  170. package/modules/grading/grader-rubric.json +1 -1
  171. package/modules/grading/grader-score.js +1 -1
  172. package/modules/grading/grader-workers/index.js +1 -1
  173. package/modules/grading/grader.js +1 -1
  174. package/modules/grading/routes/grade.js +1 -1
  175. package/modules/hall-ui/public/atlas.html +5 -7
  176. package/modules/hall-ui/public/atlas.js +1 -1
  177. package/modules/hall-ui/public/atlas.states.json +1 -1
  178. package/modules/hall-ui/public/blockers.css +9 -0
  179. package/modules/hall-ui/public/blockers.html +6 -4
  180. package/modules/hall-ui/public/blockers.js +39 -27
  181. package/modules/hall-ui/public/board-room.css +5 -12
  182. package/modules/hall-ui/public/board-room.html +6 -6
  183. package/modules/hall-ui/public/board-room.js +41 -23
  184. package/modules/hall-ui/public/board-room.states.json +1 -1
  185. package/modules/hall-ui/public/brand-apply.js +1 -1
  186. package/modules/hall-ui/public/brand-holes.js +1 -1
  187. package/modules/hall-ui/public/builders.js +40 -86
  188. package/modules/hall-ui/public/city-decide.js +18 -4
  189. package/modules/hall-ui/public/city.html +1 -1
  190. package/modules/hall-ui/public/collab.html +1 -1
  191. package/modules/hall-ui/public/commands.html +6 -9
  192. package/modules/hall-ui/public/copy-desk.html +1 -1
  193. package/modules/hall-ui/public/copy-desk.js +2 -2
  194. package/modules/hall-ui/public/craft-mode.js +4 -0
  195. package/modules/hall-ui/public/deploy.html +6 -2
  196. package/modules/hall-ui/public/deploy.js +21 -13
  197. package/modules/hall-ui/public/diagrams.css +1 -1
  198. package/modules/hall-ui/public/diagrams.html +5 -8
  199. package/modules/hall-ui/public/diagrams.states.json +1 -1
  200. package/modules/hall-ui/public/drachmae.html +3 -7
  201. package/modules/hall-ui/public/fleet.html +3 -2
  202. package/modules/hall-ui/public/fleet.js +0 -4
  203. package/modules/hall-ui/public/gate.html +7 -7
  204. package/modules/hall-ui/public/gate.js +58 -77
  205. package/modules/hall-ui/public/goal-inbox.js +69 -86
  206. package/modules/hall-ui/public/goal-map.html +1 -1
  207. package/modules/hall-ui/public/goals-page.js +5 -5
  208. package/modules/hall-ui/public/goals-render.js +10 -11
  209. package/modules/hall-ui/public/goals.css +10 -0
  210. package/modules/hall-ui/public/goals.html +14 -7
  211. package/modules/hall-ui/public/government.html +3 -5
  212. package/modules/hall-ui/public/government.js +1 -5
  213. package/modules/hall-ui/public/hall-ask.css +57 -0
  214. package/modules/hall-ui/public/hall-ask.js +50 -0
  215. package/modules/hall-ui/public/hall-render.js +117 -57
  216. package/modules/hall-ui/public/hall-widgets.js +11 -11
  217. package/modules/hall-ui/public/idea.html +1 -1
  218. package/modules/hall-ui/public/ideas.html +3 -1
  219. package/modules/hall-ui/public/ideas.js +1 -0
  220. package/modules/hall-ui/public/index.html +15 -6
  221. package/modules/hall-ui/public/index.states.json +1 -1
  222. package/modules/hall-ui/public/mine-lens.js +1 -1
  223. package/modules/hall-ui/public/modules.html +7 -10
  224. package/modules/hall-ui/public/modules.js +0 -2
  225. package/modules/hall-ui/public/my-agents.html +1 -1
  226. package/modules/hall-ui/public/palette.js +5 -5
  227. package/modules/hall-ui/public/primer.html +4 -9
  228. package/modules/hall-ui/public/profile-connections.js +10 -2
  229. package/modules/hall-ui/public/profile-roles.js +3 -10
  230. package/modules/hall-ui/public/profile.html +12 -10
  231. package/modules/hall-ui/public/profile.js +13 -17
  232. package/modules/hall-ui/public/project-settings.html +3 -4
  233. package/modules/hall-ui/public/project-settings.js +0 -3
  234. package/modules/hall-ui/public/ranks.html +5 -11
  235. package/modules/hall-ui/public/ranks.js +6 -8
  236. package/modules/hall-ui/public/roadmap.css +0 -2
  237. package/modules/hall-ui/public/roadmap.html +1 -1
  238. package/modules/hall-ui/public/roadmap.js +16 -51
  239. package/modules/hall-ui/public/roster.html +1 -1
  240. package/modules/hall-ui/public/sessions.html +6 -8
  241. package/modules/hall-ui/public/sessions.js +7 -7
  242. package/modules/hall-ui/public/settings.html +1 -1
  243. package/modules/hall-ui/public/shell-trail.js +1 -1
  244. package/modules/hall-ui/public/shell.js +17 -17
  245. package/modules/hall-ui/public/street-deck.css +2 -1
  246. package/modules/hall-ui/public/street-deck.js +10 -2
  247. package/modules/hall-ui/public/street-desk.js +16 -5
  248. package/modules/hall-ui/public/street.html +1 -1
  249. package/modules/hall-ui/public/studio-lib.js +4 -0
  250. package/modules/hall-ui/public/studio.css +2 -0
  251. package/modules/hall-ui/public/studio.html +1 -1
  252. package/modules/hall-ui/public/studio.js +27 -1
  253. package/modules/hall-ui/public/style.css +43 -26
  254. package/modules/hall-ui/public/task-detail.js +10 -7
  255. package/modules/hall-ui/public/task.css +2 -0
  256. package/modules/hall-ui/public/task.html +3 -1
  257. package/modules/hall-ui/public/task.js +23 -7
  258. package/modules/hall-ui/public/thinking.html +1 -1
  259. package/modules/hall-ui/public/tweak-editor.html +1 -1
  260. package/modules/hall-ui/public/vote-control.js +208 -0
  261. package/modules/hall-ui/public/watch.html +3 -5
  262. package/modules/hall-ui/public/watch.js +5 -4
  263. package/modules/hall-ui/public/welcome-boot.css +130 -0
  264. package/modules/hall-ui/public/welcome-boot.js +334 -0
  265. package/modules/hall-ui/public/welcome-day.webp +0 -0
  266. package/modules/hall-ui/public/welcome-night.webp +0 -0
  267. package/modules/hall-ui/public/work-summary.js +1 -1
  268. package/modules/hall-ui/public/work.css +1 -0
  269. package/modules/hall-ui/public/work.html +3 -1
  270. package/modules/hall-ui/public/work.js +2 -1
  271. package/modules/hall-ui/records/accomplishments.md +16 -0
  272. package/modules/hall-ui/records/hall-ask-card.md +33 -0
  273. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  274. package/modules/hall-ui/records/oversight-family.md +1 -1
  275. package/modules/hall-ui/records/profile-connections.md +2 -0
  276. package/modules/hall-ui/records/profile-roles.md +1 -1
  277. package/modules/hall-ui/records/reading-rooms.md +1 -1
  278. package/modules/hall-ui/records/welcome-tower.md +50 -0
  279. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  280. package/modules/ideas/projection.js +1 -1
  281. package/modules/ideas/routes/blockers.js +3 -3
  282. package/modules/ideas/routes/inbox.js +29 -1
  283. package/modules/ideas/routes/ratify-goal.js +1 -1
  284. package/modules/ideas/routing.js +1 -1
  285. package/modules/ideas/templates.js +1 -1
  286. package/modules/ideas/trail-descent.js +1 -1
  287. package/modules/ideas/trail-size.js +1 -1
  288. package/modules/ideas/votes.js +93 -0
  289. package/modules/lifecycle/abandon-leftovers.js +1 -1
  290. package/modules/lifecycle/cascade.js +1 -1
  291. package/modules/lifecycle/conflict-resolve.js +13 -21
  292. package/modules/lifecycle/criterion-ref.js +1 -1
  293. package/modules/lifecycle/db-analytics.js +57 -4
  294. package/modules/lifecycle/db-deps-criteria.js +1 -1
  295. package/modules/lifecycle/db-ship.js +2 -2
  296. package/modules/lifecycle/db-tasks.js +2 -2
  297. package/modules/lifecycle/db-versions.js +1 -1
  298. package/modules/lifecycle/db.js +2 -0
  299. package/modules/lifecycle/dead-deps.js +3 -3
  300. package/modules/lifecycle/dependency-advisory.js +3 -3
  301. package/modules/lifecycle/goal-category.js +1 -1
  302. package/modules/lifecycle/goal-forest.js +1 -1
  303. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  304. package/modules/lifecycle/kickoff-checklist.js +1 -1
  305. package/modules/lifecycle/kickoff-seed.js +1 -1
  306. package/modules/lifecycle/lifecycle.js +2 -0
  307. package/modules/lifecycle/merge-reach.js +29 -15
  308. package/modules/lifecycle/missing-dep-classify.js +3 -3
  309. package/modules/lifecycle/module.json +2 -1
  310. package/modules/lifecycle/page-tweak-approve.js +85 -1
  311. package/modules/lifecycle/page-tweak-hold.js +1 -1
  312. package/modules/lifecycle/publish-reconciler.js +1 -2
  313. package/modules/lifecycle/rot.js +1 -1
  314. package/modules/lifecycle/routes/artist-gate.js +1 -1
  315. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  316. package/modules/lifecycle/routes/goals.js +1 -1
  317. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  318. package/modules/lifecycle/routes/task-votes.js +54 -0
  319. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  320. package/modules/lifecycle/routes/tasks.js +2 -2
  321. package/modules/lifecycle/routes/versions.js +2 -2
  322. package/modules/lifecycle/ship-card.js +4 -4
  323. package/modules/lifecycle/ship-preflight.js +1 -1
  324. package/modules/lifecycle/task-classifier.js +1 -1
  325. package/modules/lifecycle/task-status.js +1 -1
  326. package/modules/lifecycle/task-visual-db.js +1 -1
  327. package/modules/memory/learnings.js +1 -1
  328. package/modules/memory/pollers/search-index.js +2 -2
  329. package/modules/memory/routes/learnings.js +1 -1
  330. package/modules/memory/routes/memory.js +1 -1
  331. package/modules/memory/search.js +2 -2
  332. package/modules/npm-release/release.js +1 -1
  333. package/modules/onboarding/howto-moments.js +1 -1
  334. package/modules/onboarding/newcomer-restock.js +3 -3
  335. package/modules/onboarding/onboarding.js +1 -1
  336. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  337. package/modules/platform-identity/origin-containment.js +1 -1
  338. package/modules/platform-identity/publish-gate.js +1 -1
  339. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  340. package/modules/provisioning/capacity.js +1 -1
  341. package/modules/provisioning/core-upgrade.js +15 -9
  342. package/modules/provisioning/credential-preflight.js +3 -3
  343. package/modules/provisioning/disconnect.js +1 -1
  344. package/modules/provisioning/dns-resolves.js +1 -1
  345. package/modules/provisioning/module.json +1 -1
  346. package/modules/provisioning/onboard-plan.js +1 -1
  347. package/modules/provisioning/paid-shape-gate.js +2 -2
  348. package/modules/provisioning/planet-physics.js +11 -2
  349. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  350. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  351. package/modules/provisioning/provisioning.js +2 -2
  352. package/modules/provisioning/render-lookup.js +1 -1
  353. package/modules/provisioning/render-standup.js +3 -3
  354. package/modules/provisioning/repo-private.js +1 -1
  355. package/modules/provisioning/routes/callback-page.js +1 -1
  356. package/modules/provisioning/routes/core-upgrade.js +23 -3
  357. package/modules/provisioning/routes/provisioning.js +2 -2
  358. package/modules/provisioning/routes/render-standup.js +1 -1
  359. package/modules/provisioning/routes/repo-private.js +1 -1
  360. package/modules/provisioning/soft-limits.js +1 -1
  361. package/modules/provisioning/starter-bundles.js +4 -2
  362. package/modules/provisioning/tests/provisioning.mjs +1 -1
  363. package/modules/public-landing/public/account.html +4 -6
  364. package/modules/public-landing/public/assets/cosmos.css +13 -6
  365. package/modules/public-landing/public/connections.html +4 -6
  366. package/modules/public-landing/public/contact.html +4 -6
  367. package/modules/public-landing/public/guild.html +4 -6
  368. package/modules/public-landing/public/index.html +11 -9
  369. package/modules/public-landing/public/invitations.html +4 -6
  370. package/modules/public-landing/public/privacy.html +4 -6
  371. package/modules/public-landing/public/projects.html +168 -46
  372. package/modules/public-landing/public/terms.html +4 -6
  373. package/modules/raise/content/copy.json +40 -0
  374. package/modules/raise/content/nda.html +39 -0
  375. package/modules/raise/content/settings.json +49 -0
  376. package/modules/raise/db.js +95 -0
  377. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  378. package/modules/raise/module.json +28 -0
  379. package/modules/raise/page.js +194 -0
  380. package/modules/raise/public/edit.js +152 -0
  381. package/modules/raise/public/favicon.svg +1 -0
  382. package/modules/raise/public/logo-ink.svg +1 -0
  383. package/modules/raise/public/logo-night.svg +1 -0
  384. package/modules/raise/public/mode.js +8 -0
  385. package/modules/raise/public/raise.css +234 -0
  386. package/modules/raise/public/raise.js +91 -0
  387. package/modules/raise/raise.js +174 -0
  388. package/modules/raise/routes/raise.js +152 -0
  389. package/modules/raise/views/gate.html +39 -0
  390. package/modules/raise/views/nda.html +21 -0
  391. package/modules/raise/views/page.html +133 -0
  392. package/modules/raise/web.js +72 -0
  393. package/modules/render-deploy/deploys.js +1 -1
  394. package/modules/render-deploy/render.js +2 -2
  395. package/modules/security/secret-scrub.js +3 -3
  396. package/modules/security/security.js +1 -1
  397. package/modules/security/tests/artifact_scan.mjs +1 -1
  398. package/modules/security/tests/mirror.mjs +1 -1
  399. package/modules/security/tests/scan_store.mjs +1 -1
  400. package/modules/sessions/db.js +2 -2
  401. package/modules/sessions/pulse.js +2 -2
  402. package/modules/sessions/routes/sessions.js +1 -1
  403. package/modules/specialities/specialities.js +1 -1
  404. package/modules/status-ui/public/README.md +3 -4
  405. package/modules/status-ui/public/index.html +5 -31
  406. package/modules/status-ui/public/status.js +6 -174
  407. package/modules/status-ui/public/style.css +4 -133
  408. package/modules/ui-design/docs/design-contract.md +3 -3
  409. package/modules/ui-design/kit/README.md +1 -1
  410. package/modules/ui-design/kit/serve.js +13 -4
  411. package/modules/ui-design/scripts/design-sync.js +1 -1
  412. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  413. package/modules/ui-design/scripts/validate-design.js +1 -1
  414. package/package-lock.json +27 -11
  415. package/package.json +2 -3
  416. package/release-notes.json +178 -0
  417. package/scripts/bongos/CLAUDE.md +15 -0
  418. package/scripts/bongos/abandon.js +137 -0
  419. package/scripts/bongos/accessibility-replay.js +195 -0
  420. package/scripts/bongos/address-park-sweep.sh +91 -0
  421. package/scripts/bongos/adopt-detect.js +123 -0
  422. package/scripts/bongos/adopt-import.js +111 -0
  423. package/scripts/bongos/adopt-preflight.js +187 -0
  424. package/scripts/bongos/adr-namespace.js +273 -0
  425. package/scripts/bongos/agent-invoke.js +689 -0
  426. package/scripts/bongos/agents-sync.js +502 -0
  427. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  428. package/scripts/bongos/api-artifacts.js +91 -0
  429. package/scripts/bongos/api.js +86 -0
  430. package/scripts/bongos/api.ps1 +26 -0
  431. package/scripts/bongos/architect-audit.js +294 -0
  432. package/scripts/bongos/artifact-audit.js +326 -0
  433. package/scripts/bongos/artifact-format.js +203 -0
  434. package/scripts/bongos/artifact-staleness.js +267 -0
  435. package/scripts/bongos/ask.js +231 -0
  436. package/scripts/bongos/audit-authorship.sh +329 -0
  437. package/scripts/bongos/audit-deps.js +189 -0
  438. package/scripts/bongos/audit-gate.js +121 -0
  439. package/scripts/bongos/audit-rank-roles.js +172 -0
  440. package/scripts/bongos/audit-replay.sh +205 -0
  441. package/scripts/bongos/autobongos-digest.js +123 -0
  442. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  443. package/scripts/bongos/autobongos-loop.js +210 -0
  444. package/scripts/bongos/autobongos-run.js +1361 -0
  445. package/scripts/bongos/autobongos-service.cmd +50 -0
  446. package/scripts/bongos/autobongos-service.ps1 +270 -0
  447. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  448. package/scripts/bongos/autobongos-verify.js +618 -0
  449. package/scripts/bongos/autonomy-gate.js +135 -0
  450. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  451. package/scripts/bongos/autonomy-gauge.js +84 -0
  452. package/scripts/bongos/backfill-cost.js +176 -0
  453. package/scripts/bongos/backfill-disciplines.js +144 -0
  454. package/scripts/bongos/backfill-session-earnings.js +123 -0
  455. package/scripts/bongos/backfill-session-types.js +87 -0
  456. package/scripts/bongos/backfill-sessions.js +411 -0
  457. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  458. package/scripts/bongos/backfill-task-rewards.js +413 -0
  459. package/scripts/bongos/backlog-review.js +399 -0
  460. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  461. package/scripts/bongos/backup.js +116 -0
  462. package/scripts/bongos/baseline-staleness.js +217 -0
  463. package/scripts/bongos/bfg-principal-token.js +65 -0
  464. package/scripts/bongos/bug-attachment-audit.js +149 -0
  465. package/scripts/bongos/bug-attachment-recover.js +198 -0
  466. package/scripts/bongos/bug-triage.js +292 -0
  467. package/scripts/bongos/build-bongos.js +94 -0
  468. package/scripts/bongos/bump-version.js +221 -0
  469. package/scripts/bongos/capture.js +481 -0
  470. package/scripts/bongos/category-advisory-guard.js +206 -0
  471. package/scripts/bongos/ci-grade.js +82 -0
  472. package/scripts/bongos/claim-recall.js +112 -0
  473. package/scripts/bongos/claim.js +789 -0
  474. package/scripts/bongos/classify-discipline.js +153 -0
  475. package/scripts/bongos/claude-materialize.js +1200 -0
  476. package/scripts/bongos/claude-md-template.js +142 -0
  477. package/scripts/bongos/cleanup-orphans.js +74 -0
  478. package/scripts/bongos/cli-lib.js +1226 -0
  479. package/scripts/bongos/client-baseurl-guard.js +116 -0
  480. package/scripts/bongos/codemod-rename-scripts-gds.js +381 -0
  481. package/scripts/bongos/codemod-rename-src-gds.js +145 -0
  482. package/scripts/bongos/conductor-dispatch.js +535 -0
  483. package/scripts/bongos/context-pack.js +326 -0
  484. package/scripts/bongos/control-manifest.js +199 -0
  485. package/scripts/bongos/copy-apply.js +758 -0
  486. package/scripts/bongos/copy-inventory.js +571 -0
  487. package/scripts/bongos/core-origin-follow.js +185 -0
  488. package/scripts/bongos/core-pin-sync.js +260 -0
  489. package/scripts/bongos/coreB-carve-proof.sh +725 -0
  490. package/scripts/bongos/cost-report.js +63 -0
  491. package/scripts/bongos/cost.js +47 -0
  492. package/scripts/bongos/credential-presence.js +296 -0
  493. package/scripts/bongos/cutover-codemod.js +240 -0
  494. package/scripts/bongos/db-backup-nightly.sh +232 -0
  495. package/scripts/bongos/db-backup-offsite.sh +267 -0
  496. package/scripts/bongos/demote.js +45 -0
  497. package/scripts/bongos/deploy-divergence.js +454 -0
  498. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  499. package/scripts/bongos/design-sync.js +12 -0
  500. package/scripts/bongos/dev-box-guard.js +166 -0
  501. package/scripts/bongos/dev-lib.js +722 -0
  502. package/scripts/bongos/dev.js +645 -0
  503. package/scripts/bongos/device-flow-help.js +72 -0
  504. package/scripts/bongos/diagnose-achievements.js +118 -0
  505. package/scripts/bongos/diagram-facts.js +355 -0
  506. package/scripts/bongos/discord-channels.js +77 -0
  507. package/scripts/bongos/do-api.js +109 -0
  508. package/scripts/bongos/doc-cli-guard.js +274 -0
  509. package/scripts/bongos/doc-comment-coverage.js +139 -0
  510. package/scripts/bongos/doc-control-claims.js +170 -0
  511. package/scripts/bongos/docs-entropy.js +453 -0
  512. package/scripts/bongos/doctor.js +493 -0
  513. package/scripts/bongos/enroll-control-plane.js +101 -0
  514. package/scripts/bongos/exec-path-guard.js +564 -0
  515. package/scripts/bongos/feedback-send.js +249 -0
  516. package/scripts/bongos/fetch-art-key.js +106 -0
  517. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  518. package/scripts/bongos/figma-design-sync.js +11 -0
  519. package/scripts/bongos/find-untested.js +371 -0
  520. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  521. package/scripts/bongos/fitness-checks-identity.js +343 -0
  522. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  523. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  524. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  525. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  526. package/scripts/bongos/fitness-lib.js +127 -0
  527. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  528. package/scripts/bongos/fitness-ratchets.js +594 -0
  529. package/scripts/bongos/fitness.js +1498 -0
  530. package/scripts/bongos/forwarder.js +80 -0
  531. package/scripts/bongos/gate-review.js +330 -0
  532. package/scripts/bongos/gating.js +348 -0
  533. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  534. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  535. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  537. package/scripts/bongos/gds-literal-scan.js +196 -0
  538. package/scripts/bongos/gen-api-client.js +576 -0
  539. package/scripts/bongos/gen-api-docs.js +1111 -0
  540. package/scripts/bongos/gen-atlas.js +366 -0
  541. package/scripts/bongos/gen-diagrams.js +608 -0
  542. package/scripts/bongos/gen-file-map.js +337 -0
  543. package/scripts/bongos/gen-freshness.js +32 -0
  544. package/scripts/bongos/gen-interaction-posture.js +122 -0
  545. package/scripts/bongos/gen-repo-map.js +540 -0
  546. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  547. package/scripts/bongos/gen-session-index.js +243 -0
  548. package/scripts/bongos/gen-sounds.js +176 -0
  549. package/scripts/bongos/git-merge-regen.js +254 -0
  550. package/scripts/bongos/go-live.js +1071 -0
  551. package/scripts/bongos/goal-names.js +102 -0
  552. package/scripts/bongos/goal.js +272 -0
  553. package/scripts/bongos/government-walk.js +1477 -0
  554. package/scripts/bongos/grade-correlation-audit.js +310 -0
  555. package/scripts/bongos/grade-replay.js +237 -0
  556. package/scripts/bongos/grade-smoke.js +205 -0
  557. package/scripts/bongos/home-isolation-guard.js +126 -0
  558. package/scripts/bongos/hooks/pre-push.js +211 -0
  559. package/scripts/bongos/howto.js +145 -0
  560. package/scripts/bongos/http-api-client.js +81 -0
  561. package/scripts/bongos/identity-strip.js +75 -0
  562. package/scripts/bongos/init.js +1159 -0
  563. package/scripts/bongos/install-git-hooks.js +200 -0
  564. package/scripts/bongos/instance-apex.js +38 -0
  565. package/scripts/bongos/intent-retry.js +52 -0
  566. package/scripts/bongos/key-card.js +222 -0
  567. package/scripts/bongos/key-status.js +126 -0
  568. package/scripts/bongos/land-watch.js +201 -0
  569. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  570. package/scripts/bongos/learning-capture.js +145 -0
  571. package/scripts/bongos/lib.sh +74 -0
  572. package/scripts/bongos/linkify-refs.js +655 -0
  573. package/scripts/bongos/lint-infra-exec.js +70 -0
  574. package/scripts/bongos/lint-migrations.js +102 -0
  575. package/scripts/bongos/lint-workflow-exec.js +63 -0
  576. package/scripts/bongos/local-preview-lib.js +128 -0
  577. package/scripts/bongos/local-preview.js +82 -0
  578. package/scripts/bongos/login.js +360 -0
  579. package/scripts/bongos/main-audit.js +625 -0
  580. package/scripts/bongos/me.js +97 -0
  581. package/scripts/bongos/memory-map.js +176 -0
  582. package/scripts/bongos/merge-lock.js +71 -0
  583. package/scripts/bongos/migration-namespace.js +313 -0
  584. package/scripts/bongos/mirror-lineage-check.js +343 -0
  585. package/scripts/bongos/mirror-redact.js +350 -0
  586. package/scripts/bongos/module-artifact.js +289 -0
  587. package/scripts/bongos/module-assess-docs.js +238 -0
  588. package/scripts/bongos/module-assess-installs.js +228 -0
  589. package/scripts/bongos/module-assess-score.js +111 -0
  590. package/scripts/bongos/module-assess-security.js +252 -0
  591. package/scripts/bongos/module-assess-tests.js +278 -0
  592. package/scripts/bongos/module-assess-version.js +92 -0
  593. package/scripts/bongos/module-error-report.js +148 -0
  594. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  595. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  596. package/scripts/bongos/module-test-runner.js +414 -0
  597. package/scripts/bongos/module.js +1376 -0
  598. package/scripts/bongos/move-escalation.js +141 -0
  599. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  600. package/scripts/bongos/newcomer-floor.js +421 -0
  601. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  602. package/scripts/bongos/newcomer-floor.test.js +235 -0
  603. package/scripts/bongos/next-number.js +163 -0
  604. package/scripts/bongos/oauth-secret.js +202 -0
  605. package/scripts/bongos/onboard.js +267 -0
  606. package/scripts/bongos/onboarding-analyze.js +226 -0
  607. package/scripts/bongos/onboarding-config.js +179 -0
  608. package/scripts/bongos/onboarding-ship.js +92 -0
  609. package/scripts/bongos/pack-env-prefix.js +73 -0
  610. package/scripts/bongos/package-core.js +1200 -0
  611. package/scripts/bongos/page-inventory.js +348 -0
  612. package/scripts/bongos/page-reader.js +722 -0
  613. package/scripts/bongos/paste-token.js +212 -0
  614. package/scripts/bongos/plain-cards.js +351 -0
  615. package/scripts/bongos/portability-smoke-art.sh +85 -0
  616. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  617. package/scripts/bongos/preflight.js +214 -0
  618. package/scripts/bongos/probe-cache.js +246 -0
  619. package/scripts/bongos/prove-strict-versioning.js +284 -0
  620. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  621. package/scripts/bongos/provision-byo-host.js +68 -0
  622. package/scripts/bongos/provision-capacity.js +79 -0
  623. package/scripts/bongos/provision-caps.js +63 -0
  624. package/scripts/bongos/provision-config.js +233 -0
  625. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  626. package/scripts/bongos/provision-disconnect.js +88 -0
  627. package/scripts/bongos/provision-github-setup.js +168 -0
  628. package/scripts/bongos/provision-net.js +357 -0
  629. package/scripts/bongos/provision-pin-key.js +176 -0
  630. package/scripts/bongos/provision-pin-replay.js +126 -0
  631. package/scripts/bongos/provision-process.js +170 -0
  632. package/scripts/bongos/provision-render.js +201 -0
  633. package/scripts/bongos/provision-repo-auth.js +164 -0
  634. package/scripts/bongos/provision-repo-private.js +98 -0
  635. package/scripts/bongos/provision-repo.js +1337 -0
  636. package/scripts/bongos/provision-teardown.js +106 -0
  637. package/scripts/bongos/provision-units.js +469 -0
  638. package/scripts/bongos/provision.js +1479 -0
  639. package/scripts/bongos/publish-credential-check.js +66 -0
  640. package/scripts/bongos/publish-integration-gate.js +142 -0
  641. package/scripts/bongos/publish-manifest.js +440 -0
  642. package/scripts/bongos/publish-watch.js +268 -0
  643. package/scripts/bongos/pulse.js +336 -0
  644. package/scripts/bongos/push-main.js +56 -0
  645. package/scripts/bongos/push-path-brief.js +100 -0
  646. package/scripts/bongos/read-session-export.js +359 -0
  647. package/scripts/bongos/reauth.js +155 -0
  648. package/scripts/bongos/recall.js +183 -0
  649. package/scripts/bongos/redteam-patrol.js +437 -0
  650. package/scripts/bongos/regen-instance-docs.js +47 -0
  651. package/scripts/bongos/release-core.js +80 -0
  652. package/scripts/bongos/release-notes.js +271 -0
  653. package/scripts/bongos/release.js +139 -0
  654. package/scripts/bongos/rename-goals.js +109 -0
  655. package/scripts/bongos/rename-history-check.js +369 -0
  656. package/scripts/bongos/rename-ledger-prose.js +482 -0
  657. package/scripts/bongos/render-api.js +197 -0
  658. package/scripts/bongos/render-check.js +206 -0
  659. package/scripts/bongos/render-ideas.js +226 -0
  660. package/scripts/bongos/render-payload.js +85 -0
  661. package/scripts/bongos/repo-metrics.js +363 -0
  662. package/scripts/bongos/review-sheet.js +108 -0
  663. package/scripts/bongos/role-pack-guard.js +142 -0
  664. package/scripts/bongos/route-shadow-guard.js +175 -0
  665. package/scripts/bongos/routine-schedule.js +283 -0
  666. package/scripts/bongos/run-routine.js +257 -0
  667. package/scripts/bongos/run-unit-tests.js +654 -0
  668. package/scripts/bongos/runner-drift.js +151 -0
  669. package/scripts/bongos/sandbox-stage.js +459 -0
  670. package/scripts/bongos/scope-map-guard.js +300 -0
  671. package/scripts/bongos/scope-roster-guard.js +118 -0
  672. package/scripts/bongos/seam-wiring-guard.js +275 -0
  673. package/scripts/bongos/search-ingest-db.js +288 -0
  674. package/scripts/bongos/search-ingest-md.js +269 -0
  675. package/scripts/bongos/seed-adopt-tasks.js +75 -0
  676. package/scripts/bongos/seed-api-contract-goal-tasks.js +141 -0
  677. package/scripts/bongos/seed-board-room-tasks.js +196 -0
  678. package/scripts/bongos/seed-bongos-app-tasks.js +294 -0
  679. package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +81 -0
  680. package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +100 -0
  681. package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +307 -0
  682. package/scripts/bongos/seed-bongos-module-system-tasks.js +346 -0
  683. package/scripts/bongos/seed-bongos-tasks.js +214 -0
  684. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  685. package/scripts/bongos/seed-bongos-v1-seo-tasks.js +104 -0
  686. package/scripts/bongos/seed-bv1-community-tasks.js +131 -0
  687. package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +133 -0
  688. package/scripts/bongos/seed-bv1-profile-page-tasks.js +161 -0
  689. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  690. package/scripts/bongos/seed-bv1-r01-delta-tasks.js +154 -0
  691. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  692. package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +277 -0
  693. package/scripts/bongos/seed-gds-v4-tasks.js +624 -0
  694. package/scripts/bongos/seed-governance-tasks.js +340 -0
  695. package/scripts/bongos/seed-medusa-tasks.js +440 -0
  696. package/scripts/bongos/seed-module-upstreaming.js +219 -0
  697. package/scripts/bongos/seed-productization-tasks.js +235 -0
  698. package/scripts/bongos/seed-project-admin-console-tasks.js +88 -0
  699. package/scripts/bongos/seed-provisioning-tasks.js +83 -0
  700. package/scripts/bongos/seed-staging.sh +117 -0
  701. package/scripts/bongos/seed-strict-versioning-tasks.js +275 -0
  702. package/scripts/bongos/seed-v2-world-tasks.js +283 -0
  703. package/scripts/bongos/seed-verify-criteria.js +124 -0
  704. package/scripts/bongos/sequence.js +597 -0
  705. package/scripts/bongos/session-cost.js +430 -0
  706. package/scripts/bongos/session-digest-build.js +293 -0
  707. package/scripts/bongos/session-digest.js +200 -0
  708. package/scripts/bongos/session-eval.js +631 -0
  709. package/scripts/bongos/session-transcript-build.js +155 -0
  710. package/scripts/bongos/session-transcript-upload.js +29 -0
  711. package/scripts/bongos/session.js +404 -0
  712. package/scripts/bongos/setup.js +646 -0
  713. package/scripts/bongos/ship-check.js +89 -0
  714. package/scripts/bongos/ship-deploy-target.js +393 -0
  715. package/scripts/bongos/ship-escalation.js +167 -0
  716. package/scripts/bongos/ship-finish.js +420 -0
  717. package/scripts/bongos/ship-flow.js +1217 -0
  718. package/scripts/bongos/ship-git.js +100 -0
  719. package/scripts/bongos/ship-grade-steps.js +547 -0
  720. package/scripts/bongos/ship-grade.js +426 -0
  721. package/scripts/bongos/ship-honesty.js +314 -0
  722. package/scripts/bongos/ship-io.js +139 -0
  723. package/scripts/bongos/ship-land.js +1130 -0
  724. package/scripts/bongos/ship-memory-sync.js +249 -0
  725. package/scripts/bongos/ship-merge-gate.js +225 -0
  726. package/scripts/bongos/ship-merge.js +466 -0
  727. package/scripts/bongos/ship-mode-ask.js +138 -0
  728. package/scripts/bongos/ship-mode-manual.js +54 -0
  729. package/scripts/bongos/ship-preflight-steps.js +399 -0
  730. package/scripts/bongos/ship-regen.js +292 -0
  731. package/scripts/bongos/ship-resume.js +201 -0
  732. package/scripts/bongos/ship-session-upload.js +313 -0
  733. package/scripts/bongos/ship-state.js +110 -0
  734. package/scripts/bongos/ship-surprise.js +84 -0
  735. package/scripts/bongos/ship-visual.js +75 -0
  736. package/scripts/bongos/ship.js +382 -0
  737. package/scripts/bongos/shipping-mode.js +71 -0
  738. package/scripts/bongos/skill-lint.js +250 -0
  739. package/scripts/bongos/skill-preflight.js +361 -0
  740. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  741. package/scripts/bongos/smoke-batch-release.sh +316 -0
  742. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  743. package/scripts/bongos/smoke-dependencies.sh +143 -0
  744. package/scripts/bongos/smoke-gds.js +256 -0
  745. package/scripts/bongos/smoke-write.sh +275 -0
  746. package/scripts/bongos/source-text-test-scan.js +106 -0
  747. package/scripts/bongos/spark.js +294 -0
  748. package/scripts/bongos/stale-worktrees.js +212 -0
  749. package/scripts/bongos/start-goals.js +102 -0
  750. package/scripts/bongos/start.js +1090 -0
  751. package/scripts/bongos/status.js +545 -0
  752. package/scripts/bongos/strand-watch.js +315 -0
  753. package/scripts/bongos/stranded-rows.js +200 -0
  754. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  755. package/scripts/bongos/surface.js +101 -0
  756. package/scripts/bongos/task.js +273 -0
  757. package/scripts/bongos/test-path-guard.js +99 -0
  758. package/scripts/bongos/triage.js +742 -0
  759. package/scripts/bongos/turn-end-sound.js +74 -0
  760. package/scripts/bongos/tweak-halt.js +70 -0
  761. package/scripts/bongos/tweak-renders.js +200 -0
  762. package/scripts/bongos/uat.js +120 -0
  763. package/scripts/bongos/ui-kit-transform.js +43 -0
  764. package/scripts/bongos/update-channel.js +512 -0
  765. package/scripts/bongos/update-sweep.js +829 -0
  766. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  767. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  768. package/scripts/bongos/upgrade-migrate.js +224 -0
  769. package/scripts/bongos/upgrade-operator.js +73 -0
  770. package/scripts/bongos/upgrade-outcome.js +174 -0
  771. package/scripts/bongos/upgrade.js +1499 -0
  772. package/scripts/bongos/validate-design.js +12 -0
  773. package/scripts/bongos/version-close.js +621 -0
  774. package/scripts/bongos/version-literal-guard.js +140 -0
  775. package/scripts/bongos/version-select.js +79 -0
  776. package/scripts/bongos/visual-review-nudge.js +39 -0
  777. package/scripts/bongos/wedge-remedy.js +174 -0
  778. package/scripts/bongos/worktree-claim-guard.js +130 -0
  779. package/scripts/bongos/worktree.js +449 -0
  780. package/scripts/discord/post.js +1 -1
  781. package/scripts/gds/README.md +9 -0
  782. package/scripts/gds/abandon.js +6 -136
  783. package/scripts/gds/accessibility-replay.js +5 -194
  784. package/scripts/gds/address-park-sweep.sh +7 -90
  785. package/scripts/gds/adopt-detect.js +5 -121
  786. package/scripts/gds/adopt-import.js +5 -109
  787. package/scripts/gds/adopt-preflight.js +5 -185
  788. package/scripts/gds/adr-namespace.js +5 -271
  789. package/scripts/gds/agent-invoke.js +5 -687
  790. package/scripts/gds/agents-sync.js +5 -500
  791. package/scripts/gds/api-alias-caller-scan.js +5 -255
  792. package/scripts/gds/api-artifacts.js +6 -0
  793. package/scripts/gds/api.js +6 -85
  794. package/scripts/gds/api.ps1 +8 -26
  795. package/scripts/gds/architect-audit.js +6 -293
  796. package/scripts/gds/artifact-audit.js +5 -324
  797. package/scripts/gds/artifact-format.js +6 -203
  798. package/scripts/gds/artifact-staleness.js +5 -265
  799. package/scripts/gds/ask.js +5 -229
  800. package/scripts/gds/audit-authorship.sh +7 -328
  801. package/scripts/gds/audit-deps.js +6 -188
  802. package/scripts/gds/audit-gate.js +5 -119
  803. package/scripts/gds/audit-rank-roles.js +6 -171
  804. package/scripts/gds/audit-replay.sh +7 -204
  805. package/scripts/gds/autobongos-digest.js +5 -121
  806. package/scripts/gds/autobongos-grade-cap.js +5 -186
  807. package/scripts/gds/autobongos-loop.js +5 -208
  808. package/scripts/gds/autobongos-run.js +5 -1359
  809. package/scripts/gds/autobongos-service.cmd +8 -49
  810. package/scripts/gds/autobongos-service.ps1 +8 -270
  811. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  812. package/scripts/gds/autobongos-verify.js +5 -616
  813. package/scripts/gds/autonomy-gate.js +5 -133
  814. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  815. package/scripts/gds/autonomy-gauge.js +5 -82
  816. package/scripts/gds/backfill-cost.js +6 -175
  817. package/scripts/gds/backfill-disciplines.js +5 -142
  818. package/scripts/gds/backfill-session-earnings.js +5 -121
  819. package/scripts/gds/backfill-session-types.js +5 -85
  820. package/scripts/gds/backfill-sessions.js +5 -409
  821. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  822. package/scripts/gds/backfill-task-rewards.js +5 -411
  823. package/scripts/gds/backlog-review.js +6 -398
  824. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  825. package/scripts/gds/backup.js +6 -115
  826. package/scripts/gds/baseline-staleness.js +5 -215
  827. package/scripts/gds/bfg-principal-token.js +6 -64
  828. package/scripts/gds/bug-attachment-audit.js +5 -147
  829. package/scripts/gds/bug-attachment-recover.js +5 -196
  830. package/scripts/gds/bug-triage.js +6 -291
  831. package/scripts/gds/build-bongos.js +5 -92
  832. package/scripts/gds/bump-version.js +5 -219
  833. package/scripts/gds/capture.js +6 -480
  834. package/scripts/gds/category-advisory-guard.js +5 -205
  835. package/scripts/gds/ci-grade.js +6 -81
  836. package/scripts/gds/claim-recall.js +6 -111
  837. package/scripts/gds/claim.js +6 -788
  838. package/scripts/gds/classify-discipline.js +6 -152
  839. package/scripts/gds/claude-materialize.js +5 -1198
  840. package/scripts/gds/claude-md-template.js +5 -140
  841. package/scripts/gds/cleanup-orphans.js +6 -73
  842. package/scripts/gds/cli-lib.js +6 -1204
  843. package/scripts/gds/client-baseurl-guard.js +5 -114
  844. package/scripts/gds/codemod-rename-src-gds.js +6 -144
  845. package/scripts/gds/conductor-dispatch.js +6 -534
  846. package/scripts/gds/context-pack.js +6 -325
  847. package/scripts/gds/control-manifest.js +5 -197
  848. package/scripts/gds/copy-apply.js +5 -756
  849. package/scripts/gds/copy-inventory.js +5 -569
  850. package/scripts/gds/core-origin-follow.js +5 -184
  851. package/scripts/gds/core-pin-sync.js +5 -258
  852. package/scripts/gds/coreB-carve-proof.sh +7 -724
  853. package/scripts/gds/cost-report.js +6 -62
  854. package/scripts/gds/cost.js +6 -46
  855. package/scripts/gds/credential-presence.js +5 -294
  856. package/scripts/gds/cutover-codemod.js +5 -239
  857. package/scripts/gds/db-backup-nightly.sh +7 -231
  858. package/scripts/gds/db-backup-offsite.sh +7 -266
  859. package/scripts/gds/demote.js +6 -44
  860. package/scripts/gds/deploy-divergence.js +6 -445
  861. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  862. package/scripts/gds/design-sync.js +5 -10
  863. package/scripts/gds/dev-box-guard.js +5 -164
  864. package/scripts/gds/dev-lib.js +5 -721
  865. package/scripts/gds/dev.js +5 -643
  866. package/scripts/gds/device-flow-help.js +5 -70
  867. package/scripts/gds/diagnose-achievements.js +5 -116
  868. package/scripts/gds/diagram-facts.js +6 -355
  869. package/scripts/gds/discord-channels.js +5 -75
  870. package/scripts/gds/do-api.js +6 -109
  871. package/scripts/gds/doc-cli-guard.js +5 -266
  872. package/scripts/gds/doc-comment-coverage.js +5 -137
  873. package/scripts/gds/doc-control-claims.js +5 -166
  874. package/scripts/gds/docs-entropy.js +5 -443
  875. package/scripts/gds/doctor.js +6 -492
  876. package/scripts/gds/enroll-control-plane.js +5 -99
  877. package/scripts/gds/exec-path-guard.js +5 -562
  878. package/scripts/gds/feedback-send.js +5 -247
  879. package/scripts/gds/fetch-art-key.js +5 -104
  880. package/scripts/gds/fetch-sound-prefs.js +5 -124
  881. package/scripts/gds/figma-design-sync.js +5 -9
  882. package/scripts/gds/find-untested.js +5 -369
  883. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  884. package/scripts/gds/fitness-checks-identity.js +5 -342
  885. package/scripts/gds/fitness-checks-packaging.js +5 -131
  886. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  887. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  888. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  889. package/scripts/gds/fitness-lib.js +5 -126
  890. package/scripts/gds/fitness-migration-contraction.js +5 -49
  891. package/scripts/gds/fitness-ratchets.js +5 -563
  892. package/scripts/gds/fitness.js +5 -1493
  893. package/scripts/gds/gate-review.js +5 -328
  894. package/scripts/gds/gating.js +5 -346
  895. package/scripts/gds/gds-literal-scan.js +5 -194
  896. package/scripts/gds/gen-api-client.js +5 -555
  897. package/scripts/gds/gen-api-docs.js +5 -1100
  898. package/scripts/gds/gen-atlas.js +5 -364
  899. package/scripts/gds/gen-diagrams.js +6 -607
  900. package/scripts/gds/gen-file-map.js +5 -335
  901. package/scripts/gds/gen-freshness.js +5 -31
  902. package/scripts/gds/gen-interaction-posture.js +5 -120
  903. package/scripts/gds/gen-repo-map.js +5 -538
  904. package/scripts/gds/gen-role-responsibilities.js +5 -133
  905. package/scripts/gds/gen-session-index.js +5 -241
  906. package/scripts/gds/gen-sounds.js +5 -174
  907. package/scripts/gds/git-merge-regen.js +6 -291
  908. package/scripts/gds/go-live.js +5 -1069
  909. package/scripts/gds/goal-names.js +5 -100
  910. package/scripts/gds/goal.js +6 -271
  911. package/scripts/gds/government-walk.js +5 -1475
  912. package/scripts/gds/grade-correlation-audit.js +5 -308
  913. package/scripts/gds/grade-replay.js +5 -235
  914. package/scripts/gds/grade-smoke.js +6 -204
  915. package/scripts/gds/home-isolation-guard.js +5 -125
  916. package/scripts/gds/hooks/pre-push.js +5 -209
  917. package/scripts/gds/howto.js +5 -143
  918. package/scripts/gds/http-api-client.js +6 -81
  919. package/scripts/gds/identity-strip.js +5 -74
  920. package/scripts/gds/init.js +5 -1157
  921. package/scripts/gds/install-git-hooks.js +5 -198
  922. package/scripts/gds/instance-apex.js +5 -37
  923. package/scripts/gds/intent-retry.js +5 -51
  924. package/scripts/gds/key-card.js +6 -221
  925. package/scripts/gds/key-status.js +5 -124
  926. package/scripts/gds/land-watch.js +5 -199
  927. package/scripts/gds/leak-scan-allowlist.js +5 -291
  928. package/scripts/gds/learning-capture.js +6 -144
  929. package/scripts/gds/lib.sh +7 -73
  930. package/scripts/gds/linkify-refs.js +6 -654
  931. package/scripts/gds/lint-infra-exec.js +5 -68
  932. package/scripts/gds/lint-migrations.js +5 -100
  933. package/scripts/gds/lint-workflow-exec.js +5 -61
  934. package/scripts/gds/local-preview-lib.js +6 -128
  935. package/scripts/gds/local-preview.js +6 -81
  936. package/scripts/gds/login.js +5 -358
  937. package/scripts/gds/main-audit.js +5 -623
  938. package/scripts/gds/me.js +6 -96
  939. package/scripts/gds/memory-map.js +5 -174
  940. package/scripts/gds/merge-lock.js +6 -70
  941. package/scripts/gds/migration-namespace.js +5 -311
  942. package/scripts/gds/mirror-lineage-check.js +5 -341
  943. package/scripts/gds/mirror-redact.js +5 -348
  944. package/scripts/gds/module-artifact.js +6 -289
  945. package/scripts/gds/module-assess-docs.js +6 -237
  946. package/scripts/gds/module-assess-installs.js +6 -227
  947. package/scripts/gds/module-assess-score.js +6 -110
  948. package/scripts/gds/module-assess-security.js +6 -251
  949. package/scripts/gds/module-assess-tests.js +6 -277
  950. package/scripts/gds/module-assess-version.js +6 -91
  951. package/scripts/gds/module-error-report.js +5 -146
  952. package/scripts/gds/module-test-runner.js +6 -413
  953. package/scripts/gds/module.js +5 -1374
  954. package/scripts/gds/move-escalation.js +5 -140
  955. package/scripts/gds/newcomer-floor.js +6 -420
  956. package/scripts/gds/newcomer-floor.test.js +6 -234
  957. package/scripts/gds/next-number.js +6 -162
  958. package/scripts/gds/oauth-secret.js +5 -200
  959. package/scripts/gds/onboard.js +5 -265
  960. package/scripts/gds/onboarding-analyze.js +6 -225
  961. package/scripts/gds/onboarding-config.js +6 -179
  962. package/scripts/gds/onboarding-ship.js +6 -91
  963. package/scripts/gds/pack-env-prefix.js +5 -72
  964. package/scripts/gds/package-core.js +5 -1102
  965. package/scripts/gds/page-inventory.js +5 -346
  966. package/scripts/gds/page-reader.js +5 -720
  967. package/scripts/gds/paste-token.js +6 -211
  968. package/scripts/gds/plain-cards.js +5 -350
  969. package/scripts/gds/portability-smoke-art.sh +7 -84
  970. package/scripts/gds/portability-smoke-memory.sh +7 -175
  971. package/scripts/gds/preflight.js +5 -212
  972. package/scripts/gds/probe-cache.js +5 -244
  973. package/scripts/gds/prove-strict-versioning.js +6 -283
  974. package/scripts/gds/provision-auto-upgrade.js +5 -161
  975. package/scripts/gds/provision-byo-host.js +5 -67
  976. package/scripts/gds/provision-capacity.js +5 -78
  977. package/scripts/gds/provision-caps.js +5 -62
  978. package/scripts/gds/provision-config.js +5 -232
  979. package/scripts/gds/provision-core-upgrade.js +5 -1165
  980. package/scripts/gds/provision-disconnect.js +5 -87
  981. package/scripts/gds/provision-github-setup.js +5 -167
  982. package/scripts/gds/provision-net.js +5 -356
  983. package/scripts/gds/provision-pin-key.js +5 -175
  984. package/scripts/gds/provision-pin-replay.js +5 -125
  985. package/scripts/gds/provision-process.js +5 -169
  986. package/scripts/gds/provision-render.js +5 -200
  987. package/scripts/gds/provision-repo-auth.js +5 -163
  988. package/scripts/gds/provision-repo-private.js +5 -97
  989. package/scripts/gds/provision-repo.js +5 -1336
  990. package/scripts/gds/provision-teardown.js +5 -105
  991. package/scripts/gds/provision-units.js +5 -468
  992. package/scripts/gds/provision.js +5 -1477
  993. package/scripts/gds/publish-credential-check.js +6 -65
  994. package/scripts/gds/publish-integration-gate.js +5 -140
  995. package/scripts/gds/publish-manifest.js +5 -437
  996. package/scripts/gds/publish-watch.js +5 -266
  997. package/scripts/gds/pulse.js +6 -335
  998. package/scripts/gds/push-main.js +5 -54
  999. package/scripts/gds/push-path-brief.js +5 -98
  1000. package/scripts/gds/read-session-export.js +5 -357
  1001. package/scripts/gds/reauth.js +6 -154
  1002. package/scripts/gds/recall.js +6 -182
  1003. package/scripts/gds/redteam-patrol.js +5 -435
  1004. package/scripts/gds/regen-instance-docs.js +5 -45
  1005. package/scripts/gds/release-core.js +5 -78
  1006. package/scripts/gds/release-notes.js +5 -270
  1007. package/scripts/gds/release.js +6 -138
  1008. package/scripts/gds/rename-goals.js +5 -107
  1009. package/scripts/gds/rename-history-check.js +5 -367
  1010. package/scripts/gds/rename-ledger-prose.js +5 -480
  1011. package/scripts/gds/render-api.js +5 -196
  1012. package/scripts/gds/render-check.js +5 -204
  1013. package/scripts/gds/render-ideas.js +6 -225
  1014. package/scripts/gds/render-payload.js +5 -84
  1015. package/scripts/gds/repo-metrics.js +6 -362
  1016. package/scripts/gds/review-sheet.js +5 -106
  1017. package/scripts/gds/role-pack-guard.js +5 -141
  1018. package/scripts/gds/route-shadow-guard.js +5 -173
  1019. package/scripts/gds/routine-schedule.js +5 -281
  1020. package/scripts/gds/run-routine.js +5 -255
  1021. package/scripts/gds/run-unit-tests.js +6 -659
  1022. package/scripts/gds/runner-drift.js +5 -149
  1023. package/scripts/gds/sandbox-stage.js +6 -458
  1024. package/scripts/gds/scope-map-guard.js +5 -299
  1025. package/scripts/gds/scope-roster-guard.js +5 -117
  1026. package/scripts/gds/seam-wiring-guard.js +5 -274
  1027. package/scripts/gds/search-ingest-db.js +6 -287
  1028. package/scripts/gds/search-ingest-md.js +6 -268
  1029. package/scripts/gds/seed-adopt-tasks.js +6 -74
  1030. package/scripts/gds/seed-api-contract-goal-tasks.js +6 -140
  1031. package/scripts/gds/seed-board-room-tasks.js +6 -196
  1032. package/scripts/gds/seed-bongos-app-tasks.js +6 -293
  1033. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +6 -80
  1034. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +6 -99
  1035. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +6 -306
  1036. package/scripts/gds/seed-bongos-module-system-tasks.js +6 -345
  1037. package/scripts/gds/seed-bongos-tasks.js +6 -213
  1038. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  1039. package/scripts/gds/seed-bongos-v1-seo-tasks.js +6 -104
  1040. package/scripts/gds/seed-bv1-community-tasks.js +6 -131
  1041. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +6 -133
  1042. package/scripts/gds/seed-bv1-profile-page-tasks.js +6 -161
  1043. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1044. package/scripts/gds/seed-bv1-r01-delta-tasks.js +6 -154
  1045. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1046. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +6 -277
  1047. package/scripts/gds/seed-gds-v4-tasks.js +6 -623
  1048. package/scripts/gds/seed-governance-tasks.js +6 -339
  1049. package/scripts/gds/seed-medusa-tasks.js +6 -439
  1050. package/scripts/gds/seed-module-upstreaming.js +5 -217
  1051. package/scripts/gds/seed-productization-tasks.js +6 -234
  1052. package/scripts/gds/seed-project-admin-console-tasks.js +6 -88
  1053. package/scripts/gds/seed-provisioning-tasks.js +6 -82
  1054. package/scripts/gds/seed-staging.sh +7 -116
  1055. package/scripts/gds/seed-strict-versioning-tasks.js +6 -274
  1056. package/scripts/gds/seed-v2-world-tasks.js +6 -282
  1057. package/scripts/gds/seed-verify-criteria.js +6 -124
  1058. package/scripts/gds/sequence.js +6 -596
  1059. package/scripts/gds/session-cost.js +6 -429
  1060. package/scripts/gds/session-digest-build.js +6 -293
  1061. package/scripts/gds/session-digest.js +6 -199
  1062. package/scripts/gds/session-eval.js +6 -630
  1063. package/scripts/gds/session-transcript-build.js +6 -155
  1064. package/scripts/gds/session-transcript-upload.js +6 -29
  1065. package/scripts/gds/session.js +6 -403
  1066. package/scripts/gds/setup.js +6 -645
  1067. package/scripts/gds/ship-check.js +5 -85
  1068. package/scripts/gds/ship-deploy-target.js +5 -392
  1069. package/scripts/gds/ship-escalation.js +5 -166
  1070. package/scripts/gds/ship-finish.js +5 -419
  1071. package/scripts/gds/ship-flow.js +5 -1216
  1072. package/scripts/gds/ship-git.js +5 -99
  1073. package/scripts/gds/ship-grade-steps.js +5 -546
  1074. package/scripts/gds/ship-grade.js +5 -425
  1075. package/scripts/gds/ship-honesty.js +5 -312
  1076. package/scripts/gds/ship-io.js +5 -138
  1077. package/scripts/gds/ship-land.js +5 -1129
  1078. package/scripts/gds/ship-memory-sync.js +5 -248
  1079. package/scripts/gds/ship-merge-gate.js +5 -224
  1080. package/scripts/gds/ship-merge.js +5 -465
  1081. package/scripts/gds/ship-mode-ask.js +5 -137
  1082. package/scripts/gds/ship-mode-manual.js +5 -53
  1083. package/scripts/gds/ship-preflight-steps.js +5 -398
  1084. package/scripts/gds/ship-regen.js +5 -313
  1085. package/scripts/gds/ship-resume.js +5 -200
  1086. package/scripts/gds/ship-session-upload.js +5 -312
  1087. package/scripts/gds/ship-state.js +5 -109
  1088. package/scripts/gds/ship-surprise.js +5 -83
  1089. package/scripts/gds/ship-visual.js +5 -74
  1090. package/scripts/gds/ship.js +5 -380
  1091. package/scripts/gds/shipping-mode.js +5 -69
  1092. package/scripts/gds/skill-lint.js +5 -248
  1093. package/scripts/gds/skill-preflight.js +5 -359
  1094. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1095. package/scripts/gds/smoke-batch-release.sh +7 -315
  1096. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1097. package/scripts/gds/smoke-dependencies.sh +7 -142
  1098. package/scripts/gds/smoke-gds.js +6 -255
  1099. package/scripts/gds/smoke-write.sh +7 -274
  1100. package/scripts/gds/source-text-test-scan.js +7 -0
  1101. package/scripts/gds/spark.js +6 -293
  1102. package/scripts/gds/stale-worktrees.js +5 -210
  1103. package/scripts/gds/start-goals.js +5 -101
  1104. package/scripts/gds/start.js +6 -1089
  1105. package/scripts/gds/status.js +6 -544
  1106. package/scripts/gds/strand-watch.js +5 -313
  1107. package/scripts/gds/stranded-rows.js +5 -198
  1108. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1109. package/scripts/gds/surface.js +5 -100
  1110. package/scripts/gds/task.js +6 -272
  1111. package/scripts/gds/test-path-guard.js +5 -97
  1112. package/scripts/gds/triage.js +6 -741
  1113. package/scripts/gds/turn-end-sound.js +5 -72
  1114. package/scripts/gds/tweak-halt.js +5 -68
  1115. package/scripts/gds/tweak-renders.js +5 -198
  1116. package/scripts/gds/uat.js +6 -119
  1117. package/scripts/gds/ui-kit-transform.js +5 -41
  1118. package/scripts/gds/update-channel.js +5 -510
  1119. package/scripts/gds/update-sweep.js +5 -827
  1120. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1121. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1122. package/scripts/gds/upgrade-migrate.js +5 -223
  1123. package/scripts/gds/upgrade-operator.js +6 -73
  1124. package/scripts/gds/upgrade-outcome.js +5 -173
  1125. package/scripts/gds/upgrade.js +5 -1497
  1126. package/scripts/gds/validate-design.js +5 -10
  1127. package/scripts/gds/version-close.js +6 -620
  1128. package/scripts/gds/version-literal-guard.js +5 -138
  1129. package/scripts/gds/version-select.js +5 -77
  1130. package/scripts/gds/visual-review-nudge.js +5 -38
  1131. package/scripts/gds/wedge-remedy.js +5 -173
  1132. package/scripts/gds/worktree-claim-guard.js +5 -129
  1133. package/scripts/gds/worktree.js +6 -448
  1134. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1135. package/scripts/hall-preview/server.js +2 -2
  1136. package/scripts/migrate.sh +3 -3
  1137. package/scripts/public-mirror-export.js +3 -3
  1138. package/scripts/setup-builder.js +7 -7
  1139. package/src/bongos/api-errors.js +1 -0
  1140. package/src/bongos/api-prefix.js +1 -1
  1141. package/src/bongos/auth-github.js +19 -3
  1142. package/src/bongos/auth-idp.js +7 -0
  1143. package/src/bongos/claim-attribution.js +2 -2
  1144. package/src/bongos/core-moves.js +1 -1
  1145. package/src/bongos/core-update.js +3 -3
  1146. package/src/bongos/craft-mode.js +2 -2
  1147. package/src/bongos/db-kernel.js +15 -3
  1148. package/src/bongos/db.js +30 -4
  1149. package/src/bongos/github-repos.js +1 -1
  1150. package/src/bongos/llm-cache.js +1 -1
  1151. package/src/bongos/llm-pricing.js +1 -1
  1152. package/src/bongos/metrics.js +1 -1
  1153. package/src/bongos/middleware/rate-limit.js +2 -2
  1154. package/src/bongos/module-listing.js +93 -1
  1155. package/src/bongos/module-scope-map.js +90 -85
  1156. package/src/bongos/module-store.js +1 -1
  1157. package/src/bongos/module-submissions.js +1 -1
  1158. package/src/bongos/optimizer.js +1 -1
  1159. package/src/bongos/package-registry.js +1 -1
  1160. package/src/bongos/path-match.js +1 -1
  1161. package/src/bongos/permission-path-check.js +3 -3
  1162. package/src/bongos/platform-visibility-gate.js +3 -5
  1163. package/src/bongos/prelaunch-gate.js +7 -6
  1164. package/src/bongos/route-rank-check.js +2 -2
  1165. package/src/bongos/routes/auth.js +15 -2
  1166. package/src/bongos/routes/backup.js +1 -1
  1167. package/src/bongos/routes/builders.js +29 -1
  1168. package/src/bongos/routes/me.js +49 -18
  1169. package/src/bongos/routes/modules.js +29 -9
  1170. package/src/bongos/routes/public.js +3 -72
  1171. package/src/bongos/schema-lag.js +1 -1
  1172. package/src/bongos/sensitive-surfaces.js +1 -1
  1173. package/src/bongos/serve-internal.js +65 -16
  1174. package/src/bongos/software-update.js +2 -2
  1175. package/src/bongos/upgrade-hold.js +3 -3
  1176. package/src/hall-look.js +6 -5
  1177. package/src/module-api.js +3 -3
  1178. package/src/module-loader/catalog.js +1 -1
  1179. package/src/module-loader/error-tally.js +3 -3
  1180. package/src/module-loader/manifest-schema.js +3 -3
  1181. package/src/platform-server.js +10 -0
  1182. package/src/role-responsibilities.js +1 -1
  1183. package/src/stale-timer.js +2 -2
  1184. package/tests/accessibility_replay.mjs +1 -1
  1185. package/tests/activity_rollup_order_db.mjs +1 -1
  1186. package/tests/activity_snapshots_db.mjs +1 -1
  1187. package/tests/adopt_detect.mjs +1 -1
  1188. package/tests/adopt_import.mjs +1 -1
  1189. package/tests/adopt_preflight.mjs +1 -1
  1190. package/tests/adr_0089_scope.mjs +10 -7
  1191. package/tests/adr_0162_citation.mjs +1 -1
  1192. package/tests/adr_0162_gate_citation.mjs +1 -1
  1193. package/tests/agent_invoke.mjs +1 -1
  1194. package/tests/agent_invoke_live.mjs +3 -3
  1195. package/tests/agents_cron_trigger.mjs +2 -2
  1196. package/tests/agents_roster.mjs +1 -1
  1197. package/tests/agents_sync.mjs +4 -4
  1198. package/tests/allow_rule_guard.mjs +20 -20
  1199. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1200. package/tests/api_alias_exceptions.mjs +7 -6
  1201. package/tests/api_artifacts.mjs +214 -0
  1202. package/tests/api_cli_flags.mjs +3 -3
  1203. package/tests/api_client.mjs +56 -54
  1204. package/tests/api_docs.mjs +30 -9
  1205. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1206. package/tests/api_msys_path_repair.mjs +2 -2
  1207. package/tests/architect.mjs +1 -1
  1208. package/tests/art_stage.mjs +2 -2
  1209. package/tests/artifact_audit.mjs +2 -2
  1210. package/tests/artifact_staleness.mjs +9 -9
  1211. package/tests/atlas.mjs +1 -1
  1212. package/tests/audit_deps.mjs +1 -1
  1213. package/tests/audit_gate.mjs +1 -1
  1214. package/tests/auth_flow_slice1.mjs +3 -3
  1215. package/tests/auth_inactive_builder.mjs +43 -5
  1216. package/tests/auth_session_expiry_db.mjs +16 -4
  1217. package/tests/auth_session_ttl.mjs +23 -0
  1218. package/tests/authorship_audit.mjs +2 -2
  1219. package/tests/autobongos_cadence.mjs +1 -1
  1220. package/tests/autobongos_fence.mjs +1 -1
  1221. package/tests/autobongos_grade_cap.mjs +2 -2
  1222. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1223. package/tests/autobongos_host_access.mjs +3 -3
  1224. package/tests/autobongos_loop.mjs +17 -17
  1225. package/tests/autobongos_service_ps1.mjs +3 -3
  1226. package/tests/autobongos_tweak_lane.mjs +2 -2
  1227. package/tests/autobongos_verify.mjs +2 -2
  1228. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1229. package/tests/autonomy_config_idle.mjs +1 -1
  1230. package/tests/autonomy_digest.mjs +1 -1
  1231. package/tests/autonomy_gate.mjs +1 -1
  1232. package/tests/autonomy_gauge.mjs +2 -2
  1233. package/tests/autonomy_runner_identity.mjs +1 -1
  1234. package/tests/backfill_sessions.mjs +8 -8
  1235. package/tests/backfill_subagent_rewards.mjs +1 -1
  1236. package/tests/backfill_task_rewards.mjs +2 -2
  1237. package/tests/backlog_review.mjs +3 -3
  1238. package/tests/baseline_staleness.mjs +2 -2
  1239. package/tests/bfg.mjs +11 -5
  1240. package/tests/bfg_write.mjs +20 -11
  1241. package/tests/blockers_hall.mjs +17 -5
  1242. package/tests/blockers_page_ui.mjs +56 -12
  1243. package/tests/bongos_dispatch.mjs +5 -5
  1244. package/tests/bongos_login.mjs +2 -2
  1245. package/tests/bug_attachment_audit.mjs +1 -1
  1246. package/tests/bug_attachment_recover.mjs +2 -2
  1247. package/tests/bug_triage.mjs +3 -3
  1248. package/tests/build_info.mjs +1 -1
  1249. package/tests/builder_tester_tag.mjs +184 -0
  1250. package/tests/bump_version.mjs +3 -3
  1251. package/tests/canonical_profile_url.mjs +1 -1
  1252. package/tests/capture_error_format.mjs +1 -1
  1253. package/tests/capture_goal_routing.mjs +2 -2
  1254. package/tests/category_advisory_guard.mjs +3 -3
  1255. package/tests/claim_error_surface.mjs +2 -2
  1256. package/tests/claim_from_task_and_home.mjs +1 -1
  1257. package/tests/claim_gate_open_blocker.mjs +7 -4
  1258. package/tests/claim_gate_rebase.mjs +12 -8
  1259. package/tests/claim_recall.mjs +4 -4
  1260. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1261. package/tests/claude_materialize.mjs +58 -58
  1262. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1263. package/tests/cli_allowlist_permissions.mjs +11 -11
  1264. package/tests/cli_dispatcher.mjs +2 -2
  1265. package/tests/cli_err_code.mjs +6 -6
  1266. package/tests/cli_exit_no_abort.mjs +7 -7
  1267. package/tests/cli_lib_formatters.mjs +2 -2
  1268. package/tests/cli_sessions.mjs +5 -5
  1269. package/tests/cli_surface.mjs +15 -15
  1270. package/tests/cli_token_reissue.mjs +2 -2
  1271. package/tests/client_baseurl_guard.mjs +1 -1
  1272. package/tests/client_bundle_route.mjs +35 -4
  1273. package/tests/cloud_bongos_pack.mjs +1 -1
  1274. package/tests/community_leaderboard_db.mjs +1 -1
  1275. package/tests/conductor.mjs +18 -18
  1276. package/tests/conflict_resolve.mjs +14 -16
  1277. package/tests/consumer_layout_boot.mjs +12 -12
  1278. package/tests/context_pack.mjs +6 -6
  1279. package/tests/control_manifest.mjs +4 -4
  1280. package/tests/copy_desk_page_reads.mjs +1 -1
  1281. package/tests/copy_desk_page_release.mjs +192 -0
  1282. package/tests/copy_inventory.mjs +2 -2
  1283. package/tests/core_auto_upgrade.mjs +1 -1
  1284. package/tests/core_move_notice.mjs +2 -2
  1285. package/tests/core_origin_follow.mjs +7 -7
  1286. package/tests/core_pin_sync.mjs +3 -3
  1287. package/tests/core_upgrade_door.mjs +2 -2
  1288. package/tests/core_upgrade_owner_door.mjs +34 -1
  1289. package/tests/core_upgrade_runner.mjs +19 -19
  1290. package/tests/credential_presence.mjs +2 -2
  1291. package/tests/credit_grant.mjs +3 -3
  1292. package/tests/credit_log_single_writer.mjs +5 -5
  1293. package/tests/criterion_ref_status.mjs +2 -2
  1294. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1295. package/tests/cutover_codemod.mjs +2 -4
  1296. package/tests/db_backup_nightly.mjs +1 -1
  1297. package/tests/db_backup_offsite.mjs +1 -1
  1298. package/tests/db_ownership_handover.mjs +2 -2
  1299. package/tests/dead_deps.mjs +3 -3
  1300. package/tests/dependency_advisory.mjs +1 -1
  1301. package/tests/deploy_audit_gate.mjs +4 -4
  1302. package/tests/deploy_divergence_line.mjs +36 -16
  1303. package/tests/deploy_page_projects.mjs +35 -4
  1304. package/tests/dev_lib.mjs +2 -2
  1305. package/tests/dev_windows.mjs +2 -2
  1306. package/tests/diagram_facts_offset.mjs +1 -1
  1307. package/tests/diagram_repo_slug.mjs +1 -1
  1308. package/tests/diff_derived_signals.mjs +2 -2
  1309. package/tests/dns_preflight.mjs +2 -2
  1310. package/tests/do_api.mjs +3 -3
  1311. package/tests/doc_cli_guard.mjs +28 -28
  1312. package/tests/doc_comment_coverage.mjs +1 -1
  1313. package/tests/doc_control_claims.mjs +11 -11
  1314. package/tests/docs_entropy.mjs +2 -2
  1315. package/tests/docs_openapi_route.mjs +8 -6
  1316. package/tests/doctor_hooks.mjs +1 -1
  1317. package/tests/edit_hints.mjs +3 -2
  1318. package/tests/effective_visibility_predicate.mjs +3 -3
  1319. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1320. package/tests/exec_path_guard.mjs +4 -4
  1321. package/tests/executed_closure.mjs +18 -12
  1322. package/tests/file_map.mjs +1 -1
  1323. package/tests/find_untested.mjs +13 -13
  1324. package/tests/first_admin_bootstrap.mjs +1 -1
  1325. package/tests/fitness.mjs +16 -16
  1326. package/tests/fitness_gds_ratchet.mjs +2 -2
  1327. package/tests/fitness_installed_core.mjs +3 -3
  1328. package/tests/fitness_no_raw_nul.mjs +1 -1
  1329. package/tests/fitness_ratchets.mjs +3 -3
  1330. package/tests/fitness_scope_roster.mjs +2 -2
  1331. package/tests/fitness_two_root.mjs +8 -8
  1332. package/tests/fixtures/accessibility-replay.json +5 -5
  1333. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1334. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1335. package/tests/fixtures/page-ledger.mjs +22 -0
  1336. package/tests/fixtures/session-506-digest.json +5 -5
  1337. package/tests/gate_approvals.mjs +50 -0
  1338. package/tests/gate_review.mjs +8 -8
  1339. package/tests/gating_review_retired.mjs +2 -2
  1340. package/tests/gen_freshness.mjs +3 -3
  1341. package/tests/git_guard.mjs +3 -3
  1342. package/tests/git_merge_regen.mjs +41 -65
  1343. package/tests/github_one_trip.mjs +4 -4
  1344. package/tests/github_pick_up.mjs +2 -2
  1345. package/tests/github_push_merge_driver.mjs +1 -1
  1346. package/tests/go_live.mjs +3 -2
  1347. package/tests/goal_category.mjs +1 -1
  1348. package/tests/goal_cli.mjs +2 -2
  1349. package/tests/goal_create_spec_entry.mjs +1 -1
  1350. package/tests/goal_invite_consent.mjs +3 -1
  1351. package/tests/goal_move.mjs +1 -1
  1352. package/tests/goal_names.mjs +2 -2
  1353. package/tests/goal_working_area.mjs +1 -1
  1354. package/tests/government_agent_asks.mjs +7 -7
  1355. package/tests/government_board_room_copy.mjs +6 -1
  1356. package/tests/government_board_view.mjs +39 -0
  1357. package/tests/government_board_vote_ui.mjs +39 -1
  1358. package/tests/government_config.mjs +2 -2
  1359. package/tests/government_live_proof_shape.mjs +1 -1
  1360. package/tests/government_protected_surfaces.mjs +54 -53
  1361. package/tests/government_require_permission.mjs +9 -1
  1362. package/tests/government_vanilla_boot.mjs +1 -1
  1363. package/tests/government_vocabulary.mjs +2 -2
  1364. package/tests/government_walk.mjs +2 -2
  1365. package/tests/grade_body_limit.mjs +6 -4
  1366. package/tests/grade_correlation_audit.mjs +3 -3
  1367. package/tests/grade_diff_hash.mjs +1 -1
  1368. package/tests/grade_engine_replay.mjs +2 -2
  1369. package/tests/grade_server_authoritative.mjs +1 -1
  1370. package/tests/grade_unavailable_display.mjs +1 -1
  1371. package/tests/grader.mjs +8 -24
  1372. package/tests/grader_generated_provenance.mjs +14 -14
  1373. package/tests/grader_no_artifact.mjs +1 -1
  1374. package/tests/grader_prompt_fencing.mjs +1 -1
  1375. package/tests/grader_quality_window_overflow.mjs +1 -1
  1376. package/tests/grader_reader_lens.mjs +3 -3
  1377. package/tests/grader_regrade_delta.mjs +1 -1
  1378. package/tests/grader_unbacked_score.mjs +2 -2
  1379. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1380. package/tests/hall_asset_cache.mjs +127 -0
  1381. package/tests/hall_audit.mjs +63 -0
  1382. package/tests/hall_board_world.mjs +20 -0
  1383. package/tests/hall_city_card_words.mjs +61 -0
  1384. package/tests/hall_client_request_shape.mjs +5 -1
  1385. package/tests/hall_home_ships_bounded.mjs +160 -0
  1386. package/tests/hall_landing_boot.mjs +15 -2
  1387. package/tests/hall_nav.mjs +33 -0
  1388. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1389. package/tests/hall_oversight_world.mjs +44 -4
  1390. package/tests/hall_palette.mjs +12 -9
  1391. package/tests/hall_preview_security.mjs +1 -1
  1392. package/tests/hall_profile_world.mjs +17 -0
  1393. package/tests/hall_reading_world.mjs +16 -1
  1394. package/tests/hall_roster_world.mjs +2 -1
  1395. package/tests/hall_studio_world.mjs +4 -1
  1396. package/tests/hall_work_history_id.mjs +39 -0
  1397. package/tests/held_tweak_reporting.mjs +4 -4
  1398. package/tests/helpers.mjs +3 -3
  1399. package/tests/home_attention_cards.mjs +2 -0
  1400. package/tests/home_bounded_reads.mjs +1 -1
  1401. package/tests/home_isolation_guard.mjs +1 -1
  1402. package/tests/hook_core_resolve.mjs +7 -7
  1403. package/tests/hook_user_agents.mjs +1 -1
  1404. package/tests/hooks_drain.mjs +2 -2
  1405. package/tests/host_topology_skips.mjs +1 -1
  1406. package/tests/howto_guide.mjs +1 -1
  1407. package/tests/howto_moments.mjs +3 -3
  1408. package/tests/hub_account_page.mjs +1 -1
  1409. package/tests/idea_capture_grades.mjs +2 -2
  1410. package/tests/idea_develop_spark.mjs +1 -1
  1411. package/tests/idea_filed_via.mjs +2 -2
  1412. package/tests/idea_ideate_full.mjs +1 -1
  1413. package/tests/idea_spark_mark.mjs +1 -1
  1414. package/tests/idea_spark_queue.mjs +1 -1
  1415. package/tests/idea_triage.mjs +1 -1
  1416. package/tests/idea_triage_grade.mjs +3 -3
  1417. package/tests/idea_vote_permission.mjs +113 -0
  1418. package/tests/idea_votes_fold_db.mjs +123 -0
  1419. package/tests/infra_exec_paths.mjs +12 -12
  1420. package/tests/init.mjs +2 -2
  1421. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1422. package/tests/instance_feedback.mjs +9 -9
  1423. package/tests/instance_mismatch_guard.mjs +2 -2
  1424. package/tests/integration_parked_ratchet.mjs +24 -2
  1425. package/tests/intent_retry.mjs +1 -1
  1426. package/tests/interaction_posture.mjs +3 -3
  1427. package/tests/invite_expiry_db.mjs +1 -1
  1428. package/tests/joinability_invite_only.mjs +1 -1
  1429. package/tests/karma_vote_lists.mjs +270 -0
  1430. package/tests/key-card.mjs +2 -2
  1431. package/tests/key-status.mjs +2 -2
  1432. package/tests/knip_ratchet_ambient.mjs +2 -2
  1433. package/tests/known_failing_ratchet.mjs +1 -1
  1434. package/tests/land_watch.mjs +2 -2
  1435. package/tests/landing_legal_pages.mjs +1 -1
  1436. package/tests/landing_page.mjs +2 -2
  1437. package/tests/leaderboard_roles.mjs +4 -1
  1438. package/tests/leak_scan_allowlist.mjs +8 -8
  1439. package/tests/leak_scan_fail_closed.mjs +1 -1
  1440. package/tests/lib_sh_resolution.mjs +9 -9
  1441. package/tests/lifecycle-card.mjs +7 -7
  1442. package/tests/linkify_check.mjs +2 -2
  1443. package/tests/linkify_refs.mjs +1 -1
  1444. package/tests/llm-cache-route.mjs +1 -1
  1445. package/tests/local_preview.mjs +2 -2
  1446. package/tests/main_audit.mjs +3 -3
  1447. package/tests/main_audit_attestation.mjs +1 -1
  1448. package/tests/main_audit_db_roster.mjs +2 -2
  1449. package/tests/main_worktree_busy_reason.mjs +3 -3
  1450. package/tests/markdown_line_endings.mjs +2 -2
  1451. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1452. package/tests/membership_kind_lockstep.mjs +1 -1
  1453. package/tests/memory_isolation.mjs +16 -8
  1454. package/tests/memory_map.mjs +2 -2
  1455. package/tests/memory_pull.mjs +33 -25
  1456. package/tests/merge_driver_register.mjs +3 -3
  1457. package/tests/migration_allocation.mjs +2 -2
  1458. package/tests/migration_namespace.mjs +1 -1
  1459. package/tests/migrations_forward_safe.mjs +1 -1
  1460. package/tests/mingle.mjs +1 -1
  1461. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1462. package/tests/mirror_lineage_proof.mjs +2 -2
  1463. package/tests/mirror_redact.mjs +4 -4
  1464. package/tests/missing_dep_classify.mjs +3 -3
  1465. package/tests/module-scope-map.mjs +22 -22
  1466. package/tests/module_api_lazy.mjs +1 -1
  1467. package/tests/module_assess_docs.mjs +2 -2
  1468. package/tests/module_assess_installs.mjs +3 -3
  1469. package/tests/module_assess_price_parity.mjs +5 -5
  1470. package/tests/module_assess_score.mjs +5 -5
  1471. package/tests/module_assess_security.mjs +4 -4
  1472. package/tests/module_assess_tests.mjs +3 -3
  1473. package/tests/module_assessments_migration.mjs +1 -1
  1474. package/tests/module_catalog.mjs +2 -2
  1475. package/tests/module_cli.mjs +3 -3
  1476. package/tests/module_entitlements.mjs +1 -1
  1477. package/tests/module_error_counts.mjs +1 -1
  1478. package/tests/module_install.mjs +4 -4
  1479. package/tests/module_loader.mjs +3 -1
  1480. package/tests/module_owned_tests.mjs +1 -1
  1481. package/tests/module_release_channels.mjs +1 -1
  1482. package/tests/module_store_howto.mjs +3 -3
  1483. package/tests/module_store_listing.mjs +139 -2
  1484. package/tests/module_store_publish.mjs +4 -4
  1485. package/tests/module_store_publish_route.mjs +1 -1
  1486. package/tests/module_store_reassess.mjs +1 -1
  1487. package/tests/module_store_registry_migration.mjs +1 -1
  1488. package/tests/module_test_runner.mjs +3 -3
  1489. package/tests/module_update.mjs +4 -4
  1490. package/tests/module_upgrade_updates.mjs +1 -1
  1491. package/tests/move_escalation.mjs +2 -2
  1492. package/tests/nav_permission_atoms.mjs +3 -2
  1493. package/tests/needs_rebase.mjs +7 -3
  1494. package/tests/newcomer_floor.mjs +1 -1
  1495. package/tests/newcomer_generator.mjs +48 -0
  1496. package/tests/next_number.mjs +1 -1
  1497. package/tests/no_artifact_escalation.mjs +3 -3
  1498. package/tests/npm_release_where.mjs +1 -1
  1499. package/tests/oauth_secret.mjs +2 -2
  1500. package/tests/onboard.mjs +6 -6
  1501. package/tests/onboarding_gate.mjs +2 -2
  1502. package/tests/opt_in_skill_modules.mjs +3 -3
  1503. package/tests/own_scope_guard.mjs +1 -1
  1504. package/tests/own_session_revoke.mjs +4 -1
  1505. package/tests/package_core.mjs +10 -11
  1506. package/tests/page_inventory.mjs +5 -5
  1507. package/tests/page_reader.mjs +7 -7
  1508. package/tests/page_tweak_hold.mjs +6 -6
  1509. package/tests/parallel-load.mjs +1 -1
  1510. package/tests/paste_token_api_base.mjs +1 -1
  1511. package/tests/paste_token_session_store.mjs +2 -2
  1512. package/tests/pending_invite_purge_db.mjs +1 -1
  1513. package/tests/permission_path.mjs +1 -1
  1514. package/tests/pin_replay.mjs +1 -1
  1515. package/tests/pin_write_key.mjs +7 -7
  1516. package/tests/plain_cards.mjs +15 -15
  1517. package/tests/pr_assign.mjs +1 -1
  1518. package/tests/pre_push_hook.mjs +3 -3
  1519. package/tests/preflight_checks.mjs +2 -2
  1520. package/tests/prelaunch_gate.mjs +1 -1
  1521. package/tests/privacy_matrix.mjs +1 -1
  1522. package/tests/probe_cache.mjs +6 -6
  1523. package/tests/profile_connections_ui.mjs +4 -3
  1524. package/tests/profile_fields.mjs +11 -1
  1525. package/tests/profile_privacy_owner_view.mjs +1 -1
  1526. package/tests/profile_role_headline.mjs +10 -9
  1527. package/tests/project_admin_console_model.mjs +1 -1
  1528. package/tests/projects_hub.mjs +1 -1
  1529. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1530. package/tests/promote_goal_id.mjs +6 -6
  1531. package/tests/promotion_sweep.mjs +1 -1
  1532. package/tests/provision.mjs +24 -24
  1533. package/tests/provision_account_identity.mjs +2 -2
  1534. package/tests/provision_byo_host.mjs +1 -1
  1535. package/tests/provision_caddy_wiring.mjs +2 -2
  1536. package/tests/provision_disconnect.mjs +2 -2
  1537. package/tests/provision_dns_first.mjs +1 -1
  1538. package/tests/provision_render.mjs +9 -9
  1539. package/tests/provision_repo_private.mjs +3 -3
  1540. package/tests/provision_resource_caps.mjs +5 -5
  1541. package/tests/provision_restart.mjs +3 -3
  1542. package/tests/provision_settings_apply.mjs +7 -7
  1543. package/tests/provision_teardown_address.mjs +2 -2
  1544. package/tests/provisioning_capacity.mjs +5 -5
  1545. package/tests/provisioning_credential_preflight.mjs +1 -1
  1546. package/tests/provisioning_disconnect.mjs +1 -1
  1547. package/tests/provisioning_error_note_scope.mjs +4 -4
  1548. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1549. package/tests/provisioning_planet_physics.mjs +16 -0
  1550. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1551. package/tests/provisioning_settings_env.mjs +1 -1
  1552. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1553. package/tests/public_mirror_export.mjs +1 -1
  1554. package/tests/publish_integration_gate.mjs +2 -2
  1555. package/tests/publish_manifest.mjs +6 -6
  1556. package/tests/publish_watch.mjs +1 -1
  1557. package/tests/push_path_brief.mjs +2 -2
  1558. package/tests/raise.mjs +248 -0
  1559. package/tests/rank_roles_audit.mjs +1 -1
  1560. package/tests/rank_tier_single_source.mjs +2 -2
  1561. package/tests/rate_limit_public.mjs +1 -1
  1562. package/tests/read_default_meter.mjs +2 -2
  1563. package/tests/read_session_export.mjs +1 -1
  1564. package/tests/rebase_gate_set_aside.mjs +1 -1
  1565. package/tests/recall_cli.mjs +1 -1
  1566. package/tests/recall_corpus_health.mjs +3 -2
  1567. package/tests/recall_hints.mjs +1 -1
  1568. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1569. package/tests/redteam_patrol.mjs +2 -2
  1570. package/tests/regrade_actual_minutes.mjs +2 -2
  1571. package/tests/regrade_eligibility.mjs +2 -2
  1572. package/tests/release_core.mjs +2 -2
  1573. package/tests/release_notes.mjs +4 -4
  1574. package/tests/rename_history_restraint.mjs +3 -3
  1575. package/tests/rename_ledger_prose.mjs +6 -6
  1576. package/tests/render_api.mjs +1 -1
  1577. package/tests/render_check.mjs +4 -4
  1578. package/tests/render_deploy.mjs +1 -1
  1579. package/tests/repo_info_binding.mjs +1 -1
  1580. package/tests/repo_map.mjs +5 -5
  1581. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1582. package/tests/reward_mode_surfacing.mjs +1 -1
  1583. package/tests/role_responsibilities.mjs +1 -1
  1584. package/tests/rot_inbox.mjs +10 -7
  1585. package/tests/route_permission_check.mjs +1 -1
  1586. package/tests/route_shadow_guard.mjs +1 -1
  1587. package/tests/route_validation.mjs +1 -1
  1588. package/tests/routine_capture_kind.mjs +6 -6
  1589. package/tests/routine_schedule.mjs +9 -9
  1590. package/tests/run_routine.mjs +5 -5
  1591. package/tests/run_routine_two_root.mjs +5 -5
  1592. package/tests/runner_drift.mjs +17 -17
  1593. package/tests/sandbox_stage.mjs +5 -5
  1594. package/tests/scope_map_guard.mjs +7 -7
  1595. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1596. package/tests/scripts_gds_forwarders.mjs +224 -0
  1597. package/tests/scrubber_corpus.mjs +2 -2
  1598. package/tests/seam_wiring_guard.mjs +1 -1
  1599. package/tests/search_ingest.mjs +2 -2
  1600. package/tests/search_ingest_db.mjs +1 -1
  1601. package/tests/search_ingest_nul.mjs +6 -6
  1602. package/tests/seed_verify_criteria.mjs +3 -3
  1603. package/tests/sequence.mjs +3 -3
  1604. package/tests/served_paths_shipped.mjs +3 -3
  1605. package/tests/session_506_regression.mjs +1 -1
  1606. package/tests/session_accessibility.mjs +1 -1
  1607. package/tests/session_caps.mjs +1 -1
  1608. package/tests/session_cost.mjs +1 -1
  1609. package/tests/session_digest.mjs +2 -2
  1610. package/tests/session_eval.mjs +6 -6
  1611. package/tests/session_index.mjs +1 -1
  1612. package/tests/session_records.mjs +4 -4
  1613. package/tests/session_rename_fallback.mjs +2 -2
  1614. package/tests/session_reward_on_land.mjs +7 -149
  1615. package/tests/session_reward_on_land_db.mjs +191 -0
  1616. package/tests/session_reward_reconcile.mjs +6 -88
  1617. package/tests/session_reward_reconcile_db.mjs +132 -0
  1618. package/tests/session_transcript.mjs +1 -1
  1619. package/tests/sessions_kit_pager.mjs +2 -1
  1620. package/tests/setup_device_flow_fallback.mjs +2 -2
  1621. package/tests/setup_smoke.mjs +12 -5
  1622. package/tests/setup_status_facts.mjs +54 -12
  1623. package/tests/ship_autolinkify.mjs +2 -2
  1624. package/tests/ship_automerge_injection.mjs +1 -1
  1625. package/tests/ship_base_flag.mjs +1 -1
  1626. package/tests/ship_broadcast_routing.mjs +1 -1
  1627. package/tests/ship_broadcast_server.mjs +2 -2
  1628. package/tests/ship_builder_model.mjs +1 -1
  1629. package/tests/ship_cannot_lie.mjs +9 -9
  1630. package/tests/ship_card.mjs +2 -2
  1631. package/tests/ship_ci_deploy.mjs +7 -7
  1632. package/tests/ship_error_shape.mjs +1 -1
  1633. package/tests/ship_land_ci_not_started.mjs +3 -3
  1634. package/tests/ship_land_conflict.mjs +3 -3
  1635. package/tests/ship_land_proof.mjs +3 -3
  1636. package/tests/ship_land_red_pr.mjs +5 -5
  1637. package/tests/ship_merge_gate.mjs +14 -14
  1638. package/tests/ship_mode.mjs +1 -1
  1639. package/tests/ship_mode_first_ship.mjs +4 -4
  1640. package/tests/ship_mode_hands_off.mjs +8 -8
  1641. package/tests/ship_post_land_verify.mjs +1 -1
  1642. package/tests/ship_preflight.mjs +19 -19
  1643. package/tests/ship_premerge.mjs +1 -1
  1644. package/tests/ship_publish_error.mjs +2 -2
  1645. package/tests/ship_push_diagnosis.mjs +1 -1
  1646. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1647. package/tests/ship_resume.mjs +4 -4
  1648. package/tests/ship_smoke_gate.mjs +1 -1
  1649. package/tests/ship_upload_skip.mjs +1 -1
  1650. package/tests/ship_upstream_deletion.mjs +1 -1
  1651. package/tests/ship_vendored_instance.mjs +8 -8
  1652. package/tests/ship_visual_regrade.mjs +3 -3
  1653. package/tests/ship_zero_commit.mjs +1 -1
  1654. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1655. package/tests/skill_friction_kind.mjs +1 -1
  1656. package/tests/skill_grade_recover.mjs +1 -1
  1657. package/tests/skill_grader_health.mjs +1 -1
  1658. package/tests/skill_lint.mjs +1 -1
  1659. package/tests/skill_menu_ruling.mjs +1 -1
  1660. package/tests/skill_preflight.mjs +7 -7
  1661. package/tests/skip_is_not_pass.mjs +22 -1
  1662. package/tests/smoke_dependencies_witness.mjs +2 -2
  1663. package/tests/smoke_preflight.mjs +1 -1
  1664. package/tests/smoke_target.mjs +2 -2
  1665. package/tests/smoke_write_contract.mjs +2 -2
  1666. package/tests/sound_player.mjs +8 -8
  1667. package/tests/source_text_test_ratchet.mjs +97 -0
  1668. package/tests/speciality_corpus_scope.mjs +1 -1
  1669. package/tests/speciality_session_skills.mjs +1 -1
  1670. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1671. package/tests/stale_timer.mjs +3 -3
  1672. package/tests/stale_worktrees.mjs +1 -1
  1673. package/tests/start_env_guard.mjs +1 -1
  1674. package/tests/start_goal_first.mjs +3 -3
  1675. package/tests/start_inbox_count.mjs +1 -1
  1676. package/tests/start_rebase_warning.mjs +1 -1
  1677. package/tests/status_default_version.mjs +3 -3
  1678. package/tests/status_mirror_sync.mjs +1 -1
  1679. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1680. package/tests/stop_refcheck.mjs +1 -1
  1681. package/tests/strand_watch.mjs +1 -1
  1682. package/tests/stranded_rows.mjs +1 -1
  1683. package/tests/stuck_detector.mjs +14 -14
  1684. package/tests/sweep_app_account.mjs +3 -3
  1685. package/tests/task_cli.mjs +2 -2
  1686. package/tests/task_detail_ui.mjs +11 -1
  1687. package/tests/task_discipline_required.mjs +2 -2
  1688. package/tests/task_list_paging.mjs +1 -1
  1689. package/tests/task_visual_slots.mjs +2 -2
  1690. package/tests/terms_acceptance.mjs +1 -1
  1691. package/tests/terms_grandfather_db.mjs +1 -1
  1692. package/tests/test_path_guard.mjs +1 -1
  1693. package/tests/triage_development.mjs +1 -1
  1694. package/tests/tweak_batch_apply.mjs +2 -2
  1695. package/tests/tweak_land_heal.mjs +3 -3
  1696. package/tests/tweak_unattended.mjs +3 -3
  1697. package/tests/ui_design_skills.mjs +2 -2
  1698. package/tests/unit_report_status.mjs +2 -2
  1699. package/tests/unit_runner_serial.mjs +2 -2
  1700. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1701. package/tests/update_channel.mjs +2 -2
  1702. package/tests/update_channel_db.mjs +4 -4
  1703. package/tests/update_subscription_engine.mjs +26 -26
  1704. package/tests/update_sweep_home.mjs +14 -14
  1705. package/tests/upgrade.mjs +11 -11
  1706. package/tests/upgrade_artist_gate.mjs +4 -4
  1707. package/tests/upgrade_commit_identity.mjs +2 -2
  1708. package/tests/upgrade_migrate.mjs +7 -7
  1709. package/tests/upgrade_operator.mjs +2 -2
  1710. package/tests/upgrade_outcome.mjs +2 -2
  1711. package/tests/upgrade_persist_pin.mjs +5 -5
  1712. package/tests/upkeep_home.mjs +1 -1
  1713. package/tests/version_close.mjs +2 -2
  1714. package/tests/version_close_cli.mjs +2 -2
  1715. package/tests/version_close_route.mjs +1 -1
  1716. package/tests/version_literals.mjs +23 -23
  1717. package/tests/visual_review.mjs +5 -5
  1718. package/tests/wedge_remedy.mjs +5 -5
  1719. package/tests/welcome_boot.mjs +116 -0
  1720. package/tests/welcome_boot_browser.mjs +271 -0
  1721. package/tests/wizard_born_first_board.mjs +3 -3
  1722. package/tests/wizard_demo.mjs +1 -1
  1723. package/tests/wizard_one_page.mjs +4 -3
  1724. package/tests/wizard_physics.mjs +3 -1
  1725. package/tests/wizard_physics_more.mjs +42 -3
  1726. package/tests/work_title_wrap.mjs +1 -1
  1727. package/tests/workflow_exec_paths.mjs +6 -6
  1728. package/tests/worktree_claim_guard.mjs +1 -1
  1729. package/tests/worktree_helper.mjs +2 -2
  1730. package/tests/write_validation_gaps.mjs +3 -3
  1731. package/scripts/gds/api.sh +0 -6
  1732. package/scripts/gds/audit-exports.js +0 -128
  1733. package/scripts/gds/resolve-skill-model.js +0 -57
  1734. package/scripts/gds/security-baseline-check.sh +0 -180
  1735. package/scripts/gds/spike-task-map.js +0 -899
  1736. package/scripts/status-probe.mjs +0 -213
  1737. package/src/bongos/uptime-poller.js +0 -93
  1738. package/tests/government_fold_bench.mjs +0 -50
  1739. package/tests/spike_task_map.mjs +0 -422
  1740. package/tests/status-probe.mjs +0 -89
  1741. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1742. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1743. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1744. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -0,0 +1,1111 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ // gen-api-docs.js — generate a standards-compliant OpenAPI 3.1 spec + a human/AI
4
+ // Markdown reference DIRECTLY FROM the live route files (task 1918, BONGOS-V1).
5
+ //
6
+ // WHY: the GDS API had no machine-readable contract — the only endpoint doc was a
7
+ // hand-maintained mirror (docs/routes-permissions.md) that drifted from the code.
8
+ // An AI agent hitting the API had nothing standard to read. This generator emits
9
+ // OpenAPI 3.1 — the format every tool (Postman, Swagger, Redoc, LLM tool-callers)
10
+ // already understands — from the SAME route-introspection engine the ship-time
11
+ // rank gate uses (src/bongos/route-rank-check.js). So the docs enumerate EXACTLY the
12
+ // routes the server mounts and cannot silently drift.
13
+ //
14
+ // DESIGN (mirrors gen-repo-map.js / ADR 0063):
15
+ // - Deterministic: no timestamps, stable sort — so `--check` is a clean CI gate.
16
+ // - Zero runtime deps: a line+regex extractor over the route source, plus a
17
+ // built-in structural OpenAPI validator (no @redocly/cli in the critical path;
18
+ // run `npm run docs:api:lint` for the full standard lint on demand).
19
+ // - Two-root aware (ADR 0108): route discovery + doc writes route through
20
+ // resolveCoreRoot(); never hardcode path.resolve(__dirname,'..','..').
21
+ //
22
+ // Writes (all deterministic):
23
+ // docs/api/openapi.json — OpenAPI 3.1, the machine-readable contract
24
+ // docs/api-reference.md — grouped Markdown reference (for humans + AI)
25
+ // docs/routes-permissions.md — generated pointer stub (the retired hand-mirror)
26
+ //
27
+ // Usage:
28
+ // node scripts/bongos/gen-api-docs.js # regenerate the three files
29
+ // node scripts/bongos/gen-api-docs.js --check # write nothing; exit 1 if the spec is not valid
30
+ // # OpenAPI 3.1, exit 2 if the committed stub drifted.
31
+ // # openapi.json + api-reference.md are gitignored
32
+ // # (task 1004866) and never compared.
33
+ // node scripts/bongos/gen-api-docs.js --json # print the extracted model as JSON (debug)
34
+
35
+ const fs = require('node:fs');
36
+ const path = require('node:path');
37
+
38
+ const { resolveCoreRoot, resolveDocsRoot } = require('../../src/instance-config');
39
+ const rrc = require('../../src/bongos/route-rank-check');
40
+ // Destructured, not reached through `rrc.` — knip tracks a destructured CJS require but
41
+ // not namespace member access, so `rrc.canonicalRoutePath(...)` read as an unused export
42
+ // and tripped the dead-code ratchet (knip_issue_count 224 > baseline 223) even though the
43
+ // call site below is real. The named import is how a new helper on this module gets
44
+ // counted as used (task 1003747).
45
+ const { canonicalRoutePath } = require('../../src/bongos/route-rank-check');
46
+ const { API_PREFIX, API_VERSION, VERSIONED_API_PREFIX } = require('../../src/bongos/api-prefix');
47
+ // Task 2050 (ADR 0118): the enriched extractor resolves named constants used in
48
+ // validate() rules. Both requires are pure (no side effects / no DB / no express):
49
+ // _helpers exports the LIMITS caps; api-errors is the kernel error registry whose
50
+ // category taxonomy the spec advertises (ADR 0116). Keep them pure — the generator
51
+ // must never execute a route file or open a connection.
52
+ const { LIMITS } = require('../../src/bongos/routes/_helpers');
53
+ const { sameContent } = require('./gen-freshness'); // eol-insensitive freshness (CRLF checkouts)
54
+ const apiErrors = require('../../src/bongos/api-errors');
55
+
56
+ const CORE_ROOT = resolveCoreRoot();
57
+ // Routes are READ from the core (CORE_ROOT, via route-rank-check); the generated
58
+ // spec + reference are WRITTEN to the DOCS root — the instance repo when a consumer
59
+ // points at it (`bongos upgrade`), the same coreRoot in a single checkout (ADR 0108,
60
+ // task 2051). So `bongos upgrade` refreshes the CONSUMER's docs, not node_modules.
61
+ const DOCS_ROOT = resolveDocsRoot();
62
+ const OPENAPI_PATH = path.join(DOCS_ROOT, 'docs', 'api', 'openapi.json');
63
+ const REFERENCE_PATH = path.join(DOCS_ROOT, 'docs', 'api-reference.md');
64
+ const PERMISSIONS_PATH = path.join(DOCS_ROOT, 'docs', 'routes-permissions.md');
65
+
66
+ // Spec version tracks the core package version — deterministic (no build clock).
67
+ function specVersion() {
68
+ try {
69
+ return require(path.join(CORE_ROOT, 'package.json')).version || '0.0.0';
70
+ } catch {
71
+ return '0.0.0';
72
+ }
73
+ }
74
+
75
+ // Human-facing product name for the spec title, from the branding pack. Best-effort:
76
+ // a branding hiccup must not break doc generation (falls back to a neutral name).
77
+ function productName() {
78
+ try {
79
+ const { branding } = require('../../src/branding');
80
+ const b = branding();
81
+ return (b.identity && (b.identity.productName || b.identity.worldName)) || 'Cloud Bongos';
82
+ } catch {
83
+ return 'Cloud Bongos';
84
+ }
85
+ }
86
+
87
+ const METHOD_ORDER = ['get', 'post', 'put', 'patch', 'delete'];
88
+
89
+ const RANK_BLURB = {
90
+ public: 'No authentication — any caller.',
91
+ 'any-builder': 'Any authenticated builder (row-level ownership enforced in-handler).',
92
+ 'metic+archon': 'Metic or Archon rank (review/triage powers).',
93
+ archon: 'Archon only (rank and identity management + the escalation keys — the trust boundary).',
94
+ 'bfg-principal': 'The BFG cross-builder memory service principal (not a human rank).',
95
+ unknown: 'Gate could not be classified from source — treat as privileged.',
96
+ };
97
+
98
+ // ---------------------------------------------------------------------------
99
+ // Extraction (per route file)
100
+ // ---------------------------------------------------------------------------
101
+
102
+ // The contiguous `//` comment block immediately above line i, `//` stripped and
103
+ // joined. A leading "rank: <val> — " token is dropped so the prose that remains is
104
+ // the human rationale (the rank itself is captured structurally). Blank lines and
105
+ // code end the block.
106
+ // Route-comment descriptions carry bare "#NNN" GDS task refs (e.g. "V3.R91 / #401").
107
+ // Emitted verbatim they mis-render as GitHub *issue* links in the committed
108
+ // docs/api-reference.md AND trip the doc-ref-linkify CI gate — while gen-api-docs
109
+ // --check demands the committed file match this generator's output, so the two
110
+ // checks would fight over the generated file forever. Neutralize the refs at their
111
+ // single origin to plain "task NNN" (brand-neutral, deterministic, and what
112
+ // linkify-refs treats as clean — it never rewrites a hostname). Only a #-prefixed
113
+ // run of digits is touched; "V3.R91", anchors like "#/task", and "# heading" are left
114
+ // alone. (task 1918 follow-up; surfaced landing task 1915.)
115
+ function neutralizeTaskRefs(text) {
116
+ return String(text || '').replace(/#(\d{1,6})\b/g, 'task $1');
117
+ }
118
+
119
+ function commentBlockAbove(lines, i) {
120
+ const buf = [];
121
+ for (let j = i - 1; j >= 0; j--) {
122
+ const line = lines[j];
123
+ if (/^\s*\/\//.test(line)) {
124
+ buf.unshift(line.replace(/^\s*\/\/\s?/, ''));
125
+ continue;
126
+ }
127
+ break; // blank or code — stop
128
+ }
129
+ let text = buf.join(' ').replace(/\s+/g, ' ').trim();
130
+ text = text.replace(/^rank:\s*[a-z+-]+\s*(?:—|-|:)?\s*/i, '').trim();
131
+ return neutralizeTaskRefs(text);
132
+ }
133
+
134
+ // An Express inline param constraint — `:id(\d+)` (task 1003747). It is a ROUTING
135
+ // detail, never part of the URL a caller types, so it is stripped everywhere a
136
+ // route string reaches a reader or the spec. Without this, `/inbox/:id(\d+)`
137
+ // generated the path template `/inbox/{id}(\\d+)` (malformed — it would break the
138
+ // generated client), renamed the operationId `get_inbox_id` → `get_inbox_id_d`
139
+ // (a silent breaking change for every client consumer), and printed the regex in
140
+ // the public API reference.
141
+ // The canonicaliser itself lives in route-rank-check, next to scanDeclarations — the
142
+ // scanner this generator already shares with the auditor — so there is ONE definition
143
+ // rather than a copy per consumer. Declarations therefore arrive canonical already;
144
+ // this wrapper stays because pathParams/routeForDisplay are pure exported helpers that
145
+ // callers (and tests/api_docs.mjs) hand raw strings to directly.
146
+ function routeForDisplay(route) {
147
+ return canonicalRoutePath(String(route || ''));
148
+ }
149
+
150
+ // :param → {param}; also return the ordered param name list. Inline constraints
151
+ // are dropped first so the template stays a valid OpenAPI path.
152
+ function pathParams(route) {
153
+ const names = [];
154
+ const openapiPath = routeForDisplay(route).replace(/:([A-Za-z0-9_]+)/g, (_, n) => {
155
+ names.push(n);
156
+ return `{${n}}`;
157
+ });
158
+ return { openapiPath, names };
159
+ }
160
+
161
+ // Strip // line comments and /* */ block comments, honoring string literals — so
162
+ // a schema literal's inline comments (`parallel_safe: {}, // note`) don't derail
163
+ // the brace/key scan below.
164
+ function stripComments(str) {
165
+ let out = '';
166
+ let quote = null;
167
+ for (let k = 0; k < str.length; k++) {
168
+ const c = str[k];
169
+ const n = str[k + 1];
170
+ if (quote) {
171
+ out += c;
172
+ if (c === '\\') { out += n == null ? '' : n; k++; continue; }
173
+ if (c === quote) quote = null;
174
+ continue;
175
+ }
176
+ if (c === '"' || c === "'" || c === '`') { quote = c; out += c; continue; }
177
+ if (c === '/' && n === '/') { while (k < str.length && str[k] !== '\n') k++; out += '\n'; continue; }
178
+ if (c === '/' && n === '*') { k += 2; while (k < str.length && !(str[k] === '*' && str[k + 1] === '/')) k++; k++; continue; }
179
+ out += c;
180
+ }
181
+ return out;
182
+ }
183
+
184
+ // Capture the balanced {...} literal starting at the first '{' at or after `from`.
185
+ // Returns the substring (incl. braces) or null. String/char literals are skipped
186
+ // so a brace inside a quoted default doesn't unbalance the scan.
187
+ function captureBalanced(str, from) {
188
+ const open = str.indexOf('{', from);
189
+ if (open === -1) return null;
190
+ let depth = 0;
191
+ let quote = null;
192
+ for (let k = open; k < str.length; k++) {
193
+ const c = str[k];
194
+ if (quote) {
195
+ if (c === '\\') { k++; continue; }
196
+ if (c === quote) quote = null;
197
+ continue;
198
+ }
199
+ if (c === '"' || c === "'" || c === '`') { quote = c; continue; }
200
+ if (c === '{') depth++;
201
+ else if (c === '}') { depth--; if (depth === 0) return str.slice(open, k + 1); }
202
+ }
203
+ return null;
204
+ }
205
+
206
+ // Top-level `identifier:` keys of an object-literal string (depth-1 only).
207
+ // Strips comments first so it is robust regardless of caller (idempotent on
208
+ // already-stripped input).
209
+ function topLevelKeys(objLiteral) {
210
+ const inner = stripComments(objLiteral).slice(1, -1);
211
+ const keys = [];
212
+ let depth = 0;
213
+ let quote = null;
214
+ let atFieldStart = true;
215
+ let ident = '';
216
+ for (let k = 0; k < inner.length; k++) {
217
+ const c = inner[k];
218
+ if (quote) {
219
+ if (c === '\\') { k++; continue; }
220
+ if (c === quote) quote = null;
221
+ continue;
222
+ }
223
+ if (c === '"' || c === "'" || c === '`') { quote = c; ident = ''; atFieldStart = false; continue; }
224
+ if (c === '{' || c === '[' || c === '(') { depth++; atFieldStart = false; ident = ''; continue; }
225
+ if (c === '}' || c === ']' || c === ')') { depth--; continue; }
226
+ if (depth === 0) {
227
+ if (c === ',') { atFieldStart = true; ident = ''; continue; }
228
+ if (c === ':' && ident) { keys.push(ident); ident = ''; atFieldStart = false; continue; }
229
+ if (atFieldStart && /[A-Za-z0-9_$]/.test(c)) { ident += c; continue; }
230
+ if (!/\s/.test(c)) { ident = ''; atFieldStart = false; }
231
+ }
232
+ }
233
+ return keys;
234
+ }
235
+
236
+ // ---------------------------------------------------------------------------
237
+ // Rule-set extraction (task 2050 / ADR 0118 §1 "enrich the generator")
238
+ // ---------------------------------------------------------------------------
239
+ //
240
+ // The per-route validate() schema object is already structured data (_helpers.js):
241
+ // each field's rule carries type/required/enum/min/max/minLength/maxLength/
242
+ // itemsType/maxItems. We parse that rule set (not just field names) so the spec can
243
+ // emit typed request schemas + named components.schemas. Values are resolved
244
+ // STATICALLY — the generator NEVER executes a route file (the stripComments/
245
+ // captureBalanced philosophy). Literals resolve directly; a named constant
246
+ // (LIMITS.TITLE, a file-local `const CAP = 64`) resolves via a per-file constants
247
+ // map; an unresolvable expression (e.g. a computed bound) is simply omitted from
248
+ // that ONE annotation — the field's type still emits, so a schema degrades
249
+ // gracefully and never emits a wrong constraint.
250
+
251
+ const KNOWN_TYPES = new Set(['string', 'number', 'integer', 'boolean', 'array', 'object']);
252
+ const RULE_NUM_KEYS = ['maxLength', 'minLength', 'min', 'max', 'maxItems'];
253
+ // Only digits, numeric separators, and arithmetic operators — no identifiers. A
254
+ // string matching this is safe to evaluate (it cannot reference anything).
255
+ const NUMERIC_ARITH_RE = /^[-+*/()\s\d._]+$/;
256
+
257
+ // Split an object/array INNER (braces/brackets already stripped) on depth-0 commas,
258
+ // honoring string literals and nesting. Returns the raw segments (untrimmed).
259
+ function splitTopLevel(inner) {
260
+ const parts = [];
261
+ let depth = 0;
262
+ let quote = null;
263
+ let start = 0;
264
+ for (let k = 0; k < inner.length; k++) {
265
+ const c = inner[k];
266
+ if (quote) {
267
+ if (c === '\\') { k++; continue; }
268
+ if (c === quote) quote = null;
269
+ continue;
270
+ }
271
+ if (c === '"' || c === "'" || c === '`') { quote = c; continue; }
272
+ if (c === '{' || c === '[' || c === '(') depth++;
273
+ else if (c === '}' || c === ']' || c === ')') depth--;
274
+ else if (c === ',' && depth === 0) { parts.push(inner.slice(start, k)); start = k + 1; }
275
+ }
276
+ if (inner.slice(start).trim() !== '') parts.push(inner.slice(start));
277
+ return parts;
278
+ }
279
+
280
+ // Split "key: value" on the FIRST depth-0 colon. Returns { key, value } (both
281
+ // trimmed; key unquoted) or null for a shorthand / non-key-value segment.
282
+ function splitKeyValue(segment) {
283
+ let depth = 0;
284
+ let quote = null;
285
+ for (let k = 0; k < segment.length; k++) {
286
+ const c = segment[k];
287
+ if (quote) {
288
+ if (c === '\\') { k++; continue; }
289
+ if (c === quote) quote = null;
290
+ continue;
291
+ }
292
+ if (c === '"' || c === "'" || c === '`') { quote = c; continue; }
293
+ if (c === '{' || c === '[' || c === '(') depth++;
294
+ else if (c === '}' || c === ']' || c === ')') depth--;
295
+ else if (c === ':' && depth === 0) {
296
+ const key = segment.slice(0, k).trim().replace(/^['"`]|['"`]$/g, '');
297
+ return { key, value: segment.slice(k + 1).trim() };
298
+ }
299
+ }
300
+ return null;
301
+ }
302
+
303
+ // Top-level `key: value` entries of an object literal (depth-1), value kept as its
304
+ // raw source substring. Comments are stripped first (idempotent).
305
+ function topLevelEntries(objLiteral) {
306
+ const inner = stripComments(String(objLiteral)).trim().replace(/^\{/, '').replace(/\}$/, '');
307
+ const entries = [];
308
+ for (const seg of splitTopLevel(inner)) {
309
+ const kv = splitKeyValue(seg);
310
+ if (kv && /^[A-Za-z_$][\w$]*$/.test(kv.key)) entries.push(kv);
311
+ }
312
+ return entries;
313
+ }
314
+
315
+ // Walk a dotted path (LIMITS.TITLE, TASK_FIELD_BOUNDS.priority.min) against the
316
+ // constants map. Returns the primitive/array value or undefined.
317
+ function resolveConst(pathExpr, constants) {
318
+ let cur = constants;
319
+ for (const p of pathExpr.split('.')) {
320
+ if (cur == null || typeof cur !== 'object' || !(p in cur)) return undefined;
321
+ cur = cur[p];
322
+ }
323
+ return (cur !== null && (typeof cur !== 'object' || Array.isArray(cur))) ? cur : undefined;
324
+ }
325
+
326
+ // Resolve a scalar rule value: boolean/number/string literal, pure numeric
327
+ // arithmetic (30 * 1024 * 1024, 2_000_000), or a named constant. Undefined if
328
+ // unresolvable (a computed/dynamic expression).
329
+ function resolveScalar(expr, constants = {}) {
330
+ const s = String(expr).trim();
331
+ if (s === 'true') return true;
332
+ if (s === 'false') return false;
333
+ const str = /^(['"`])([\s\S]*)\1$/.exec(s);
334
+ if (str) return str[2];
335
+ if (NUMERIC_ARITH_RE.test(s) && /\d/.test(s)) {
336
+ try {
337
+ // Safe: charset-restricted to digits/separators/operators/parens — no identifiers.
338
+ const v = Function('"use strict"; return (' + s.replace(/_/g, '') + ');')();
339
+ if (typeof v === 'number' && Number.isFinite(v)) return v;
340
+ } catch { /* not a number after all */ }
341
+ return undefined;
342
+ }
343
+ if (/^[A-Za-z_$][\w$]*(\.[A-Za-z_$][\w$]*)*$/.test(s)) return resolveConst(s, constants);
344
+ return undefined;
345
+ }
346
+
347
+ // Resolve an array rule value (enum): a literal array of literals, or a named
348
+ // constant that resolves to such an array. All-or-nothing — if any element is
349
+ // unresolvable the enum is dropped (never emit a partial/wrong enum).
350
+ function resolveArray(expr, constants = {}) {
351
+ const s = String(expr).trim();
352
+ if (s.startsWith('[') && s.endsWith(']')) {
353
+ const out = [];
354
+ for (const seg of splitTopLevel(s.slice(1, -1))) {
355
+ if (seg.trim() === '') continue;
356
+ const v = resolveScalar(seg, constants);
357
+ if (v === undefined) return undefined;
358
+ out.push(v);
359
+ }
360
+ return out;
361
+ }
362
+ const c = resolveConst(s, constants);
363
+ return Array.isArray(c) ? c : undefined;
364
+ }
365
+
366
+ // Parse one field's rule object → the recognized, resolved constraint keys.
367
+ function parseRule(ruleLiteral, constants = {}) {
368
+ const rule = {};
369
+ if (!/^\s*\{/.test(String(ruleLiteral))) return rule; // `field: SOMETHING` non-object → unconstrained
370
+ for (const { key, value } of topLevelEntries(ruleLiteral)) {
371
+ if (key === 'required') {
372
+ if (resolveScalar(value, constants) === true) rule.required = true;
373
+ } else if (key === 'type' || key === 'itemsType') {
374
+ const v = resolveScalar(value, constants);
375
+ if (typeof v === 'string' && KNOWN_TYPES.has(v)) rule[key] = v;
376
+ } else if (key === 'enum') {
377
+ const v = resolveArray(value, constants);
378
+ if (Array.isArray(v) && v.length) rule.enum = v;
379
+ } else if (RULE_NUM_KEYS.includes(key)) {
380
+ const v = resolveScalar(value, constants);
381
+ if (typeof v === 'number' && Number.isFinite(v)) rule[key] = v;
382
+ }
383
+ }
384
+ return rule;
385
+ }
386
+
387
+ // Per-file constants map: top-level single-line `const NAME = <literal>` decls
388
+ // (numbers, arithmetic, strings, arrays of literals). Catches the file-local caps
389
+ // + enum arrays (CLAIM_OUTCOMES, INBOX_STATUS_VALUES, SECURITY_DOC_CONTENT_MAX,
390
+ // PUBLISH_BUNDLE_B64_MAX). Merged over the global constants (LIMITS).
391
+ function scanFileConstants(source) {
392
+ const out = {};
393
+ const re = /^\s*const\s+([A-Za-z_$][\w$]*)\s*=\s*([^;\n]+);?\s*$/gm;
394
+ let m;
395
+ while ((m = re.exec(source))) {
396
+ const name = m[1];
397
+ const rhs = m[2].trim();
398
+ const v = rhs.startsWith('[') ? resolveArray(rhs, out) : resolveScalar(rhs, out);
399
+ if (v !== undefined) out[name] = v;
400
+ }
401
+ return out;
402
+ }
403
+
404
+ // Global constants available to every route file: the LIMITS caps (the dominant
405
+ // referenced constant). TASK_FIELD_BOUNDS is imported (not file-local) so its
406
+ // bounds are omitted — the affected fields still emit their integer type.
407
+ function globalConstants() {
408
+ return { LIMITS: LIMITS || {} };
409
+ }
410
+
411
+ // The source line where THIS route's handler ends — the next router.<verb>(
412
+ // declaration, or +200 lines, whichever comes first. Bounds the window both the
413
+ // request- and response-shape extractors scan so they never bleed into the next
414
+ // handler.
415
+ function routeEndLine(lines, i) {
416
+ for (let j = i + 1; j < lines.length && j < i + 200; j++) {
417
+ if (/^\s*router\.(get|post|patch|put|delete)\s*\(/.test(lines[j])) return j;
418
+ if (j === i + 199) return j;
419
+ }
420
+ return lines.length;
421
+ }
422
+
423
+ // Request-body shape for a write route: does it read req.body, is it validated, and
424
+ // (best-effort) the top-level field names from its validateOrRespond/validate schema.
425
+ function extractBody(lines, i, method, constants = {}) {
426
+ if (!['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) return null;
427
+ // Window: from this route to the next route declaration (or +200 lines).
428
+ const end = routeEndLine(lines, i);
429
+ const window = stripComments(lines.slice(i, end).join('\n'));
430
+ const readsBody = /\breq\.body\b/.test(window);
431
+ const orRespond = /validateOrRespond\s*\(\s*req\s*,\s*res\s*,/.exec(window);
432
+ const lowLevel = /\bvalidate\s*\(\s*req\.body/.exec(window);
433
+ const validateCall = orRespond || lowLevel;
434
+ const fields = [];
435
+ const rules = {};
436
+ // validateOrRespond REJECTS unknown fields by default (R11/#1998); the low-level
437
+ // validate() defaults lenient. `strict` drives additionalProperties in the spec.
438
+ let strict = false;
439
+ if (validateCall) {
440
+ const after = validateCall.index + validateCall[0].length;
441
+ let lit = captureBalanced(window, after);
442
+ // captureBalanced seeks the NEXT '{' anywhere — when the third argument is
443
+ // an identifier, that grabs some unrelated later block. Only trust the
444
+ // capture when the brace directly follows the call.
445
+ if (lit && !/^\s*\{/.test(window.slice(after))) lit = null;
446
+ if (!lit) {
447
+ // Schema hoisted to a module-scope const (the boot-loud enum-spread
448
+ // pattern, task 1003057): resolve `validateOrRespond(req, res, IDENT)`
449
+ // against `const IDENT = [Object.freeze(] { … }` anywhere in the file,
450
+ // so hoisting a schema never silently drops a route from the API docs.
451
+ const ident = /^\s*([A-Za-z_$][\w$]*)\s*[,)]/.exec(window.slice(after));
452
+ if (ident) {
453
+ const whole = stripComments(lines.join('\n'));
454
+ const decl = new RegExp(`const\\s+${ident[1]}\\s*=\\s*(?:Object\\.freeze\\s*\\(\\s*)?`).exec(whole);
455
+ if (decl) lit = captureBalanced(whole, decl.index + decl[0].length);
456
+ }
457
+ }
458
+ if (lit) {
459
+ for (const { key, value } of topLevelEntries(lit)) {
460
+ if (/^\d/.test(key)) continue; // defensive: no numeric-leading field names
461
+ fields.push(key);
462
+ rules[key] = parseRule(value, constants);
463
+ }
464
+ if (orRespond) {
465
+ // The opts arg follows the schema literal; strict unless it passes
466
+ // strict:false. When the schema was resolved from a module-scope const,
467
+ // the literal is not in the window — read the call tail instead.
468
+ const litAt = window.indexOf(lit, after);
469
+ const optsWindow = litAt >= 0 ? window.slice(litAt + lit.length) : window.slice(after);
470
+ strict = !/\bstrict\s*:\s*false\b/.test(optsWindow);
471
+ }
472
+ }
473
+ }
474
+ if (!readsBody && !validateCall) return null;
475
+ return { readsBody, validated: Boolean(validateCall), fields, rules, strict };
476
+ }
477
+
478
+ // ---------------------------------------------------------------------------
479
+ // Response-shape extraction (task 2061 / ADR 0124 — type the success RESPONSE)
480
+ // ---------------------------------------------------------------------------
481
+ //
482
+ // Task 2050 typed the REQUEST body from validate(); the SUCCESS response stayed
483
+ // `any`. Routes declare no response schema, but they DO build the body inline —
484
+ // `res.json({ … })` — and that object literal IS the shape. We read it statically
485
+ // (the same captureBalanced/splitTopLevel machinery the request extractor uses),
486
+ // never executing a route. Only the KEYS are provable (a value is usually a
487
+ // variable, so it types as `unknown`); two values type safely — a boolean literal,
488
+ // and the ADR-0119 `pageMeta()` `page` block (→ the shared PageInfo component).
489
+ //
490
+ // DEGRADE-GRACEFULLY CONTRACT — never emit a shape we cannot prove:
491
+ // - a bare-value response (`res.json(row)`), a top-level spread (`{ …rest }`),
492
+ // a computed/quoted key, or an empty `{}` → the route keeps the `ApiResponse`
493
+ // alias (extractResponse returns null). We only ever NARROW `any`, never lie.
494
+
495
+ // The value expression of one response property → a JSON Schema fragment. Only two
496
+ // shapes are typed with confidence; everything else is `{}` (renders as `unknown`).
497
+ function responseValueSchema(expr) {
498
+ const v = String(expr).trim();
499
+ if (v === 'true' || v === 'false') return { type: 'boolean' };
500
+ // `!!x` and `Boolean(x)` are boolean whatever x is — the two idioms routes use
501
+ // to coerce a truthy value before returning it (task 1002430). Without this a
502
+ // handler returning `{ ok: true }` in one branch and `{ ok: !!v }` in another
503
+ // documents `ok` as untyped, which is strictly worse than the truth.
504
+ if (/^!!/.test(v) || /^Boolean\s*\(/.test(v)) return { type: 'boolean' };
505
+ if (/^pageMeta\s*\(/.test(v)) return { $ref: '#/components/schemas/PageInfo' };
506
+ return {}; // a variable / call / ternary — the KEY is the win; leave the value open
507
+ }
508
+
509
+ // Parse one `res.json({ … })` object literal → { key: valueSchema } (depth-1), or
510
+ // null if the shape can't be fully trusted (spread / non-identifier key / empty).
511
+ function parseResponseObject(objLiteral) {
512
+ const inner = stripComments(String(objLiteral)).trim().replace(/^\{/, '').replace(/\}$/, '');
513
+ const props = {};
514
+ let count = 0;
515
+ for (const seg of splitTopLevel(inner)) {
516
+ const s = seg.trim();
517
+ if (s === '') continue;
518
+ if (s.startsWith('...')) return null; // spread → unknown extra keys
519
+ const kv = splitKeyValue(s);
520
+ let key; let value;
521
+ if (kv) { key = kv.key; value = kv.value; }
522
+ else if (/^[A-Za-z_$][\w$]*$/.test(s)) { key = s; value = s; } // { foo } shorthand
523
+ else return null; // method / unparseable segment
524
+ if (!/^[A-Za-z_$][\w$]*$/.test(key)) return null; // computed/quoted key → give up
525
+ props[key] = responseValueSchema(value);
526
+ count++;
527
+ }
528
+ return count ? props : null;
529
+ }
530
+
531
+ // Merge the shapes of every success `res.json({ … })` in one handler (branches):
532
+ // union the keys; a key present in EVERY branch is required, others optional; a
533
+ // value schema is kept only where all branches agree (else it opens to `unknown`).
534
+ function mergeResponseShapes(shapes) {
535
+ const order = [];
536
+ const byKey = {};
537
+ for (const shape of shapes) {
538
+ for (const [key, schema] of Object.entries(shape)) {
539
+ if (!byKey[key]) { byKey[key] = []; order.push(key); }
540
+ byKey[key].push(schema);
541
+ }
542
+ }
543
+ const properties = {};
544
+ const required = [];
545
+ for (const key of order) {
546
+ const variants = byKey[key];
547
+ const first = JSON.stringify(variants[0]);
548
+ properties[key] = variants.every((s) => JSON.stringify(s) === first) ? variants[0] : {};
549
+ if (variants.length === shapes.length) required.push(key);
550
+ }
551
+ return { properties, required };
552
+ }
553
+
554
+ // The success-response shape for a route: scan its handler window for success
555
+ // `res.json(…)` / `res.status(2xx).json(…)` calls. Returns { properties, required }
556
+ // when EVERY success body is a provable object literal, else null (degrade).
557
+ function extractResponse(lines, i) {
558
+ const window = stripComments(lines.slice(i, routeEndLine(lines, i)).join('\n'));
559
+ const re = /\bres\s*\.\s*(?:status\s*\(\s*(\d+)\s*\)\s*\.\s*)?json\s*\(/g;
560
+ const shapes = [];
561
+ let m;
562
+ let sawSuccessJson = false;
563
+ while ((m = re.exec(window))) {
564
+ const status = m[1] ? Number(m[1]) : 200;
565
+ if (status < 200 || status > 299) continue; // error body — the envelope covers it
566
+ sawSuccessJson = true;
567
+ let k = m.index + m[0].length; // first char after '('
568
+ while (k < window.length && /\s/.test(window[k])) k++;
569
+ if (window[k] !== '{') return null; // bare value → shape unknowable
570
+ const lit = captureBalanced(window, k);
571
+ const shape = lit && parseResponseObject(lit);
572
+ if (!shape) return null; // couldn't prove the shape
573
+ shapes.push(shape);
574
+ }
575
+ if (!sawSuccessJson || !shapes.length) return null;
576
+ return mergeResponseShapes(shapes);
577
+ }
578
+
579
+ // First path segment → resource tag (tasks, me, public, …). '' → 'root'.
580
+ function tagFor(route) {
581
+ const seg = route.split('/').filter(Boolean)[0] || 'root';
582
+ return seg.replace(/[^A-Za-z0-9_-]/g, '');
583
+ }
584
+
585
+ // The full extracted model: [{ method, route, openapiPath, params, rank, tag,
586
+ // description, body, file }], stable-sorted.
587
+ // `routeFiles` is injectable so a test can drive the model over a fixture route file
588
+ // (the default is the live core + module route set).
589
+ function extractModel({ routeFiles = rrc.discoverRouteFiles() } = {}) {
590
+ const routes = [];
591
+ const globals = globalConstants();
592
+ for (const { abs, rel } of routeFiles) {
593
+ const text = fs.readFileSync(abs, 'utf8');
594
+ const lines = text.split('\n');
595
+ // Constants a validate() rule in THIS file may reference (LIMITS + file-local consts).
596
+ const constants = Object.assign({}, globals, scanFileConstants(text));
597
+ // rrc.scanDeclarations, not a second regex: the spec must enumerate EXACTLY the
598
+ // routes the ship-time gate enforces. Its own regex missed multi-line declarations,
599
+ // so 10 real endpoints (6 writes) were absent from the published contract entirely
600
+ // (BV1.R109b). An unresolvable path is skipped here and reported by checkRouteRanks.
601
+ for (const decl of rrc.scanDeclarations(text)) {
602
+ if (decl.route === null) continue;
603
+ const i = decl.line;
604
+ const method = decl.method;
605
+ const route = decl.route;
606
+ const { openapiPath, names } = pathParams(route);
607
+ // classifyGate, not classifyRank: a route migrated to requirePermission(...)
608
+ // (BV1.R104-R107) resolves through the governance catalog to its real rank
609
+ // floor, and names the authority atoms it gates on. Before BV1.R109 those
610
+ // routes documented as 'any-builder' — enforcement was correct, the LABEL lied.
611
+ const { rank, perms } = rrc.classifyGate(lines, i);
612
+ routes.push({
613
+ method,
614
+ route,
615
+ openapiPath,
616
+ params: names,
617
+ rank,
618
+ perms,
619
+ tag: tagFor(route),
620
+ description: commentBlockAbove(lines, i),
621
+ body: extractBody(lines, i, method, constants),
622
+ response: extractResponse(lines, i),
623
+ file: rel,
624
+ });
625
+ }
626
+ }
627
+ routes.sort((a, b) =>
628
+ a.openapiPath.localeCompare(b.openapiPath)
629
+ || METHOD_ORDER.indexOf(a.method.toLowerCase()) - METHOD_ORDER.indexOf(b.method.toLowerCase())
630
+ || a.file.localeCompare(b.file));
631
+ return routes;
632
+ }
633
+
634
+ // ---------------------------------------------------------------------------
635
+ // OpenAPI 3.1 assembly
636
+ // ---------------------------------------------------------------------------
637
+
638
+ function operationId(method, openapiPath) {
639
+ const slug = openapiPath.replace(/[{}]/g, '').replace(/[^A-Za-z0-9]+/g, '_').replace(/^_|_$/g, '');
640
+ return `${method.toLowerCase()}_${slug || 'root'}`;
641
+ }
642
+
643
+ function pascalCase(s) {
644
+ return String(s).split(/[^A-Za-z0-9]+/).filter(Boolean)
645
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join('');
646
+ }
647
+
648
+ // A body field whose validate() rule declared NO type but whose name is a resource
649
+ // id: task_id/builder_id/parent_task_id/… These are Postgres bigint PKs left untyped
650
+ // on purpose (R11/#1998 — they arrive as a JSON number OR a stringified integer).
651
+ // Give them the shared StringifiableId schema instead of degrading to `{}`.
652
+ // version_id is excluded (it is a text slug and always declares type:'string', so it
653
+ // never reaches the untyped branch — the guard is belt-and-braces).
654
+ function isIdField(field) {
655
+ return field !== 'version_id' && (field === 'id' || /_id$/.test(field));
656
+ }
657
+
658
+ // ruleToSchema(field, rule) — one field's parsed rule → a JSON Schema fragment.
659
+ function ruleToSchema(field, rule) {
660
+ if (!rule.type) {
661
+ if (isIdField(field)) return { $ref: '#/components/schemas/StringifiableId' };
662
+ return rule.enum ? { enum: rule.enum } : {}; // untyped, non-id → unconstrained
663
+ }
664
+ const s = {};
665
+ if (rule.type === 'integer' || rule.type === 'number') {
666
+ s.type = rule.type;
667
+ if (rule.min != null) s.minimum = rule.min;
668
+ if (rule.max != null) s.maximum = rule.max;
669
+ } else if (rule.type === 'string') {
670
+ s.type = 'string';
671
+ if (rule.minLength != null) s.minLength = rule.minLength;
672
+ if (rule.maxLength != null) s.maxLength = rule.maxLength;
673
+ } else if (rule.type === 'array') {
674
+ s.type = 'array';
675
+ if (rule.itemsType) s.items = { type: rule.itemsType };
676
+ if (rule.maxItems != null) s.maxItems = rule.maxItems;
677
+ } else {
678
+ s.type = rule.type; // boolean | object
679
+ }
680
+ if (rule.enum) s.enum = rule.enum;
681
+ return s;
682
+ }
683
+
684
+ // requestSchemaFor(r) — the JSON Schema for a write route's body, plus a component
685
+ // name when it carries declared fields (so it lands in components.schemas and the
686
+ // operation references it by $ref). A body with no declared fields (an undocumented
687
+ // or schema-less body) stays an inline open object with no named component.
688
+ function requestSchemaFor(r) {
689
+ const rules = r.body.rules || {};
690
+ const fields = r.body.fields || [];
691
+ if (!fields.length) return { schema: { type: 'object', additionalProperties: true } };
692
+ const properties = {};
693
+ const required = [];
694
+ for (const f of fields) {
695
+ const rule = rules[f] || {};
696
+ properties[f] = ruleToSchema(f, rule);
697
+ if (rule.required) required.push(f);
698
+ }
699
+ const schema = { type: 'object', properties };
700
+ if (required.length) schema.required = required;
701
+ // A validated strict route rejects unknown fields; a lenient/undeclared one allows them.
702
+ schema.additionalProperties = r.body.validated ? !r.body.strict : true;
703
+ return { schema, componentName: pascalCase(operationId(r.method, r.openapiPath)) + 'Request', required };
704
+ }
705
+
706
+ // The reusable component schemas every spec carries (task 2050): the ADR-0116 error
707
+ // envelope + its inner object, and the pg-bigint id convention.
708
+ function baseComponentSchemas() {
709
+ return {
710
+ ApiErrorObject: {
711
+ type: 'object',
712
+ required: ['code', 'message'],
713
+ properties: {
714
+ code: { type: 'string', description: 'Stable machine-readable slug the caller may switch on (e.g. `task_not_found`). Classified into a category (`x-error-categories`); the specific slug is preserved (ADR 0116).' },
715
+ message: { type: 'string', description: 'Human-readable, safe to surface. Never leaks internals unless a handler opts in.' },
716
+ details: { description: 'Optional structured payload — e.g. the validator\'s `[{ field, reason }]` list.' },
717
+ },
718
+ description: 'The inner error object carried by every non-2xx response.',
719
+ },
720
+ ErrorEnvelope: {
721
+ type: 'object',
722
+ required: ['error'],
723
+ properties: { error: { $ref: '#/components/schemas/ApiErrorObject' } },
724
+ description: 'The single error shape returned by EVERY non-2xx response (ADR 0116). A caller reads `error.code`.',
725
+ },
726
+ StringifiableId: {
727
+ type: ['integer', 'string'],
728
+ description: 'A resource id — an integer, or its stringified form (a Postgres bigint serializes as a JSON string, so ids may arrive either way). Accept both.',
729
+ },
730
+ PageInfo: {
731
+ type: 'object',
732
+ required: ['limit', 'offset'],
733
+ properties: {
734
+ limit: { type: 'integer', description: 'Page size actually applied (clamped to the endpoint cap, ADR 0119).' },
735
+ offset: { type: 'integer', description: 'Zero-based row offset of this page.' },
736
+ total: { type: 'integer', description: 'Total matching rows, when cheaply countable; derive "more pages" via `offset + items.length < total`.' },
737
+ },
738
+ description: 'The `page` block of a paginated list response (ADR 0119), built by `pageMeta()`.',
739
+ },
740
+ };
741
+ }
742
+
743
+ // The reusable error responses (ADR 0116) — the envelope, referenced by every
744
+ // non-2xx. Defined ONCE in components.responses; each operation $refs the right one
745
+ // (keeps the committed spec lean instead of inlining the body on 200+ routes).
746
+ function baseComponentResponses() {
747
+ const body = { content: { 'application/json': { schema: { $ref: '#/components/schemas/ErrorEnvelope' } } } };
748
+ return {
749
+ BadRequest: { description: 'Malformed or invalid request (the ADR-0116 error envelope).', ...body },
750
+ ValidationFailed: { description: 'Request body failed schema validation; `error.details` lists the field errors.', ...body },
751
+ Unauthorized: { description: 'No or invalid session.', ...body },
752
+ Forbidden: { description: 'Authenticated but rank/ownership too low for this route.', ...body },
753
+ NotFound: { description: 'The referenced resource does not exist.', ...body },
754
+ };
755
+ }
756
+
757
+ function buildOperation(r, stats, schemas) {
758
+ const op = {
759
+ operationId: operationId(r.method, r.openapiPath),
760
+ tags: [r.tag],
761
+ summary: `${r.method} ${routeForDisplay(r.route)}`,
762
+ description: (r.description ? r.description + '\n\n' : '')
763
+ + `**Rank:** \`${r.rank}\` — ${RANK_BLURB[r.rank] || RANK_BLURB.unknown}`
764
+ + (r.perms && r.perms.length ? `\n\n**Permissions:** \`${r.perms.join('`, `')}\` (all required).` : ''),
765
+ 'x-rank': r.rank,
766
+ 'x-source': r.file,
767
+ };
768
+ // The authority ATOMS a migrated route gates on (ADR 0151). Absent on a route still
769
+ // gated by rank, so today's spec is byte-identical until BV1.R104-R107 land.
770
+ if (r.perms && r.perms.length) op['x-permissions'] = r.perms;
771
+ if (r.params.length) {
772
+ op.parameters = r.params.map((name) => ({
773
+ name, in: 'path', required: true, schema: { type: 'string' },
774
+ description: `Path parameter \`${name}\`.`,
775
+ }));
776
+ }
777
+ if (r.body) {
778
+ const { schema, componentName, required } = requestSchemaFor(r);
779
+ let bodySchema = schema;
780
+ if (componentName) {
781
+ schemas[componentName] = schema; // land it in components.schemas
782
+ bodySchema = { $ref: '#/components/schemas/' + componentName };
783
+ }
784
+ op.requestBody = {
785
+ // A body is REQUIRED when the schema declares at least one required field.
786
+ required: Boolean(required && required.length),
787
+ content: { 'application/json': { schema: bodySchema } },
788
+ 'x-validated': r.body.validated,
789
+ };
790
+ if (!r.body.validated) {
791
+ op.requestBody['x-body-undocumented'] = true;
792
+ stats.undocumentedBodies++;
793
+ }
794
+ }
795
+ const responses = { 200: { description: 'Success.' } };
796
+ // task 2061: attach the statically-proven success shape (from res.json({…})) to
797
+ // 200 as a named component, so the generated client types the return concretely.
798
+ if (r.response && Object.keys(r.response.properties).length) {
799
+ const componentName = pascalCase(operationId(r.method, r.openapiPath)) + 'Response';
800
+ const schema = { type: 'object', properties: r.response.properties };
801
+ if (r.response.required.length) schema.required = r.response.required;
802
+ schemas[componentName] = schema;
803
+ responses[200] = { description: 'Success.', content: { 'application/json': { schema: { $ref: '#/components/schemas/' + componentName } } } };
804
+ stats.responseSchemas++;
805
+ }
806
+ responses[400] = { $ref: (r.body && r.body.validated) ? '#/components/responses/ValidationFailed' : '#/components/responses/BadRequest' };
807
+ if (r.rank !== 'public') {
808
+ responses[401] = { $ref: '#/components/responses/Unauthorized' };
809
+ responses[403] = { $ref: '#/components/responses/Forbidden' };
810
+ }
811
+ if (r.params.length) responses[404] = { $ref: '#/components/responses/NotFound' };
812
+ op.responses = responses;
813
+ op.security = r.rank === 'public' ? [] : [{ builderSession: [] }];
814
+ return op;
815
+ }
816
+
817
+ function buildOpenapi(model) {
818
+ const stats = { undocumentedBodies: 0, responseSchemas: 0 };
819
+ const schemas = baseComponentSchemas();
820
+ const paths = {};
821
+ for (const r of model) {
822
+ if (!paths[r.openapiPath]) paths[r.openapiPath] = {};
823
+ paths[r.openapiPath][r.method.toLowerCase()] = buildOperation(r, stats, schemas);
824
+ }
825
+ // Deterministic key order for components.schemas (base + per-operation request schemas).
826
+ const sortedSchemas = {};
827
+ for (const k of Object.keys(schemas).sort()) sortedSchemas[k] = schemas[k];
828
+ // Stable key order for paths (already sorted in model, but rebuild explicitly).
829
+ const sortedPaths = {};
830
+ for (const p of Object.keys(paths).sort()) sortedPaths[p] = paths[p];
831
+
832
+ const tags = [...new Set(model.map((r) => r.tag))].sort()
833
+ .map((name) => ({ name, description: `Endpoints under \`${API_PREFIX}/${name}\`.` }));
834
+
835
+ const spec = {
836
+ openapi: '3.1.0',
837
+ info: {
838
+ title: `${productName()} — Bongos API`,
839
+ version: specVersion(),
840
+ license: { name: 'AGPL-3.0-or-later', url: 'https://www.gnu.org/licenses/agpl-3.0.html' },
841
+ description: [
842
+ `The Bongos API — the build-methodology backend`,
843
+ `(builders, tasks, claims, credits, grading, memory).`,
844
+ ``,
845
+ `**API version:** \`${API_VERSION}\` — served at \`${VERSIONED_API_PREFIX}\`. The`,
846
+ `unversioned \`${API_PREFIX}\` and legacy \`/api/gds\` are permanent aliases`,
847
+ `pinned to this version; pin to \`${VERSIONED_API_PREFIX}\` for a stable`,
848
+ `contract (breaking changes ship a new \`/vN\`, ADR 0117). This is the`,
849
+ `CONTRACT version, distinct from the package build in \`info.version\`.`,
850
+ ``,
851
+ `**Base path:** \`${API_PREFIX}\` (every path below is relative to it).`,
852
+ ``,
853
+ `**Auth:** a builder session — the \`gds_session\` cookie (web) or`,
854
+ `\`Authorization: Bearer <token>\` (CLI). **Ranks** gate writes and are`,
855
+ `enforced server-side per request, never cached (ADR 0016):`,
856
+ `\`public\` < \`any-builder\` < \`metic+archon\` < \`archon\`.`,
857
+ `Each operation carries its required rank in \`x-rank\`.`,
858
+ ``,
859
+ `Generated from the live route files by \`scripts/bongos/gen-api-docs.js\` —`,
860
+ `do not hand-edit; it regenerates on every ship.`,
861
+ ].join('\n'),
862
+ },
863
+ 'x-api-version': API_VERSION, // the explicit contract version (ADR 0117)
864
+ servers: [
865
+ { url: VERSIONED_API_PREFIX, description: 'Versioned API base (same-origin) — pin here for a stable contract.' },
866
+ { url: API_PREFIX, description: 'Unversioned alias (permanent) — resolves to the current version.' },
867
+ ],
868
+ tags,
869
+ paths: sortedPaths,
870
+ components: {
871
+ securitySchemes: {
872
+ builderSession: {
873
+ type: 'apiKey',
874
+ in: 'cookie',
875
+ name: 'gds_session',
876
+ description: 'Builder session. Web clients send the `gds_session` cookie; '
877
+ + 'CLI clients send `Authorization: Bearer <token>`. Rank is resolved from '
878
+ + 'the live builder record on every request (ADR 0016).',
879
+ },
880
+ },
881
+ schemas: sortedSchemas,
882
+ responses: baseComponentResponses(),
883
+ },
884
+ // The error-code taxonomy (ADR 0116): every non-2xx `error.code` classifies onto
885
+ // one of these categories, each with a default status + retriable flag. Sourced
886
+ // from the kernel registry (src/bongos/api-errors.js) so docs can't drift from it.
887
+ 'x-error-categories': apiErrors.CATEGORIES,
888
+ 'x-endpoint-count': model.length,
889
+ 'x-schema-count': Object.keys(sortedSchemas).length,
890
+ 'x-undocumented-bodies': stats.undocumentedBodies,
891
+ 'x-response-schemas': stats.responseSchemas,
892
+ 'x-generated-by': 'scripts/bongos/gen-api-docs.js',
893
+ };
894
+ return spec;
895
+ }
896
+
897
+ // ---------------------------------------------------------------------------
898
+ // Markdown reference
899
+ // ---------------------------------------------------------------------------
900
+
901
+ const MD_BANNER = '<!-- GENERATED by scripts/bongos/gen-api-docs.js — do not hand-edit. Run `node scripts/bongos/gen-api-docs.js`. -->';
902
+
903
+ function shortDesc(d) {
904
+ if (!d) return '';
905
+ const first = d.split(/(?<=\.)\s/)[0];
906
+ return (first.length > 140 ? first.slice(0, 137) + '…' : first).replace(/\|/g, '\\|');
907
+ }
908
+
909
+ function buildReferenceMd(model, spec) {
910
+ const L = [];
911
+ L.push(MD_BANNER);
912
+ L.push('');
913
+ L.push('# Bongos API reference');
914
+ L.push('');
915
+ L.push(`> **Generated from the live route files** — the route file is authoritative. ${model.length} endpoints across ${new Set(model.map((r) => r.file)).size} route files.`);
916
+ L.push('> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).');
917
+ L.push('');
918
+ L.push(`Base path: \`${API_PREFIX}\`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): \`public\` < \`any-builder\` < \`metic+archon\` < \`archon\`.`);
919
+ L.push('');
920
+ const byTag = new Map();
921
+ for (const r of model) {
922
+ if (!byTag.has(r.tag)) byTag.set(r.tag, []);
923
+ byTag.get(r.tag).push(r);
924
+ }
925
+ for (const tag of [...byTag.keys()].sort()) {
926
+ const rows = byTag.get(tag);
927
+ L.push(`## \`${tag}\` (${rows.length})`);
928
+ L.push('');
929
+ L.push('| Method | Path | Rank | Body | Description |');
930
+ L.push('|---|---|---|---|---|');
931
+ for (const r of rows) {
932
+ const body = r.body
933
+ ? (r.body.validated
934
+ ? (r.body.fields.length ? '`' + r.body.fields.join('`, `') + '`' : 'validated')
935
+ : '_undocumented_')
936
+ : '—';
937
+ L.push(`| ${r.method} | \`${API_PREFIX}${routeForDisplay(r.route)}\` | \`${r.rank}\` | ${body} | ${shortDesc(r.description)} |`);
938
+ }
939
+ L.push('');
940
+ }
941
+ if (spec['x-undocumented-bodies'] > 0) {
942
+ L.push('---');
943
+ L.push('');
944
+ L.push(`> ${spec['x-undocumented-bodies']} write endpoint(s) take a JSON body with no declared validator schema — their fields are not yet machine-documented. Adding a \`validateOrRespond\` schema (\`src/bongos/routes/_helpers.js\`) surfaces them here automatically.`);
945
+ L.push('');
946
+ }
947
+ return L.join('\n') + '\n';
948
+ }
949
+
950
+ function buildPermissionsStub() {
951
+ return [
952
+ MD_BANNER,
953
+ '',
954
+ '# Routes & permissions — moved',
955
+ '',
956
+ '> This hand-maintained mirror has been **retired**. Every endpoint and its rank gate',
957
+ '> is now generated from the live route files.',
958
+ '',
959
+ // task 1004866: the two generated files are gitignored in the core, so they are named
960
+ // as paths, not linked — a link to an absent file is a stale link in a fresh clone.
961
+ '- **Full endpoint + permission reference:** `docs/api-reference.md` (generated, not committed)',
962
+ '- **Machine-readable spec (OpenAPI 3.1):** `docs/api/openapi.json` (generated, not committed)',
963
+ '- **Rendered docs site:** **`/docs`** (e.g. `cloudbongos.com/docs`)',
964
+ '- **Rank-ladder model:** [`docs/canonical-permissions.md`](canonical-permissions.md) · [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)',
965
+ '',
966
+ 'Build both, and the typed client, with `node scripts/bongos/api-artifacts.js`.',
967
+ '',
968
+ ].join('\n');
969
+ }
970
+
971
+ // ---------------------------------------------------------------------------
972
+ // Built-in structural OpenAPI 3.1 validator (no external dep)
973
+ // ---------------------------------------------------------------------------
974
+
975
+ function validateOpenapi(spec) {
976
+ const problems = [];
977
+ if (spec.openapi !== '3.1.0') problems.push(`openapi must be '3.1.0' (got ${JSON.stringify(spec.openapi)})`);
978
+ if (!spec.info || typeof spec.info.title !== 'string' || !spec.info.title) problems.push('info.title missing');
979
+ if (!spec.info || typeof spec.info.version !== 'string' || !spec.info.version) problems.push('info.version missing');
980
+ if (!spec.paths || typeof spec.paths !== 'object') problems.push('paths missing');
981
+ const schemes = (spec.components && spec.components.securitySchemes) || {};
982
+ for (const [p, item] of Object.entries(spec.paths || {})) {
983
+ if (!p.startsWith('/')) problems.push(`path ${p} must start with '/'`);
984
+ for (const [method, op] of Object.entries(item)) {
985
+ if (!METHOD_ORDER.includes(method)) problems.push(`${p}: unexpected method ${method}`);
986
+ if (!op.responses || Object.keys(op.responses).length === 0) problems.push(`${method.toUpperCase()} ${p}: no responses`);
987
+ for (const param of op.parameters || []) {
988
+ if (!param.name || !param.in) problems.push(`${method.toUpperCase()} ${p}: malformed parameter`);
989
+ }
990
+ for (const req of op.security || []) {
991
+ for (const name of Object.keys(req)) {
992
+ if (!schemes[name]) problems.push(`${method.toUpperCase()} ${p}: security scheme '${name}' not defined in components`);
993
+ }
994
+ }
995
+ }
996
+ }
997
+ // Every local $ref under paths/components must resolve to a defined component
998
+ // (schema or response) — a dangling $ref is a broken contract (task 2050).
999
+ const definedSchemas = new Set(Object.keys((spec.components && spec.components.schemas) || {}));
1000
+ const definedResponses = new Set(Object.keys((spec.components && spec.components.responses) || {}));
1001
+ const seen = [];
1002
+ (function collectRefs(node) {
1003
+ if (!node || typeof node !== 'object') return;
1004
+ if (typeof node.$ref === 'string') seen.push(node.$ref);
1005
+ for (const v of Object.values(node)) collectRefs(v);
1006
+ })({ paths: spec.paths, components: spec.components });
1007
+ for (const ref of seen) {
1008
+ const sm = /^#\/components\/schemas\/(.+)$/.exec(ref);
1009
+ const rm = /^#\/components\/responses\/(.+)$/.exec(ref);
1010
+ if (sm) { if (!definedSchemas.has(sm[1])) problems.push(`$ref '${ref}' does not resolve to a defined component schema`); }
1011
+ else if (rm) { if (!definedResponses.has(rm[1])) problems.push(`$ref '${ref}' does not resolve to a defined component response`); }
1012
+ else problems.push(`unsupported $ref (only #/components/{schemas,responses}/* is emitted): ${ref}`);
1013
+ }
1014
+ return problems;
1015
+ }
1016
+
1017
+ // ---------------------------------------------------------------------------
1018
+ // Main
1019
+ // ---------------------------------------------------------------------------
1020
+
1021
+ function build() {
1022
+ const model = extractModel();
1023
+ const spec = buildOpenapi(model);
1024
+ return {
1025
+ model,
1026
+ spec,
1027
+ files: [
1028
+ // committed:false (task 1004866) — gitignored, rebuilt by every consumer from the
1029
+ // routes (scripts/bongos/api-artifacts.js), so --check has no committed copy to compare.
1030
+ { full: OPENAPI_PATH, rel: 'docs/api/openapi.json', content: JSON.stringify(spec, null, 2) + '\n', committed: false },
1031
+ { full: REFERENCE_PATH, rel: 'docs/api-reference.md', content: buildReferenceMd(model, spec), committed: false },
1032
+ { full: PERMISSIONS_PATH, rel: 'docs/routes-permissions.md', content: buildPermissionsStub(), committed: true },
1033
+ ],
1034
+ };
1035
+ }
1036
+
1037
+ function main() {
1038
+ const args = process.argv.slice(2);
1039
+ const checkOnly = args.includes('--check');
1040
+ const jsonOnly = args.includes('--json');
1041
+
1042
+ const { model, spec, files } = build();
1043
+
1044
+ if (jsonOnly) {
1045
+ console.log(JSON.stringify({ endpoints: model.length, undocumentedBodies: spec['x-undocumented-bodies'], model }, null, 2));
1046
+ return;
1047
+ }
1048
+
1049
+ // Always structurally validate — a malformed spec is a hard failure in both modes.
1050
+ const problems = validateOpenapi(spec);
1051
+ if (problems.length) {
1052
+ console.error('gen-api-docs: generated spec is NOT valid OpenAPI 3.1:');
1053
+ for (const p of problems) console.error(' - ' + p);
1054
+ process.exit(1);
1055
+ }
1056
+
1057
+ if (checkOnly) {
1058
+ // Generation succeeded and the spec validated above. The spec + reference are not
1059
+ // committed (task 1004866), so only the committed pointer stub is compared on disk.
1060
+ const stale = files.filter((f) => f.committed).filter((f) => {
1061
+ let cur = null;
1062
+ try { cur = fs.readFileSync(f.full, 'utf8'); } catch { return true; /* missing → stale */ }
1063
+ return !sameContent(cur, f.content);
1064
+ });
1065
+ if (stale.length) {
1066
+ console.error(`gen-api-docs --check: STALE — would update ${stale.map((f) => f.rel).join(', ')}. Run \`node scripts/bongos/gen-api-docs.js\` and commit.`);
1067
+ process.exit(2);
1068
+ }
1069
+ console.log(`gen-api-docs --check: generation OK (${model.length} endpoints, ${spec['x-undocumented-bodies']} undocumented bodies).`);
1070
+ return;
1071
+ }
1072
+
1073
+ fs.mkdirSync(path.dirname(OPENAPI_PATH), { recursive: true });
1074
+ for (const f of files) fs.writeFileSync(f.full, f.content);
1075
+ console.log(`gen-api-docs: wrote ${files.length} files — ${model.length} endpoints, ${spec['x-undocumented-bodies']} undocumented bodies.`);
1076
+ }
1077
+
1078
+ if (require.main === module) main();
1079
+
1080
+ module.exports = {
1081
+ extractModel,
1082
+ buildOpenapi,
1083
+ buildReferenceMd,
1084
+ buildPermissionsStub,
1085
+ validateOpenapi,
1086
+ commentBlockAbove,
1087
+ pathParams,
1088
+ routeForDisplay,
1089
+ captureBalanced,
1090
+ topLevelKeys,
1091
+ topLevelEntries,
1092
+ splitTopLevel,
1093
+ splitKeyValue,
1094
+ resolveScalar,
1095
+ resolveArray,
1096
+ resolveConst,
1097
+ parseRule,
1098
+ scanFileConstants,
1099
+ ruleToSchema,
1100
+ requestSchemaFor,
1101
+ isIdField,
1102
+ pascalCase,
1103
+ extractBody,
1104
+ routeEndLine,
1105
+ responseValueSchema,
1106
+ parseResponseObject,
1107
+ mergeResponseShapes,
1108
+ extractResponse,
1109
+ build,
1110
+ API_PREFIX,
1111
+ };