@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
@@ -1,1477 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ // scripts/gds/government-walk.js — @bongos-forwarder (task 1004848). Generated by
3
+ // scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
+ // The real script is scripts/bongos/government-walk.js. This forwarder keeps callers that still name
5
+ // the old path working, and warns once so they get repointed. Task 1003706 removes it.
2
6
  'use strict';
3
-
4
- // scripts/gds/government-walk.js — THE GOVERNMENT WALK: one repeatable end-to-end
5
- // pass over a throwaway test project's government, producing a pass/fail table
6
- // (task 1004658, goal 1000111, criterion gov-proven-and-kept-proven).
7
- //
8
- // WHAT IT WALKS, in nine sections:
9
- // 1. Genesis — start founding, decide with a chosen government, close all five
10
- // stages, come alive; the constitution reads as the choice.
11
- // 2. Every available form (Monarchy / BDFL, Timocratic Republic, Direct Democracy,
12
- // Foundation with a council rank) plus the two pass rules no form uses
13
- // (majority, unanimous): switch to it through a charter amendment, then confirm
14
- // who can vote and what passes.
15
- // 3. Every building: set it to decide by vote (a decision-rules amendment), try to
16
- // act alone on each of its bound routes (refused), restore it (reachable again).
17
- // 4. Every matter action: open the matter, pass it, confirm the effect happened.
18
- // 5. Laws (task 1004719): proposed, passed by the board in force, read into every
19
- // session (the government port GET /me carries), a lock refused on write and
20
- // applied on read, repealed; strictness presets switched by one vote each.
21
- // 6. Leads and build-outs: a Lead appointed by a People vote, then under each
22
- // form of government what the Lead may build at once and what goes to a vote.
23
- // 7. Asks: the shape enforced, ask_required for an AI session's blocker, the ask
24
- // routed to its seat and passed on, and GET /government/counts agreeing with
25
- // the docket and the hall's own count rule.
26
- // 8. The treasury: a pot given, run dry, the sweep files one borrow, answered once.
27
- // 9. Positions: the seats GET /me carries and the governing tab they gate; the
28
- // Lead removed by a vote; nothing the walk put up is left standing.
29
- //
30
- // HOW REAL IT IS. Every request is real HTTP through the real routers (government,
31
- // onboarding/genesis, and every building's own router), with the real
32
- // requirePermission gate resolving the real government port, and every decision is
33
- // the real code: the board, membership, the tally, the close, the charter apply
34
- // (written to a throwaway instance folder), the decision-rules apply, act-alone, and
35
- // each module's matter act. What is NOT real is the storage under them: there is no
36
- // Postgres on the machine this was built on, so the government module's db layer is
37
- // an in-memory fake with the same row shapes and the same guards (one open sitting
38
- // per subject, one vote per member, single-winner close, the decision-rules write
39
- // only from a passed decision-rules amendment), and the few writes a passed matter
40
- // makes into other modules are recorded in memory instead of written to a database
41
- // (or, for a gate approval, sent to GitHub). The table says which mode ran.
42
- //
43
- // Usage:
44
- // node scripts/gds/government-walk.js run it and print the table
45
- // node scripts/gds/government-walk.js --write also write docs/governance/government-walk.md
46
- // node scripts/gds/government-walk.js --check exit 1 if the committed table differs
47
- // tests/government_walk.mjs runs --check, so a change that flips any row reds CI.
48
-
49
- const fs = require('fs');
50
- const os = require('os');
51
- const path = require('path');
52
-
53
- const ROOT = path.resolve(__dirname, '..', '..');
54
- const DOC_PATH = path.join(ROOT, 'docs', 'governance', 'government-walk.md');
55
-
56
- // Bugs this walk found, filed as tasks under goal 1000111. A FAIL row names its task
57
- // so the table reads as a worklist; a row that starts passing again just passes.
58
- const KNOWN_BUGS = Object.freeze({});
59
-
60
- // ── the throwaway project ───────────────────────────────────────────────────
61
-
62
- // The test project's people. 42 founds it. 47 left the project; it only ever
63
- // authors the probe ideas, so no probe is decided by its own author.
64
- const BUILDERS = Object.freeze([
65
- { id: '42', rank: 'archon', github_login: 'ada', display_name: 'Ada (founder)', status: 'active' },
66
- { id: '43', rank: 'metic', github_login: 'ben', display_name: 'Ben', status: 'active' },
67
- { id: '44', rank: 'metic', github_login: 'cy', display_name: 'Cy', status: 'active' },
68
- { id: '45', rank: 'thetes', github_login: 'dee', display_name: 'Dee', status: 'active' },
69
- { id: '46', rank: 'xenos', github_login: 'eve', display_name: 'Eve', status: 'active' },
70
- { id: '47', rank: 'xenos', github_login: 'fay', display_name: 'Fay (left)', status: 'left' },
71
- ]);
72
- const ACTIVE_IDS = BUILDERS.filter((b) => b.status === 'active').map((b) => b.id);
73
- const FOUNDER = '42';
74
- const COUNCIL = ['43', '44'];
75
-
76
- // Each bound route as a request that, as today, stops in its handler's own first
77
- // check (a bad id or body) before any database write — the same requests as
78
- // tests/government_act_alone_buildings.mjs, with People's two carrying a real
79
- // custom rank and builder of this project.
80
- const BAD = 'x';
81
- const REQUESTS = Object.freeze({
82
- 'PATCH /project-settings/rot-days': ['PATCH', '/project-settings/rot-days', { days: 'soon' }],
83
- 'PATCH /project-settings/ship-mode': ['PATCH', '/project-settings/ship-mode', { mode: 'sometimes' }],
84
- 'PATCH /project-settings/tweak-autopickup': ['PATCH', '/project-settings/tweak-autopickup', { mode: 'sometimes' }],
85
- 'PATCH /project-settings/spend-cap': ['PATCH', '/project-settings/spend-cap', { usd: 'lots' }],
86
- 'PATCH /work-categories/:id': ['PATCH', `/work-categories/${BAD}`, {}],
87
- 'POST /security/reports/:id/confirm': ['POST', `/security/reports/${BAD}/confirm`, {}],
88
- 'POST /security/reports/:id/dispute': ['POST', `/security/reports/${BAD}/dispute`, {}],
89
- 'POST /security/reports/:id/fix': ['POST', `/security/reports/${BAD}/fix`, {}],
90
- 'POST /government/assignments': ['POST', '/government/assignments', { builder_id: 46, rank_key: 'tester' }],
91
- 'DELETE /government/assignments/:builderId/:rankKey': ['DELETE', '/government/assignments/46/tester'],
92
- 'PATCH /access-requests/:id': ['PATCH', `/access-requests/${BAD}`, { status: 'invited' }],
93
- 'POST /access-requests/invite': ['POST', '/access-requests/invite', {}],
94
- 'POST /goals': ['POST', '/goals', {}],
95
- 'POST /goals/reorder': ['POST', '/goals/reorder', {}],
96
- 'POST /work-categories': ['POST', '/work-categories', {}],
97
- 'PUT /versions/focus': ['PUT', '/versions/focus', { version_id: ' ' }],
98
- 'POST /autonomy/fence': ['POST', '/autonomy/fence', { enabled: 'yes' }],
99
- 'POST /autonomy/fence/goals': ['POST', '/autonomy/fence/goals', { goal_id: 0 }],
100
- 'DELETE /autonomy/fence/goals/:goalId': ['DELETE', `/autonomy/fence/goals/${BAD}`],
101
- 'POST /autonomy/fence/priority': ['POST', '/autonomy/fence/priority', {}],
102
- 'POST /autonomy/builders/:builderId/pause': ['POST', `/autonomy/builders/${BAD}/pause`, { paused: false }],
103
- 'POST /done-when/:criterionId/satisfy': ['POST', `/done-when/${BAD}/satisfy`, {}],
104
- 'POST /done-when/:criterionId/unsatisfy': ['POST', `/done-when/${BAD}/unsatisfy`, {}],
105
- 'POST /gate-approvals/:pr/approve': ['POST', `/gate-approvals/${BAD}/approve`, {}],
106
- 'POST /override-requests/:id/decide': ['POST', `/override-requests/${BAD}/decide`, { decision: 'approve' }],
107
- 'POST /provisioning/instances/:id/core-upgrade': ['POST', `/provisioning/instances/${BAD}/core-upgrade`, { to: '1.2.3' }],
108
- 'POST /provisioning/instances/:id/update-channel': ['POST', `/provisioning/instances/${BAD}/update-channel`, { channel: 'nightly' }],
109
- 'POST /render-deploy/act': ['POST', '/render-deploy/act', { action: 'launch' }],
110
- 'POST /npm-release/release': ['POST', '/npm-release/release', { version: 'v-next' }],
111
- 'PATCH /builders/:id/budget': ['PATCH', `/builders/${BAD}/budget`, { monthly_budget_usd: 5 }],
112
- });
113
-
114
- // Every matter action, as the matter the walk opens and passes: [area, title, action,
115
- // the effect in words]. runWalk observes each effect (its HAPPENED table).
116
- const MATTER_PLAN = Object.freeze([
117
- ['people', 'Give Eve the tester rank', { type: 'assign_rank', builder_id: 46, rank_key: 'tester' }, 'Eve holds tester'],
118
- ['people', 'Take the tester rank from Eve', { type: 'unassign_rank', builder_id: 46, rank_key: 'tester' }, 'Eve no longer holds tester'],
119
- ['people', 'Dee leads Planning', { type: 'appoint_lead', building: 'planning', builder_id: 45, charter: 'Goals, priorities and the order of work.' }, 'Dee leads Planning'],
120
- ['people', 'Planning has no Lead', { type: 'remove_lead', building: 'planning' }, 'Planning has no Lead'],
121
- ['automation', 'Switch unattended building on', { type: 'switch_on' }, 'fence on'],
122
- ['automation', 'Switch unattended building off', { type: 'switch_off' }, 'fence off'],
123
- ['automation', 'Allow goal 77 to build unattended', { type: 'allow_goal', goal_id: 77 }, 'goal 77 allowed'],
124
- ['release', 'Approve override request 5', { type: 'approve_override', request_id: 5 }, 'request 5 approved'],
125
- ['release', 'Clear the gate on PR 1500', { type: 'approve_gate', pr: 1500 }, 'PR 1500 cleared'],
126
- ['review', 'Sign off criterion 9', { type: 'satisfy_criterion', criterion_id: 9 }, 'criterion 9 satisfied'],
127
- ['treasury', 'Dee gets $50 a month', { type: 'set_budget', builder_id: 45, monthly_usd: 50 }, 'Dee\'s limit is $50'],
128
- ]);
129
-
130
- // Every router the walk drives, mounted as the server mounts them.
131
- const ROUTERS = Object.freeze([
132
- 'modules/government/routes/government.js',
133
- 'modules/onboarding/routes/onboarding.js',
134
- 'modules/autonomy/routes/autonomy.js',
135
- // no HTTP surface; it contributes the Release and Review matter acts, as at boot
136
- 'modules/lifecycle/routes/lifecycle.js',
137
- 'modules/lifecycle/routes/done-when.js',
138
- 'modules/lifecycle/routes/gate-approvals.js',
139
- 'modules/lifecycle/routes/tasks.js',
140
- 'modules/lifecycle/routes/goals.js',
141
- 'modules/lifecycle/routes/versions.js',
142
- 'modules/lifecycle/routes/project-settings.js',
143
- 'modules/render-deploy/routes/act.js',
144
- 'modules/npm-release/routes/release.js',
145
- 'modules/provisioning/routes/core-upgrade.js',
146
- 'src/bongos/routes/builders.js',
147
- 'modules/security/routes/reports.js',
148
- // the new machinery's other doors: a blocker and its ask, a builder's settings
149
- 'modules/ideas/routes/blockers.js',
150
- 'modules/builder-settings/routes/settings.js',
151
- ]);
152
-
153
- // ── the in-memory government store ──────────────────────────────────────────
154
- //
155
- // The government module's db.js, with the same row shapes and the same guards the
156
- // SQL carries. Any db function the walk did not expect throws, so a code path that
157
- // reaches storage this fake does not model shows up as a FAIL rather than a quiet
158
- // undefined.
159
- function makeStore(catalog) {
160
- const s = {
161
- seq: 100,
162
- clock: 0,
163
- builders: new Map(BUILDERS.map((b) => [b.id, { ...b }])),
164
- customRanks: new Map(),
165
- assignments: [], // { builder_id, rank_key, assigned_by }
166
- items: [],
167
- votes: [],
168
- amendments: new Map(),
169
- matters: new Map(),
170
- leads: [], // { id, building, builder_id, charter, appointed_by_item_id, removed_by_item_id, removed_at }
171
- laws: [], // { id, text, effect_on_ai, locks, proposed_by, passed_by_item_id, passed_at, repealed_by_item_id, repealed_at }
172
- buildouts: [], // { id, building, capsule, name, line, built_by, authorised_by_item_id, ground, why, started_at }
173
- rules: new Map(),
174
- ideas: new Map(),
175
- tasks: new Map(),
176
- karma: [],
177
- unexpected: [],
178
- };
179
- const next = () => String(++s.seq);
180
- const tick = () => `T${String(++s.clock).padStart(4, '0')}`;
181
- const heldRanks = (id) => {
182
- const b = s.builders.get(String(id));
183
- if (!b) return [];
184
- return [b.rank, ...s.assignments.filter((a) => a.builder_id === String(id)).map((a) => a.rank_key)];
185
- };
186
- const isLive = (b) => b && b.status === 'active';
187
- const copy = (x) => (x == null ? x : JSON.parse(JSON.stringify(x)));
188
- const withExpiry = (i) => ({ ...copy(i), expired: false, remaining_seconds: null });
189
- const voteRow = (v) => {
190
- const b = s.builders.get(v.voter_id) || {};
191
- return { ...copy(v), github_login: b.github_login || null, display_name: b.display_name || null };
192
- };
193
-
194
- const fns = {
195
- async getPermissionKeysForBuilder(id) {
196
- const keys = new Set();
197
- for (const r of heldRanks(id)) for (const k of catalog.RANK_SEED[r] || []) keys.add(k);
198
- return [...keys];
199
- },
200
- async getRankKeysForBuilder(id) { return heldRanks(id).sort(); },
201
- async getRankByKey(k) {
202
- if (catalog.RANK_SEED[k]) return { rank_key: k, label: k, is_system: true, seeded_rank: k };
203
- return copy(s.customRanks.get(k)) || null;
204
- },
205
- async createRank({ rankKey, label, description, createdBy }) {
206
- if (catalog.RANK_SEED[rankKey] || s.customRanks.has(rankKey)) throw Object.assign(new Error('dup'), { code: '23505' });
207
- const row = { rank_key: rankKey, label, description: description ?? null, is_system: false, seeded_rank: null, created_by: String(createdBy) };
208
- s.customRanks.set(rankKey, row);
209
- return copy(row);
210
- },
211
- async assignRank({ builderId, rankKey, assignedBy }) {
212
- const id = String(builderId);
213
- if (!s.builders.has(id)) throw Object.assign(new Error('fk'), { code: '23503' });
214
- if (s.assignments.some((a) => a.builder_id === id && a.rank_key === rankKey)) return false;
215
- s.assignments.push({ builder_id: id, rank_key: rankKey, assigned_by: assignedBy == null ? null : String(assignedBy) });
216
- return true;
217
- },
218
- async unassignRank({ builderId, rankKey }) {
219
- const before = s.assignments.length;
220
- s.assignments = s.assignments.filter((a) => !(a.builder_id === String(builderId) && a.rank_key === rankKey));
221
- return s.assignments.length < before;
222
- },
223
- async listAssignments() { return copy(s.assignments); },
224
- async getActiveBuildersWithRank(rankKeys) {
225
- return [...s.builders.values()]
226
- .filter((b) => isLive(b) && heldRanks(b.id).some((r) => rankKeys.includes(r)))
227
- .sort((a, b) => Number(a.id) - Number(b.id))
228
- .map((b) => ({ builder_id: b.id, github_login: b.github_login, display_name: b.display_name }));
229
- },
230
- async builderHoldsRankActive(id, rankKeys) {
231
- const b = s.builders.get(String(id));
232
- return isLive(b) && heldRanks(id).some((r) => rankKeys.includes(r));
233
- },
234
- async countActiveBuilders() { return [...s.builders.values()].filter(isLive).length; },
235
- async openBoardItem({ subjectType, subjectId, openedBy = null, constitution, windowMinutes = null }) {
236
- if (s.items.some((i) => i.subject_type === subjectType && i.subject_id === String(subjectId) && !i.closed_at)) return null;
237
- const row = {
238
- id: next(), subject_type: subjectType, subject_id: String(subjectId),
239
- opened_by: openedBy == null ? null : String(openedBy), opened_at: tick(),
240
- closes_at: windowMinutes == null ? null : `in ${windowMinutes} minutes`,
241
- closed_at: null, outcome: null, constitution: copy(constitution || {}),
242
- };
243
- s.items.push(row);
244
- return copy(row);
245
- },
246
- async getOpenBoardItem(type, subjectId) {
247
- return copy(s.items.find((i) => i.subject_type === type && i.subject_id === String(subjectId) && !i.closed_at)) || null;
248
- },
249
- async getBoardItemForVote(id) {
250
- const i = s.items.find((x) => x.id === String(id));
251
- return i ? withExpiry(i) : null;
252
- },
253
- async getBoardItemAuthor(item) {
254
- if (!item) return null;
255
- if (item.subject_type === 'full_idea') {
256
- const idea = s.ideas.get(String(item.subject_id));
257
- return idea ? idea.captured_by : null;
258
- }
259
- return item.opened_by ?? null;
260
- },
261
- async insertBoardVote({ itemId, voterId, direction, reasonMd = null, sectionKey = null }) {
262
- if (s.votes.some((v) => v.item_id === String(itemId) && v.voter_id === String(voterId))) return null;
263
- const row = { id: next(), item_id: String(itemId), voter_id: String(voterId), direction, reason_md: reasonMd, section_key: sectionKey, cast_at: tick() };
264
- s.votes.push(row);
265
- return copy(row);
266
- },
267
- async getBoardVote(itemId, voterId) {
268
- return copy(s.votes.find((v) => v.item_id === String(itemId) && v.voter_id === String(voterId))) || null;
269
- },
270
- async insertVoteKarma({ voterId, itemId, delta }) { s.karma.push({ builder_id: String(voterId), reason: `vote:${itemId}`, delta }); },
271
- async getVotesForItem(id) { return s.votes.filter((v) => v.item_id === String(id)).map(copy); },
272
- async getVotesForItems(ids) { const want = ids.map(String); return s.votes.filter((v) => want.includes(v.item_id)).map(voteRow); },
273
- async closeBoardItem({ itemId, outcome, afterClose = null }) {
274
- const i = s.items.find((x) => x.id === String(itemId) && !x.closed_at);
275
- if (!i) return null;
276
- // A transaction: the close and whatever rides it land together or not at all.
277
- const rulesBefore = new Map(s.rules);
278
- i.closed_at = tick();
279
- i.outcome = outcome;
280
- if (typeof afterClose === 'function') {
281
- try {
282
- await afterClose({ query: async () => { throw new Error('walk store: no raw SQL inside a close'); } }, copy(i));
283
- } catch (err) {
284
- i.closed_at = null;
285
- i.outcome = null;
286
- s.rules = rulesBefore;
287
- throw err;
288
- }
289
- }
290
- return copy(i);
291
- },
292
- async createAmendment({ proposed, rationaleMd = null, proposedBy, kind = 'constitution' }) {
293
- const row = { id: next(), proposed: copy(proposed), rationale_md: rationaleMd, proposed_by: String(proposedBy), kind };
294
- s.amendments.set(row.id, row);
295
- return copy(row);
296
- },
297
- async getAmendment(id) { return copy(s.amendments.get(String(id))) || null; },
298
- async listAmendmentHistory(limit = 50) {
299
- return s.items
300
- .filter((i) => i.subject_type === 'constitutional_amendment' && i.closed_at)
301
- .sort((a, b) => (a.closed_at < b.closed_at ? 1 : -1))
302
- .slice(0, limit)
303
- .map((i) => {
304
- const a = s.amendments.get(i.subject_id) || {};
305
- return {
306
- item_id: i.id, amendment_id: i.subject_id, proposed: copy(a.proposed), rationale_md: a.rationale_md,
307
- proposed_by: a.proposed_by, opened_at: i.opened_at, closed_at: i.closed_at, outcome: i.outcome,
308
- decided_under: copy(i.constitution), kind: a.kind || 'constitution',
309
- };
310
- });
311
- },
312
- async listDecisionRules() { return [...s.rules.values()].map(copy); },
313
- // The SQL's guard: written only by a PASSED decision-rules amendment item.
314
- async applyDecisionRules(_client, { itemId, rules }) {
315
- const i = s.items.find((x) => x.id === String(itemId));
316
- const a = i && s.amendments.get(i.subject_id);
317
- const allowed = i && a && i.subject_type === 'constitutional_amendment' && i.outcome === 'passed' && a.kind === 'decision_rules';
318
- if (!allowed) throw new Error(`decision rules not written (item ${itemId} is not a passed decision-rules amendment)`);
319
- for (const r of rules) {
320
- s.rules.set(r.area, { area: r.area, decided_by: r.decided_by, rule: r.rule, who: r.who, set_by_item_id: String(itemId), updated_at: tick() });
321
- }
322
- return rules.length;
323
- },
324
- async createMatter({ area, title, detailMd = null, action = null, proposedBy }) {
325
- const row = { id: next(), area, title, detail_md: detailMd, action: copy(action), proposed_by: String(proposedBy) };
326
- s.matters.set(row.id, row);
327
- return copy(row);
328
- },
329
- async getMatter(id) { return copy(s.matters.get(String(id))) || null; },
330
- // The Lead of a building (task 1004709): government_029's guard — written only
331
- // by a passed People matter whose action names this very building and builder.
332
- async listLeads({ includePast = false } = {}) {
333
- return s.leads.filter((l) => includePast || !l.removed_at).map((l) => {
334
- const b = s.builders.get(l.builder_id) || {};
335
- return { ...copy(l), github_login: b.github_login || null, display_name: b.display_name || null };
336
- });
337
- },
338
- async getActiveBuilder(id) {
339
- const b = s.builders.get(String(id));
340
- return isLive(b) ? { id: b.id, github_login: b.github_login, display_name: b.display_name } : null;
341
- },
342
- async applyLeadAct({ itemId, action }) {
343
- const i = s.items.find((x) => x.id === String(itemId));
344
- const m = i && s.matters.get(i.subject_id);
345
- const a = m && m.action;
346
- const allowed = i && a && i.subject_type === 'people_matter' && i.outcome === 'passed'
347
- && a.type === action.type && a.building === action.building
348
- && (a.type === 'remove_lead' || (String(a.builder_id) === String(action.builder_id) && a.charter === action.charter));
349
- if (!allowed) throw new Error(`lead not written (item ${itemId} is not a passed People matter that says so)`);
350
- const sitting = s.leads.find((l) => l.building === action.building && !l.removed_at) || null;
351
- if (action.type === 'remove_lead' && !sitting) return { done: false, reason: 'no_lead' };
352
- if (s.leads.some((l) => l.appointed_by_item_id === String(itemId))) return { done: true, reason: 'already_carried_out' };
353
- if (sitting) { sitting.removed_by_item_id = String(itemId); sitting.removed_at = tick(); }
354
- if (action.type === 'remove_lead') return { done: true, lead: null, ended: copy(sitting) };
355
- const row = { id: next(), building: action.building, builder_id: String(action.builder_id), charter: action.charter, appointed_by_item_id: String(itemId), appointed_at: tick(), removed_by_item_id: null, removed_at: null };
356
- s.leads.push(row);
357
- return { done: true, lead: copy(row), ended: copy(sitting) };
358
- },
359
- async getMatterSubjects(ids) { return ids.map((id) => s.matters.get(String(id))).filter(Boolean).map(copy); },
360
- // The law book (task 1004706): government_027's guard — a law is written, or
361
- // repealed, only by a PASSED laws amendment, inside the close that passes it.
362
- async listLaws({ includeRepealed = false } = {}) {
363
- return s.laws.filter((l) => includeRepealed || !l.repealed_at).map((l) => {
364
- const i = s.items.find((x) => x.id === l.passed_by_item_id) || {};
365
- const b = s.builders.get(l.proposed_by) || {};
366
- return { ...copy(l), decided_under: copy(i.constitution), proposer_login: b.github_login || null, proposer_name: b.display_name || null };
367
- });
368
- },
369
- async listYesVoters(itemIds) {
370
- const want = (itemIds || []).map(String);
371
- return s.votes.filter((v) => want.includes(v.item_id) && v.direction === 'yes').map(voteRow);
372
- },
373
- async applyLaws(_client, { itemId, enact = [], repeal = [], proposedBy = null }) {
374
- const i = s.items.find((x) => x.id === String(itemId));
375
- const a = i && s.amendments.get(i.subject_id);
376
- if (!(i && a && i.subject_type === 'constitutional_amendment' && i.outcome === 'passed' && a.kind === 'laws')) {
377
- throw new Error(`law not written (item ${itemId} is not a passed laws amendment)`);
378
- }
379
- const enacted = enact.map((law) => {
380
- const row = { id: next(), text: law.text, effect_on_ai: law.effect_on_ai ?? null, locks: copy(law.locks || []), proposed_by: proposedBy == null ? null : String(proposedBy), passed_by_item_id: String(itemId), passed_at: tick(), repealed_by_item_id: null, repealed_at: null };
381
- s.laws.push(row);
382
- return copy(row);
383
- });
384
- const repealed = [];
385
- for (const l of s.laws) {
386
- if (repeal.map(String).includes(l.id) && !l.repealed_at) {
387
- l.repealed_by_item_id = String(itemId);
388
- l.repealed_at = tick();
389
- repealed.push({ id: l.id, repealed_at: l.repealed_at });
390
- }
391
- }
392
- return { enacted, repealed };
393
- },
394
- // The owner seat: every active Archon, oldest id first.
395
- async listActiveArchons() {
396
- return [...s.builders.values()].filter((b) => isLive(b) && b.rank === 'archon')
397
- .sort((a, b) => Number(a.id) - Number(b.id))
398
- .map((b) => ({ id: b.id, github_login: b.github_login, display_name: b.display_name }));
399
- },
400
- // A Lead's build-outs (task 1004711): government_030's guard — a vote's
401
- // build-out only from a passed build_out matter that says so, and an at-once
402
- // one only with the build-rights ground that allowed it, never a district.
403
- async listBuildouts() {
404
- return s.buildouts.map((o) => {
405
- const b = s.builders.get(o.built_by) || {};
406
- return { ...copy(o), github_login: b.github_login || null, display_name: b.display_name || null };
407
- });
408
- },
409
- async listPendingBuildouts() {
410
- return s.items.filter((i) => !i.closed_at && /_matter$/.test(i.subject_type)).map((i) => {
411
- const m = s.matters.get(i.subject_id);
412
- return m && m.action && m.action.type === 'build_out'
413
- ? { item_id: i.id, matter_id: m.id, action: copy(m.action), opened_at: i.opened_at, closes_at: i.closes_at } : null;
414
- }).filter(Boolean);
415
- },
416
- async insertBuildout({ building, capsule, name, line = '', builtBy = null, itemId = null, ground = null, why = null }) {
417
- if (itemId != null) {
418
- const i = s.items.find((x) => x.id === String(itemId));
419
- const m = i && s.matters.get(i.subject_id);
420
- const a = m && m.action;
421
- const ok = i && i.outcome === 'passed' && a && a.type === 'build_out' && a.building === building && a.capsule === capsule;
422
- if (!ok) throw new Error(`build-out not written (item ${itemId} is not a passed build_out matter that says so)`);
423
- if (s.buildouts.some((o) => o.authorised_by_item_id === String(itemId))) return { done: true, reason: 'already_carried_out' };
424
- } else if (!ground || !why || capsule === 'district') {
425
- throw new Error('build-out not written (no vote and no build-rights ground)');
426
- }
427
- const row = { id: next(), building, capsule, name, line, built_by: builtBy == null ? null : String(builtBy), authorised_by_item_id: itemId == null ? null : String(itemId), ground, why, started_at: tick() };
428
- s.buildouts.push(row);
429
- return { done: true, buildout: copy(row) };
430
- },
431
- // The room's reads (the docket's charter floors and the board source).
432
- async listRanksWithGrants() {
433
- const sys = Object.keys(catalog.RANK_SEED).map((k) => ({ rank_key: k, label: k, description: null, is_system: true, seeded_rank: k, permissions: [...catalog.RANK_SEED[k]].sort() }));
434
- return sys.concat([...s.customRanks.values()].map((r) => ({ ...copy(r), permissions: [] })));
435
- },
436
- async listOpenBoardItems() { return s.items.filter((i) => !i.closed_at).map(withExpiry).reverse(); },
437
- async listClosedBoardItems(limit = 20) { return s.items.filter((i) => i.closed_at).sort((a, b) => (a.closed_at < b.closed_at ? 1 : -1)).slice(0, limit).map(copy); },
438
- async getIdeaSubjects(ids) {
439
- return ids.map(String).filter((id) => s.ideas.has(id)).map((id) => ({ id, title: `Idea ${id}`, captured_by: s.ideas.get(id).captured_by, field_values: {}, template_key: null, completeness_score: s.ideas.get(id).completeness, recommendation: null }));
440
- },
441
- async getAmendmentSubjects(ids) { return ids.map((id) => s.amendments.get(String(id))).filter(Boolean).map(copy); },
442
- async openBoardItemsAwaitingVoter(voterId) {
443
- return s.items.filter((i) => !i.closed_at).map((i) => ({
444
- id: i.id, subject_type: i.subject_type, subject_id: i.subject_id, constitution: copy(i.constitution), opened_at: i.opened_at, closes_at: i.closes_at,
445
- author_id: i.subject_type === 'full_idea' ? ((s.ideas.get(i.subject_id) || {}).captured_by || null) : i.subject_type === 'genesis_stage' ? null : i.opened_by,
446
- already_voted: s.votes.some((v) => v.item_id === i.id && v.voter_id === String(voterId)),
447
- }));
448
- },
449
- async getTaskStatuses(ids) {
450
- return ids.map(String).filter((id) => s.tasks.has(id)).map((id) => ({ id, status: s.tasks.get(id).status }));
451
- },
452
- async listLatestGenesisStageItems() {
453
- const latest = new Map();
454
- for (const i of s.items.filter((x) => x.subject_type === 'genesis_stage')) latest.set(i.subject_id, i);
455
- return [...latest.values()].map(withExpiry);
456
- },
457
- async insertAuthorRatifyKarma({ authorId, itemId, delta }) {
458
- const reason = `board.item.ratified:${itemId}`;
459
- if (s.karma.some((k) => k.reason === reason)) return false;
460
- s.karma.push({ builder_id: String(authorId), reason, delta });
461
- return true;
462
- },
463
- async getIdeaCompleteness(id) { const idea = s.ideas.get(String(id)); return idea ? idea.completeness : null; },
464
- };
465
- return { s, fns };
466
- }
467
-
468
- function installStore(govDb, fns, unexpected) {
469
- for (const k of Object.keys(govDb)) {
470
- if (typeof govDb[k] !== 'function') continue;
471
- govDb[k] = fns[k] || (async () => {
472
- unexpected.push(k);
473
- throw new Error(`walk store: unexpected db call ${k}`);
474
- });
475
- }
476
- }
477
-
478
- // The walk's fixed clock for the treasury (mid-month), so a borrow's amount, which
479
- // follows the month's pace, reads the same on every run.
480
- const TREASURY_NOW = Date.UTC(2026, 9, 15, 12);
481
- const WALK_GOAL = '77';
482
-
483
- // The other stores the new machinery reads and writes, in memory: the asks
484
- // (government_028), the pots and borrows (government_031), each builder's
485
- // personal settings (builders.behavior_prefs) and the blockers. Each fake keeps
486
- // the guard its table carries. The shared Postgres pool itself refuses every
487
- // query, so a read the walk does not model fails loudly in its own building
488
- // (a docket floor reads as unavailable) and never reaches a real database.
489
- function installSideStores(req, store) {
490
- const poolMod = req('src/bongos/pool.js');
491
- const refuse = async () => { throw new Error('walk: no database'); };
492
- poolMod.pool.query = refuse;
493
- poolMod.pool.connect = refuse;
494
-
495
- const asks = req('modules/government/asks.js');
496
- const asksDb = req('modules/government/asks-db.js');
497
- const asked = new Map(); // matter id → row
498
- asksDb.saveAsk = async ({ matterId, ask, builderId }) => {
499
- if (!asks.isMatterId(matterId)) throw Object.assign(new Error('bad matter id'), { code: 'BAD_MATTER_ID' });
500
- const row = { matter_id: matterId, question: ask.question, options: JSON.parse(JSON.stringify(ask.options)), recommend_key: ask.recommend.key, recommend_why: ask.recommend.why, waits_on: ask.waits_on, if_nobody_answers: ask.if_nobody_answers, detail: ask.detail || null, written_by: builderId == null ? null : String(builderId), written_at: new Date().toISOString() };
501
- asked.set(matterId, row);
502
- return asks.fromRow(row);
503
- };
504
- asksDb.asksFor = async (ids) => {
505
- const out = new Map();
506
- for (const id of Array.isArray(ids) ? ids : []) if (asked.has(id)) out.set(id, asks.fromRow(asked.get(id)));
507
- return out;
508
- };
509
-
510
- const treasury = req('modules/government/treasury.js');
511
- const treasuryDb = req('modules/government/treasury-db.js');
512
- const t = { goals: new Map([[WALK_GOAL, { id: WALK_GOAL, title: 'Walk goal', status: 'open' }]]), pots: new Map(), spend: new Map(), borrows: [], seq: 900 };
513
- const borrowsOf = (month) => t.borrows.filter((b) => b.month === month || b.state === 'open').map((b) => ({ ...b }));
514
- const withTitle = (b) => ({ ...b, title: (t.goals.get(b.goal_id) || {}).title || null });
515
- treasuryDb.readTreasury = async () => {
516
- const month = treasury.monthKey(TREASURY_NOW);
517
- const total = [...t.spend.values()].reduce((a, v) => a + v, 0);
518
- return treasury.buildTreasury({
519
- now: TREASURY_NOW, goals: [...t.goals.values()], pots: [...t.pots.values()],
520
- spend: { month_usd: total, last_month_usd: 0, by_goal: Object.fromEntries(t.spend) },
521
- borrows: borrowsOf(month), cap: { usd: null, source: 'default' },
522
- });
523
- };
524
- treasuryDb.goalById = async (id) => (t.goals.has(String(id)) ? { ...t.goals.get(String(id)) } : null);
525
- treasuryDb.setPot = async ({ goalId, budget, builderId }) => {
526
- const id = String(goalId);
527
- if (budget == null) return { removed: t.pots.delete(id) };
528
- const pot = { goal_id: id, budget_usd: budget, set_by: String(builderId), set_at: null };
529
- t.pots.set(id, pot);
530
- return { pot: { ...pot } };
531
- };
532
- // The real sweep's loop over the in-memory rows, with its one-open guard.
533
- treasuryDb.fileBorrows = async () => {
534
- const view = await treasuryDb.readTreasury();
535
- const filed = [];
536
- for (const pot of view.pots) {
537
- if (!treasury.needsBorrow(pot, borrowsOf(view.month), view.month)) continue;
538
- if (t.borrows.some((b) => b.goal_id === pot.goal_id && b.state === 'open')) continue;
539
- const amount = treasury.borrowAmount(pot, TREASURY_NOW);
540
- const ask = treasury.borrowAsk({ title: pot.title, amount_usd: amount, spent_usd: pot.spent_usd, budget_usd: pot.budget_usd, lent_usd: pot.lent_usd, cap: view.cap, month_usd: view.spend.month_usd });
541
- const row = { id: String(++t.seq), goal_id: pot.goal_id, month: view.month, amount_usd: amount, budget_usd: pot.budget_usd + pot.lent_usd, spent_usd: pot.spent_usd, filed_at: new Date().toISOString(), state: 'open', lent_usd: null, answer_key: null, answered_by: null, answered_at: null };
542
- t.borrows.push(row);
543
- await asksDb.saveAsk({ matterId: treasury.matterId(row.id), ask, builderId: null });
544
- filed.push({ goal_id: pot.goal_id, borrow_id: row.id, amount_usd: amount });
545
- }
546
- return filed;
547
- };
548
- treasuryDb.getBorrow = async (id) => {
549
- const b = t.borrows.find((x) => x.id === String(id));
550
- return b ? withTitle(b) : null;
551
- };
552
- // government_031's trigger: a borrow is answered once.
553
- treasuryDb.answerBorrow = async ({ id, answer, builderId }) => {
554
- const b = t.borrows.find((x) => x.id === String(id) && x.state === 'open');
555
- if (!b || !answer) return null;
556
- Object.assign(b, { state: answer.state, lent_usd: answer.lent_usd, answer_key: answer.answer_key, answered_by: String(builderId), answered_at: new Date().toISOString() });
557
- return { ...b };
558
- };
559
- treasuryDb.openBorrowRows = async () => {
560
- const open = t.borrows.filter((b) => b.state === 'open');
561
- const stored = await asksDb.asksFor(open.map((b) => treasury.matterId(b.id)));
562
- return open.map((b) => ({ row: withTitle(b), ask: stored.get(treasury.matterId(b.id)) || null }));
563
- };
564
-
565
- // Each builder's personal settings (builders.behavior_prefs).
566
- const prefs = new Map();
567
- const settingsDb = req('modules/builder-settings/db.js');
568
- settingsDb.getBuilderBehaviorPrefs = async (id) => JSON.parse(JSON.stringify(prefs.get(String(id)) || {}));
569
- settingsDb.setBuilderBehaviorPrefs = async (id, p) => { prefs.set(String(id), JSON.parse(JSON.stringify(p || {}))); return JSON.parse(JSON.stringify(p || {})); };
570
- const api = req('src/module-api.js');
571
- api.getBuilderById = async (id) => {
572
- const b = store.builders.get(String(id));
573
- return b ? { id: Number(b.id), rank: b.rank, github_login: b.github_login, display_name: b.display_name, status: b.status } : null;
574
- };
575
-
576
- // The blockers (ideas): open ones are the docket's Planning matters.
577
- const blockers = req('modules/ideas/blockers.js');
578
- const filedBlockers = [];
579
- blockers.createBlocker = async ({ title, bodyMd, source, sourceRef }) => {
580
- const row = { id: String(++t.seq), title, body_md: bodyMd || '', status: 'open', created_at: new Date().toISOString(), source: source || null, source_ref: sourceRef || null, blocking_task_ids: [] };
581
- filedBlockers.push(row);
582
- return { ...row };
583
- };
584
- blockers.getBlocker = async (id) => { const b = filedBlockers.find((x) => x.id === String(id)); return b ? { ...b } : null; };
585
- blockers.listOpenBlockers = async () => filedBlockers.filter((b) => b.status === 'open').map((b) => ({ ...b }));
586
- blockers.countOpenBlockers = async () => filedBlockers.filter((b) => b.status === 'open').length;
587
-
588
- return { asked, treasury: t, prefs, blockers: filedBlockers };
589
- }
590
-
591
- // ── the walk ────────────────────────────────────────────────────────────────
592
-
593
- async function runWalk() {
594
- // The constitution is host content: point the instance root at a throwaway folder
595
- // BEFORE anything reads it, so a ratified charter is written there (the real
596
- // applyBoardAmendment) and never into this checkout.
597
- const instanceRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'government-walk-'));
598
- process.env.BONGOS_INSTANCE_ROOT = instanceRoot;
599
- delete process.env.DATABASE_URL; // the walk never touches a real database
600
- // The modules' info lines (a fence switched, a budget set) would bury the table.
601
- if (!process.env.LOG_LEVEL) process.env.LOG_LEVEL = 'warn';
602
-
603
- const req = (rel) => require(path.join(ROOT, rel));
604
- const api = req('src/module-api.js');
605
- const seams = req('src/module-seams.js');
606
- const authMod = req('src/bongos/auth.js');
607
- const projectSettings = req('src/bongos/project-settings.js');
608
- const { attachFail } = req('src/bongos/middleware/error-envelope.js');
609
- const catalog = req('modules/government/catalog.js');
610
- const govDb = req('modules/government/db.js');
611
- const config = req('modules/government/config.js');
612
- const board = req('modules/government/board.js');
613
- const charter = req('modules/government/charter.js');
614
- const membership = req('modules/government/board-membership.js');
615
- const dr = req('modules/government/decision-rules.js');
616
- const genesis = req('modules/onboarding/genesis-home.js');
617
- const autoDb = req('modules/autonomy/db.js');
618
- const lifeDb = req('modules/lifecycle/db.js');
619
- const doneWhen = req('modules/lifecycle/done-when.js');
620
- const doneWhenRoutes = req('modules/lifecycle/routes/done-when.js');
621
- const gateRoutes = req('modules/lifecycle/routes/gate-approvals.js');
622
- const express = require('express');
623
- const http = require('http');
624
-
625
- const { s: store, fns } = makeStore(catalog);
626
- installStore(govDb, fns, store.unexpected);
627
- // The new machinery's own tables (laws, asks, build-outs, pots), and the rows
628
- // other modules keep (a builder's settings, the blockers), in memory too.
629
- const side = installSideStores(req, store);
630
-
631
- // Project settings (founding mode + the plan) live in memory.
632
- const settings = new Map();
633
- projectSettings.getSetting = async (k) => (settings.has(k) ? { key: k, value: settings.get(k) } : null);
634
- projectSettings.setSetting = async (k, v) => { settings.set(k, String(v)); return { key: k, value: String(v) }; };
635
-
636
- // What passed matters write into other modules, recorded.
637
- const effects = { fence: null, allowedGoals: [], overrides: [], gates: [], criteria: new Map([['9', false]]), budgets: new Map() };
638
- autoDb.setFenceEnabled = async ({ enabled }) => { effects.fence = enabled; return { enabled }; };
639
- autoDb.allowGoal = async ({ goalId }) => { effects.allowedGoals.push(String(goalId)); return { goal_id: goalId }; };
640
- lifeDb.decideOverrideRequest = async ({ requestId, decision }) => { effects.overrides.push([String(requestId), decision]); return {}; };
641
- gateRoutes.approveGatePr = async ({ number }) => { effects.gates.push(String(number)); return { ok: true, body: {} }; };
642
- doneWhen.getCriterion = async (id) => (effects.criteria.has(String(id)) ? { id, satisfied: effects.criteria.get(String(id)) } : null);
643
- doneWhenRoutes.satisfyByOverride = async ({ criterionId }) => { effects.criteria.set(String(criterionId), true); return { updated: {}, goalResult: {} }; };
644
-
645
- // Ports the routers would otherwise reach a database for: the genesis seeder and
646
- // the Treasury write. Registered first, so the routers' own registrations step aside.
647
- const STAGE_TASK_IDS = { scope: '9001', strategize: '9002', charter: '9003', legalize: '9004', legislation: '9005' };
648
- seams.registerProvider('lifecycle.kickoffSeed', {
649
- seedGenesis: async () => {
650
- for (const [stage, id] of Object.entries(STAGE_TASK_IDS)) store.tasks.set(id, { id, stage, title: `${stage} (walk)`, status: 'ready' });
651
- return { seeded: 5 };
652
- },
653
- genesisTasks: async () => {
654
- const out = {};
655
- for (const t of store.tasks.values()) (out[t.stage] = out[t.stage] || []).push({ id: t.id, title: t.title, status: t.status });
656
- return out;
657
- },
658
- });
659
- seams.registerProvider('reward', {
660
- setBuilderMonthlyBudget: async (id, usd) => {
661
- if (!store.builders.has(String(id))) return null;
662
- effects.budgets.set(String(id), usd);
663
- return { id, monthly_budget_usd: usd };
664
- },
665
- });
666
-
667
- // The session: whoever the request says it is, from this project's people.
668
- const asHeader = 'x-walk-builder';
669
- const sessionHeader = 'x-walk-session';
670
- const fakeBuilder = (r, res, nextFn) => {
671
- const b = store.builders.get(String(r.headers[asHeader] || ''));
672
- if (!b || b.status !== 'active') return res.status(401).json({ error: { code: 'not_signed_in' } });
673
- r.builder = { id: Number(b.id), rank: b.rank, github_login: b.github_login, display_name: b.display_name };
674
- // an AI session's CLI token, or a person in the hall (task 1004704's line)
675
- r.gdsSession = { source: r.headers[sessionHeader] === 'cli' ? 'cli' : 'web' };
676
- return nextFn();
677
- };
678
- api.requireBuilder = fakeBuilder;
679
- authMod.requireBuilder = fakeBuilder;
680
-
681
- const app = express();
682
- app.use(express.json());
683
- app.use(attachFail);
684
- for (const rel of ROUTERS) app.use(req(rel)());
685
- const server = http.createServer(app);
686
- await new Promise((r) => server.listen(0, '127.0.0.1', r));
687
- const BASE = `http://127.0.0.1:${server.address().port}`;
688
-
689
- async function call(as, method, p, body, session = 'web') {
690
- const res = await fetch(`${BASE}${p}`, {
691
- method,
692
- headers: { [asHeader]: as, [sessionHeader]: session, ...(body === undefined ? {} : { 'content-type': 'application/json' }) },
693
- body: body === undefined ? undefined : JSON.stringify(body),
694
- });
695
- let json = null;
696
- try { json = await res.json(); } catch (_) { /* no body */ }
697
- return { status: res.status, json };
698
- }
699
- const code = (r) => (r.json && r.json.error && r.json.error.code) || null;
700
- const vote = (as, itemId, direction = 'yes') => call(as, 'POST', `/government/board/items/${itemId}/votes`,
701
- direction === 'yes' ? { direction } : { direction, reason_md: 'Not yet: the walk objects.', section_key: 'purpose' });
702
- const itemOf = (id) => store.items.find((i) => i.id === String(id)) || null;
703
- const constitution = async () => (await call(FOUNDER, 'GET', '/government/constitution')).json;
704
- const live = () => config.loadGovernmentConfig().board;
705
- const stateOf = (id) => { const i = itemOf(id); return !i ? 'missing' : i.closed_at ? i.outcome : 'open'; };
706
-
707
- // ── the table ──
708
- const rows = [];
709
- let current = '';
710
- const section = (name) => { current = name; };
711
- async function check(name, expected, fn) {
712
- let got;
713
- let pass = false;
714
- try {
715
- const out = await fn();
716
- got = out.got;
717
- pass = out.pass === true;
718
- } catch (err) {
719
- got = `threw: ${err && err.message}`;
720
- }
721
- const n = rows.filter((r) => r.section === current).length + 1;
722
- rows.push({ section: current, key: `${current.split(' ')[0]}${n}`, name, expected, got: String(got), pass });
723
- return pass;
724
- }
725
- const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
726
-
727
- // Every voter in `voters` votes; returns the state after each vote.
728
- async function voteAll(itemId, voters, direction = 'yes') {
729
- const after = [];
730
- for (const v of voters) {
731
- const r = await vote(v, itemId, direction);
732
- after.push(r.status === 201 ? stateOf(itemId) : `${r.status} ${code(r)}`);
733
- if (stateOf(itemId) !== 'open') break;
734
- }
735
- return after;
736
- }
737
-
738
- // ── setup: the council and the rank People's acts give ──
739
- await call(FOUNDER, 'POST', '/government/ranks', { rank_key: 'council', label: 'Council' });
740
- await call(FOUNDER, 'POST', '/government/ranks', { rank_key: 'tester', label: 'Tester' });
741
- for (const id of COUNCIL) await call(FOUNDER, 'POST', '/government/assignments', { builder_id: Number(id), rank_key: 'council' });
742
-
743
- // ══ 1. Genesis ══
744
- section('G Genesis');
745
- const CHOSEN = 'timocratic-republic';
746
- await check('The test project is born a Monarchy (the state every genesis starts from)', 'reads as monarchy', async () => {
747
- const f = charter.readCharter(live()).form;
748
- return { got: `reads as ${f}`, pass: f === 'monarchy' };
749
- });
750
- await check('Founding starts', '200, stage decide', async () => {
751
- const r = await call(FOUNDER, 'POST', '/founding/start');
752
- const stage = r.json && r.json.mode && r.json.mode.stage;
753
- return { got: `${r.status}, stage ${stage}`, pass: r.status === 200 && stage === 'decide' };
754
- });
755
- let charterItem = null;
756
- await check(`Deciding with ${CHOSEN} saves the plan and files the pick as a charter amendment`, 'plan saved, charter sitting, one vote decides', async () => {
757
- const r = await call(FOUNDER, 'POST', '/founding/plan', { government: CHOSEN });
758
- const c = (r.json && r.json.charter) || {};
759
- charterItem = c.item_id || null;
760
- return { got: `${r.status}, charter ${c.state}, one vote decides ${c.one_vote_decides}`, pass: r.status === 200 && c.state === 'sitting' && c.one_vote_decides === true };
761
- });
762
- await check('Saving the plan moved the project to its first stage', 'stage scope', async () => {
763
- const g = await genesis.readGenesis();
764
- return { got: `stage ${g && g.stage}`, pass: !!g && g.stage === 'scope' };
765
- });
766
- await check('The founder\'s one yes ratifies the pick under the Monarchy it is born with', 'passed', async () => {
767
- const r = await vote(FOUNDER, charterItem);
768
- return { got: `${r.status} ${r.json && r.json.outcome}`, pass: r.status === 201 && r.json.outcome === 'passed' };
769
- });
770
- await check('The constitution now reads as the government chosen at decide', `reads as ${CHOSEN}, no divergence`, async () => {
771
- const c = await constitution();
772
- const f = c && c.charter && c.charter.reads_as && c.charter.reads_as.form;
773
- return { got: `reads as ${f}, divergence ${c && c.divergence ? 'yes' : 'none'}`, pass: f === CHOSEN && !c.divergence };
774
- });
775
- await check('A stage with unfinished tasks cannot be put to the board', '409 stage_tasks_unfinished', async () => {
776
- const r = await call(FOUNDER, 'POST', '/founding/stages/scope/close');
777
- return { got: `${r.status} ${code(r)}`, pass: r.status === 409 && code(r) === 'stage_tasks_unfinished' };
778
- });
779
- const timocrats = ['42', '43', '44'];
780
- for (const stage of genesis.PROPER) {
781
- store.tasks.get(STAGE_TASK_IDS[stage]).status = 'shipped';
782
- let itemId = null;
783
- await check(`${stage}: its finished stage is put to the board`, 'a sitting under the chosen government', async () => {
784
- const r = await call(FOUNDER, 'POST', `/founding/stages/${stage}/close`);
785
- itemId = r.json && r.json.item_id;
786
- const snap = itemId && itemOf(itemId) ? itemOf(itemId).constitution : {};
787
- const reads = charter.readCharter(snap).form;
788
- return { got: `${r.status}, sitting under ${reads}`, pass: r.status === 200 && !!itemId && reads === CHOSEN };
789
- });
790
- await check(`${stage}: the founder alone cannot close it; every trusted member's yes does`, 'open, open, passed', async () => {
791
- const after = await voteAll(itemId, timocrats);
792
- return { got: after.join(', '), pass: same(after, ['open', 'open', 'passed']) };
793
- });
794
- const nextStage = genesis.PROPER[genesis.PROPER.indexOf(stage) + 1];
795
- await check(`${stage}: a pass moves the project on`, nextStage ? `stage ${nextStage}` : 'come-alive door opens', async () => {
796
- const g = await genesis.readGenesis();
797
- if (nextStage) return { got: `stage ${g && g.stage}`, pass: !!g && g.stage === nextStage };
798
- return { got: `can come alive ${g && g.can_come_alive}`, pass: !!g && g.can_come_alive === true };
799
- });
800
- }
801
- await check('The project comes alive', '200, founding over', async () => {
802
- const r = await call(FOUNDER, 'POST', '/founding/alive');
803
- const g = await genesis.readGenesis();
804
- return { got: `${r.status}, founding ${g ? 'still on' : 'over'}`, pass: r.status === 200 && g === null };
805
- });
806
- await check('Alive, it is still governed by the choice', `reads as ${CHOSEN}`, async () => {
807
- const f = charter.readCharter(live()).form;
808
- return { got: `reads as ${f}`, pass: f === CHOSEN };
809
- });
810
-
811
- // ══ 2. Every form ══
812
- section('F Forms');
813
- let ideaSeq = 500;
814
- // A probe: a Full Idea (by someone who left, so no author rule bends the count)
815
- // put to the board in force, voted on to show who may vote and what passes.
816
- async function probe() {
817
- const id = String(++ideaSeq);
818
- store.ideas.set(id, { captured_by: '47', completeness: 80 });
819
- const out = await board.openWindowForFullIdea({ ideaId: id, completenessScore: 80 });
820
- return out.item.id;
821
- }
822
- const FORMS = [
823
- // key, how to switch, who is seated, the yes-path states, the objection path (voter order + states)
824
- { key: 'timocratic-republic', label: 'Timocratic Republic (in force from genesis)', body: null,
825
- seated: ['42', '43', '44'], outsider: '45', yes: ['open', 'open', 'passed'], no: { voters: ['43', '42', '44'], dir: ['no', 'yes', 'yes'], states: ['open', 'open', 'returned'] },
826
- rule: 'consent: a yes does not end it; full turnout passes; one objection returns it' },
827
- { key: 'direct-democracy', label: 'Direct Democracy', body: { form: 'direct-democracy' },
828
- seated: ACTIVE_IDS, outsider: null, yes: ['open', 'open', 'open', 'open', 'passed'], no: { voters: ['46', '42', '43', '44', '45'], dir: ['no', 'yes', 'yes', 'yes', 'yes'], states: ['open', 'open', 'open', 'open', 'returned'] },
829
- rule: 'consent over every builder' },
830
- { key: 'foundation', label: 'Foundation (council rank)', body: { form: 'foundation', council_rank: 'council' }, selfRemoval: true,
831
- seated: COUNCIL, outsider: '42', yes: ['open', 'passed'], no: { voters: ['44', '43'], dir: ['no', 'yes'], states: ['open', 'returned'] },
832
- rule: 'consent over the council only' },
833
- { key: 'custom', label: 'Every builder, majority (no named form)', body: { franchise: 'everyone', pass_rule: 'majority' }, passRule: 'majority',
834
- seated: ACTIVE_IDS, outsider: null, yes: ['open', 'open', 'passed'], no: { voters: ['42', '43', '44'], dir: ['no', 'no', 'no'], states: ['open', 'open', 'returned'] },
835
- rule: 'majority: 3 of 5 yes carries; 3 of 5 no makes it unreachable' },
836
- { key: 'custom', label: 'Every builder, unanimous (no named form)', body: { pass_rule: 'unanimous' }, passRule: 'unanimous',
837
- seated: ACTIVE_IDS, outsider: null, yes: ['open', 'open', 'open', 'open', 'passed'], no: { voters: ['43'], dir: ['no'], states: ['returned'] },
838
- rule: 'unanimous: one yes does not end it; full turnout passes; one objection returns it at once' },
839
- { key: 'monarchy', label: 'Monarchy / BDFL', body: { form: 'monarchy' },
840
- seated: ['42'], outsider: '43', yes: ['passed'], no: { voters: ['42'], dir: ['no'], states: ['returned'] },
841
- rule: 'first yes: the founder\'s one vote decides' },
842
- ];
843
- let seatedNow = ['42', '43', '44']; // who sits under the form in force
844
- for (const form of FORMS) {
845
- const tag = form.label;
846
- if (form.body) {
847
- let itemId = null;
848
- await check(`${tag}: the switch is filed as a charter amendment`, form.selfRemoval ? '409 proposer_would_lose_their_seat, then 201 once acknowledged' : '201', async () => {
849
- let r = await call(FOUNDER, 'POST', '/government/board/charter', form.body);
850
- let got = `${r.status}`;
851
- if (form.selfRemoval) {
852
- const first = `${r.status} ${code(r)}`;
853
- r = await call(FOUNDER, 'POST', '/government/board/charter', { ...form.body, acknowledge_self_removal: true });
854
- got = `${first}, then ${r.status}`;
855
- itemId = r.json && r.json.item && r.json.item.id;
856
- return { got, pass: first === '409 proposer_would_lose_their_seat' && r.status === 201 && !!itemId };
857
- }
858
- itemId = r.json && r.json.item && r.json.item.id;
859
- return { got, pass: r.status === 201 && !!itemId };
860
- });
861
- await check(`${tag}: the government in force decides the switch`, 'passed once every seated member has said yes', async () => {
862
- const after = await voteAll(itemId, seatedNow);
863
- return { got: after.join(', '), pass: after[after.length - 1] === 'passed' };
864
- });
865
- }
866
- await check(`${tag}: the constitution reads as it`, form.key === 'custom' ? `reads as Custom, pass rule ${form.passRule}` : `reads as ${form.key}`, async () => {
867
- const c = await constitution();
868
- const ra = (c && c.charter && c.charter.reads_as) || {};
869
- const ok = ra.form === form.key && (!form.passRule || ra.pass_rule === form.passRule) && !c.divergence;
870
- return { got: `reads as ${ra.form === 'custom' ? 'Custom' : ra.form}${form.passRule ? `, pass rule ${ra.pass_rule}` : ''}${c.divergence ? ', DIVERGES' : ''}`, pass: ok };
871
- });
872
- await check(`${tag}: who is seated`, `builders ${form.seated.join(', ')}`, async () => {
873
- const members = (await membership.resolveBoardMembers(live())).map((m) => String(m.builder_id));
874
- return { got: `builders ${members.join(', ') || 'none'}`, pass: same(members, form.seated) };
875
- });
876
- if (form.outsider) {
877
- await check(`${tag}: someone not seated cannot vote`, '403 not_board_member', async () => {
878
- const id = await probe();
879
- const r = await vote(form.outsider, id);
880
- await voteAll(id, form.seated, 'no'); // close the probe: the walk leaves no sitting open
881
- return { got: `${r.status} ${code(r)}`, pass: r.status === 403 && code(r) === 'not_board_member' };
882
- });
883
- }
884
- await check(`${tag}: what passes (${form.rule})`, form.yes.join(', '), async () => {
885
- const id = await probe();
886
- const after = await voteAll(id, form.seated);
887
- return { got: after.join(', '), pass: same(after, form.yes) };
888
- });
889
- await check(`${tag}: what returns`, form.no.states.join(', '), async () => {
890
- const id = await probe();
891
- const after = [];
892
- for (let k = 0; k < form.no.voters.length; k += 1) {
893
- const r = await vote(form.no.voters[k], id, form.no.dir[k]);
894
- after.push(r.status === 201 ? stateOf(id) : `${r.status} ${code(r)}`);
895
- if (stateOf(id) !== 'open') break;
896
- }
897
- return { got: after.join(', '), pass: same(after, form.no.states) };
898
- });
899
- seatedNow = form.seated;
900
- }
901
-
902
- // ══ 3. Every building ══
903
- section('B Buildings');
904
- // Who decides at a building is changed by an amendment, decided here under the
905
- // Monarchy the walk restored: the founder's one yes.
906
- async function setRules(rules) {
907
- const r = await call(FOUNDER, 'POST', '/government/board/decision-rules', { rules });
908
- const itemId = r.json && r.json.item && r.json.item.id;
909
- if (r.status !== 201 || !itemId) return { ok: false, why: `${r.status} ${code(r)}` };
910
- const v = await vote(FOUNDER, itemId);
911
- return { ok: v.status === 201 && v.json.outcome === 'passed', why: `vote ${v.status} ${v.json && v.json.outcome}` };
912
- }
913
- const rowOf = async (area) => {
914
- const c = await constitution();
915
- return ((c.decision_rules && c.decision_rules.areas) || []).find((a) => a.area === area) || {};
916
- };
917
- for (const area of dr.AREAS.filter((a) => a.acts.length)) {
918
- await check(`${area.name}: set to decide by vote (council, majority) by a passed amendment`, 'sitting, majority vote', async () => {
919
- const out = await setRules([{ area: area.key, decided_by: 'rank:council', rule: 'majority' }]);
920
- const row = await rowOf(area.key);
921
- return { got: `${out.ok ? 'passed' : out.why}; ${row.sitting ? 'sitting' : 'as today'}, ${row.rule_words}`, pass: out.ok && row.sitting === true && row.rule === 'majority' };
922
- });
923
- for (const act of area.acts) {
924
- await check(`${area.name}: acting alone on ${act} is refused`, `409 decided_by_sitting (${area.key})`, async () => {
925
- const [method, p, body] = REQUESTS[act];
926
- const r = await call(FOUNDER, method, p, body);
927
- const d = (r.json && r.json.error && (r.json.error.details || r.json.error)) || {};
928
- return { got: `${r.status} ${code(r)} (${d.area})`, pass: r.status === 409 && code(r) === 'decided_by_sitting' && d.area === area.key };
929
- });
930
- }
931
- await check(`${area.name}: restored to as today, every one of its ${area.acts.length} routes reaches its own handler again`, 'none refused', async () => {
932
- const out = await setRules([{ area: area.key, decided_by: 'gate' }]);
933
- const bad = [];
934
- for (const act of area.acts) {
935
- const [method, p, body] = REQUESTS[act];
936
- const r = await call(FOUNDER, method, p, body);
937
- const reached = act.includes('/government/assignments') ? r.status < 300 : (r.status >= 400 && r.status < 500 && r.status !== 403 && code(r) !== 'decided_by_sitting');
938
- if (!reached) bad.push(`${act} ${r.status} ${code(r)}`);
939
- }
940
- return { got: `${out.ok ? 'restored' : out.why}; ${bad.length ? bad.join('; ') : 'none refused'}`, pass: out.ok && bad.length === 0 };
941
- });
942
- }
943
-
944
- // ══ 4. Every matter action ══
945
- section('M Matters');
946
- const SITTINGS = {
947
- people: 'consent', automation: 'majority', release: 'unanimous', review: 'signoff', treasury: 'first',
948
- };
949
- await check('Each acting building is put to the council by one passed amendment', Object.entries(SITTINGS).map(([a, r]) => `${a} ${r}`).join(', '), async () => {
950
- const out = await setRules(Object.entries(SITTINGS).map(([area, rule]) => ({ area, decided_by: 'rank:council', rule })));
951
- const got = [];
952
- for (const area of Object.keys(SITTINGS)) got.push(`${area} ${(await rowOf(area)).rule}`);
953
- return { got: `${out.ok ? '' : `${out.why}; `}${got.join(', ')}`, pass: out.ok && same(got, Object.entries(SITTINGS).map(([a, r]) => `${a} ${r}`)) };
954
- });
955
- // Open a matter as the founder (not on the council), pass it with council votes.
956
- async function passMatter(area, title, action, voters = COUNCIL, direction = 'yes') {
957
- const r = await call(FOUNDER, 'POST', '/government/board/matters', { area, title, action });
958
- const itemId = r.json && r.json.item && r.json.item.id;
959
- if (r.status !== 201 || !itemId) return { outcome: `not opened: ${r.status} ${code(r)}` };
960
- const after = await voteAll(itemId, voters, direction);
961
- return { outcome: stateOf(itemId), after };
962
- }
963
- const holds = (id, rank) => store.assignments.some((a) => a.builder_id === id && a.rank_key === rank);
964
- // Did the act happen? One observation per matter action in MATTER_PLAN.
965
- const HAPPENED = {
966
- 'people.assign_rank': () => holds('46', 'tester'),
967
- 'people.unassign_rank': () => !holds('46', 'tester'),
968
- 'people.appoint_lead': () => store.leads.some((l) => l.building === 'planning' && l.builder_id === '45' && !l.removed_at),
969
- 'people.remove_lead': () => !store.leads.some((l) => l.building === 'planning' && !l.removed_at),
970
- 'automation.switch_on': () => effects.fence === true,
971
- 'automation.switch_off': () => effects.fence === false,
972
- 'automation.allow_goal': () => effects.allowedGoals.includes('77'),
973
- 'release.approve_override': () => effects.overrides.some(([id, d]) => id === '5' && d === 'approve'),
974
- 'release.approve_gate': () => effects.gates.includes('1500'),
975
- 'review.satisfy_criterion': () => effects.criteria.get('9') === true,
976
- 'treasury.set_budget': () => effects.budgets.get('45') === 50,
977
- };
978
- const MATTERS = MATTER_PLAN.map(([area, title, action, effect]) => [area, title, action, effect, HAPPENED[`${area}.${action.type}`]]);
979
- // How each building's sitting closes as Ben then Cy say yes, under its rule: the
980
- // two-member consent, majority and unanimous sittings need both; first yes and
981
- // sign-off (by someone who did not propose it) close on the first.
982
- const CLOSES = { people: 'open, passed', automation: 'open, passed', release: 'open, passed', review: 'passed', treasury: 'passed' };
983
- await check('Someone the building\'s row does not seat cannot vote on its matter', '403 not_board_member', async () => {
984
- const r = await call(FOUNDER, 'POST', '/government/board/matters', { area: 'automation', title: 'Who may vote here?' });
985
- const itemId = r.json && r.json.item && r.json.item.id;
986
- const v = await vote(FOUNDER, itemId);
987
- await voteAll(itemId, COUNCIL, 'no'); // close the probe so it carries out nothing
988
- return { got: `${r.status}, then ${v.status} ${code(v)}`, pass: r.status === 201 && v.status === 403 && code(v) === 'not_board_member' };
989
- });
990
- for (const [area, title, action, effect, happened] of MATTERS) {
991
- await check(`${area} ${action.type}: "${title}" passes under ${SITTINGS[area]} and is carried out`, `${CLOSES[area]}; ${effect}`, async () => {
992
- const out = await passMatter(area, title, action);
993
- const done = happened();
994
- const steps = out.after ? out.after.join(', ') : out.outcome;
995
- return { got: `${steps}; ${done ? effect : `NOT ${effect}`}`, pass: out.outcome === 'passed' && steps === CLOSES[area] && done };
996
- });
997
- }
998
- await check('A returned matter carries out nothing', 'returned; fence unchanged', async () => {
999
- const before = effects.fence;
1000
- const out = await passMatter('automation', 'Switch it on again', { type: 'switch_on' }, COUNCIL, 'no');
1001
- return { got: `${out.outcome}; fence ${effects.fence === before ? 'unchanged' : 'CHANGED'}`, pass: out.outcome === 'returned' && effects.fence === before };
1002
- });
1003
- await check('Every building restored to as today', 'all as today', async () => {
1004
- const out = await setRules(Object.keys(SITTINGS).map((area) => ({ area, decided_by: 'gate' })));
1005
- const c = await constitution();
1006
- const sitting = c.decision_rules.areas.filter((a) => a.sitting).map((a) => a.area);
1007
- return { got: `${out.ok ? '' : `${out.why}; `}${sitting.length ? `still sitting: ${sitting.join(', ')}` : 'all as today'}`, pass: out.ok && sitting.length === 0 };
1008
- });
1009
-
1010
- // ══ 5–9. The new machinery (task 1004719) ══
1011
- await walkNewMachinery({ call, code, vote, voteAll, check, section, stateOf, store, side, req });
1012
-
1013
- // Any storage the fake did not model is a finding about the walk itself.
1014
- section('S Store');
1015
- await check('No code path reached storage the walk does not model', 'none', async () => {
1016
- const u = [...new Set(store.unexpected)];
1017
- return { got: u.length ? u.join(', ') : 'none', pass: u.length === 0 };
1018
- });
1019
-
1020
- await new Promise((r) => server.close(r));
1021
- try { fs.rmSync(instanceRoot, { recursive: true, force: true }); } catch (_) { /* best effort */ }
1022
- return { mode: 'in-memory', rows };
1023
- }
1024
-
1025
- // ── the new machinery (task 1004719) ────────────────────────────────────────
1026
- //
1027
- // Laws and presets, Leads and build-outs, asks and routing, the treasury, and
1028
- // positions with the counts, walked on the same throwaway project after section
1029
- // 4 left it a Monarchy with every building decided as today. Everything it
1030
- // puts up it takes down again: no law, Lead, pot or open borrow survives it.
1031
-
1032
- // A card in the one ask shape (asks.js), and a wall of text that is not one.
1033
- const GOOD_ASK = Object.freeze({
1034
- question: 'Ship the walk table today?',
1035
- options: [
1036
- { key: 'ship', label: 'Ship it', result: 'The table lands today.' },
1037
- { key: 'wait', label: 'Wait a day', result: 'It lands tomorrow instead.' },
1038
- ],
1039
- recommend: { key: 'ship', why: 'Every row of it passes.' },
1040
- waits_on: 'lead:planning',
1041
- if_nobody_answers: 'It ships tomorrow as planned.',
1042
- });
1043
- const SLOP_ASK = Object.freeze({
1044
- question: 'I have been looking into this for a while and wanted to check with you about what we should do about the walk table and whether it is ready?',
1045
- options: [{ key: 'ok', label: 'ok', result: 'ok' }],
1046
- recommend: { key: 'maybe', why: '' },
1047
- waits_on: 'someone',
1048
- if_nobody_answers: '',
1049
- });
1050
- // A law that locks a personal setting: every agent answers short.
1051
- const SHORT_LAW = Object.freeze({ text: 'Answer in plain, short words', effect_on_ai: 'Replies lead with the answer and stop.', locks: [{ setting: 'verbosity', value: 'concise' }] });
1052
-
1053
- async function walkNewMachinery({ call, code, vote, voteAll, check, section, stateOf, store, side, req }) {
1054
- const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
1055
- const FOUNDER_ID = '42';
1056
- const BEN = '43';
1057
- const CY = '44';
1058
- const EVE = '46';
1059
- const positionsPort = () => req('src/module-seams.js').resolveOptional('government');
1060
- const GovPositions = req('modules/hall-ui/public/gov-positions.js');
1061
- const GovLiving = req('modules/hall-ui/public/gov-living.js');
1062
- const treasuryMod = req('modules/government/treasury.js');
1063
- const sweep = req('modules/government/pollers/treasury-borrow.js');
1064
- const lawsInForce = async () => (await call(FOUNDER_ID, 'GET', '/government/laws')).json;
1065
- const itemIdOf = (r) => r.json && r.json.item && r.json.item.id;
1066
-
1067
- // ══ 5. Laws and strictness presets ══
1068
- section('L Laws');
1069
- let lawItem = null;
1070
- await check('Before any law the book is empty and no session is handed a laws block', '0 in force; no laws block', async () => {
1071
- const book = await lawsInForce();
1072
- const s = await positionsPort().lawsForSession();
1073
- return { got: `${book.in_force} in force; ${s.inject ? 'a laws block' : 'no laws block'}`, pass: book.in_force === 0 && s.inject === false };
1074
- });
1075
- await check('A law is proposed: filed as a laws amendment, and proposing writes nothing', '201, sitting open; still 0 in force', async () => {
1076
- const r = await call(FOUNDER_ID, 'POST', '/government/board/laws', { enact: [SHORT_LAW] });
1077
- lawItem = itemIdOf(r);
1078
- const book = await lawsInForce();
1079
- return { got: `${r.status}, sitting ${stateOf(lawItem)}; still ${book.in_force} in force`, pass: r.status === 201 && stateOf(lawItem) === 'open' && book.in_force === 0 };
1080
- });
1081
- await check('Someone the board does not seat cannot pass it', '403 not_board_member', async () => {
1082
- const r = await vote(BEN, lawItem);
1083
- return { got: `${r.status} ${code(r)}`, pass: r.status === 403 && code(r) === 'not_board_member' };
1084
- });
1085
- let lawId = null;
1086
- await check('The government in force passes it, and the law book names the vote', 'passed; 1 in force, passed under Monarchy / BDFL with yes from ada', async () => {
1087
- const v = await vote(FOUNDER_ID, lawItem);
1088
- const book = await lawsInForce();
1089
- const law = (book.laws || [])[0] || {};
1090
- lawId = law.id || null;
1091
- const pb = law.passed_by || {};
1092
- const yes = (pb.yes || []).map((x) => (x && (x.login || x.github_login)) || String(x && x.id));
1093
- const ok = v.json && v.json.outcome === 'passed' && book.in_force === 1 && law.text === SHORT_LAW.text;
1094
- return { got: `${v.json && v.json.outcome}; ${book.in_force} in force${ok ? `, passed under ${pb.government} with yes from ${yes.join(', ') || 'nobody'}` : ''}`, pass: ok && pb.government === 'Monarchy / BDFL' && same(yes, ['ada']) };
1095
- });
1096
- await check('Every AI session is handed the law, with its lock, ahead of its own settings', 'a laws block naming the law and "verbosity is fixed at concise"', async () => {
1097
- const s = await positionsPort().lawsForSession();
1098
- const ok = s.inject === true && s.contract.includes(SHORT_LAW.text) && s.contract.includes('verbosity is fixed at concise');
1099
- return { got: ok ? 'a laws block naming the law and "verbosity is fixed at concise"' : `inject ${s.inject}: ${s.contract.slice(0, 80)}`, pass: ok };
1100
- });
1101
- await check('The lock bites on a write: a builder cannot set what the law forbids', '409 locked_by_law', async () => {
1102
- const r = await call(BEN, 'PATCH', '/me/interaction', { verbosity: 'detailed' });
1103
- return { got: `${r.status} ${code(r)}`, pass: r.status === 409 && code(r) === 'locked_by_law' };
1104
- });
1105
- await check('The lock bites on a read: a value stored before the law reads as the law says', 'stored detailed, reads concise', async () => {
1106
- side.prefs.set(CY, { interaction: { verbosity: 'detailed' } });
1107
- const r = await call(CY, 'GET', '/me/interaction');
1108
- const eff = r.json && (r.json.effective ? r.json.effective.verbosity : r.json.verbosity);
1109
- return { got: `stored detailed, reads ${eff}`, pass: r.status === 200 && eff === 'concise' };
1110
- });
1111
- await check('A value the law allows still saves', '200', async () => {
1112
- const r = await call(BEN, 'PATCH', '/me/interaction', { verbosity: 'concise' });
1113
- return { got: `${r.status}`, pass: r.status === 200 };
1114
- });
1115
- await check('Repealed by a vote, the law leaves every session and unlocks the setting', 'passed; 0 in force; no laws block; 200', async () => {
1116
- const r = await call(FOUNDER_ID, 'POST', '/government/board/laws', { repeal: [lawId] });
1117
- const v = await vote(FOUNDER_ID, itemIdOf(r));
1118
- const book = await lawsInForce();
1119
- const s = await positionsPort().lawsForSession();
1120
- const w = await call(BEN, 'PATCH', '/me/interaction', { verbosity: 'detailed' });
1121
- return { got: `${v.json && v.json.outcome}; ${book.in_force} in force; ${s.inject ? 'a laws block' : 'no laws block'}; ${w.status}`, pass: v.json && v.json.outcome === 'passed' && book.in_force === 0 && !s.inject && w.status === 200 };
1122
- });
1123
- const presetNow = async () => (await call(FOUNDER_ID, 'GET', '/government/presets')).json;
1124
- await check('With no laws, no strictness preset is in force', 'none', async () => {
1125
- const p = await presetNow();
1126
- return { got: p.current || 'none', pass: p.current == null };
1127
- });
1128
- // [to, from, what an exploratory wandering write answers once it is in force]
1129
- for (const [key, from, wander] of [['guild', 'none', '409 locked_by_law'], ['factory', 'guild', '409 locked_by_law'], ['open', 'factory', '200']]) {
1130
- await check(`Strictness: ${from} to ${key} is one vote, and its locks bite`, `one sitting; passed; ${key} in force; exploratory wandering ${wander}`, async () => {
1131
- const r = await call(FOUNDER_ID, 'POST', '/government/board/presets', { preset: key });
1132
- const id = itemIdOf(r);
1133
- const v = await vote(FOUNDER_ID, id);
1134
- const p = await presetNow();
1135
- const w = await call(BEN, 'PATCH', '/me/wandering', { wandering: 3 });
1136
- const ws = `${w.status}${w.status === 200 ? '' : ` ${code(w)}`}`;
1137
- return { got: `${r.status === 201 && id ? 'one sitting' : `${r.status} ${code(r)}`}; ${v.json && v.json.outcome}; ${p.current || 'none'} in force; exploratory wandering ${ws}`, pass: r.status === 201 && v.json && v.json.outcome === 'passed' && p.current === key && ws === wander };
1138
- });
1139
- }
1140
- await check('Every preset law is repealed by one more vote, so the book ends empty', 'passed; 0 in force; no preset', async () => {
1141
- const ids = ((await lawsInForce()).laws || []).map((l) => l.id);
1142
- const r = await call(FOUNDER_ID, 'POST', '/government/board/laws', { repeal: ids });
1143
- const v = await vote(FOUNDER_ID, itemIdOf(r));
1144
- const book = await lawsInForce();
1145
- const p = await presetNow();
1146
- return { got: `${v.json && v.json.outcome}; ${book.in_force} in force; ${p.current ? `${p.current} in force` : 'no preset'}`, pass: book.in_force === 0 && p.current == null };
1147
- });
1148
-
1149
- // ══ 6. Leads and build-outs ══
1150
- section('D Leads');
1151
- const leads = async () => (await call(FOUNDER_ID, 'GET', '/government/leads')).json;
1152
- const building = async (key) => ((await leads()).buildings || []).find((b) => b.building === key) || {};
1153
- await check('Ben is appointed Planning\'s Lead by a People vote', 'passed; Planning led by ben, by that vote', async () => {
1154
- const r = await call(FOUNDER_ID, 'POST', '/government/board/matters', { area: 'people', title: 'Ben leads Planning', action: { type: 'appoint_lead', building: 'planning', builder_id: Number(BEN), charter: 'Goals, priorities and the order of work.' } });
1155
- const id = itemIdOf(r);
1156
- const v = await vote(FOUNDER_ID, id);
1157
- const p = await building('planning');
1158
- const lead = p.lead || {};
1159
- const by = lead.appointed_by && (lead.appointed_by.item_id || lead.appointed_by.id);
1160
- const login = lead.builder && (lead.builder.login || lead.builder.github_login);
1161
- return { got: `${v.json && v.json.outcome}; Planning led by ${login || 'nobody'}${String(by) === String(id) ? ', by that vote' : ''}`, pass: v.json && v.json.outcome === 'passed' && login === 'ben' && String(by) === String(id) };
1162
- });
1163
- await check('An unseated building answers to the owner', 'Rules answers to the owner: builder 42', async () => {
1164
- const a = (await building('rules')).answers || {};
1165
- return { got: `Rules answers to ${a.fell_to_owner ? 'the owner' : a.label}: builder ${(a.builder_ids || []).join(', ')}`, pass: a.fell_to_owner === true && same(a.builder_ids, [FOUNDER_ID]) };
1166
- });
1167
- await check('Someone who does not hold Planning cannot grow it', '403 not_the_holder', async () => {
1168
- const r = await call(CY, 'POST', '/government/buildouts', { building: 'planning', capsule: 'committee', name: 'Not mine' });
1169
- return { got: `${r.status} ${code(r)}`, pass: r.status === 403 && code(r) === 'not_the_holder' };
1170
- });
1171
- await check('A district always goes to a vote, even under a Monarchy', 'vote (city); returned, nothing built', async () => {
1172
- const before = store.buildouts.length;
1173
- const r = await call(BEN, 'POST', '/government/buildouts', { building: 'planning', capsule: 'district', name: 'Planning quarter' });
1174
- const id = itemIdOf(r);
1175
- if (id) await vote(FOUNDER_ID, id, 'no');
1176
- return { got: `${r.json && r.json.path} (${r.json && r.json.rights && r.json.rights.ground}); ${stateOf(id)}, ${store.buildouts.length === before ? 'nothing built' : 'BUILT'}`, pass: r.status === 201 && r.json.path === 'vote' && stateOf(id) === 'returned' && store.buildouts.length === before };
1177
- });
1178
- // Under each form, what the form says Planning's Lead may build without a vote:
1179
- // [label, the switch (null: in force already), who sits once it is in force, the path].
1180
- const BUILD_FORMS = [
1181
- ['Monarchy / BDFL', null, [FOUNDER_ID], 'at_once'],
1182
- ['Timocratic Republic (the Lead sits on the board)', { form: 'timocratic-republic' }, [FOUNDER_ID, BEN, CY], 'at_once'],
1183
- ['Direct Democracy', { form: 'direct-democracy' }, ACTIVE_IDS, 'vote'],
1184
- ['Foundation (council rank)', { form: 'foundation', council_rank: 'council', acknowledge_self_removal: true }, COUNCIL, 'vote'],
1185
- ];
1186
- let seated = [FOUNDER_ID];
1187
- for (const [label, body, seats, want] of BUILD_FORMS) {
1188
- if (body) {
1189
- const r = await call(FOUNDER_ID, 'POST', '/government/board/charter', body);
1190
- await voteAll(itemIdOf(r), seated);
1191
- seated = seats;
1192
- }
1193
- await check(`${label}: Planning's Lead adds a committee room`, want === 'at_once' ? 'rights at once (form); built at once' : 'rights a vote (form); filed as a vote, which passed and built it', async () => {
1194
- const rights = (((await building('planning')).build_rights || {}).capsules || {}).committee || {};
1195
- const r = await call(BEN, 'POST', '/government/buildouts', { building: 'planning', capsule: 'committee', name: `${label.split(' ')[0]} room` });
1196
- const took = r.json && r.json.path;
1197
- let got = `rights ${rights.without_vote ? 'at once' : 'a vote'} (${rights.ground}); `;
1198
- let built = false;
1199
- if (took === 'at_once') {
1200
- built = !!(r.json.buildout && r.json.buildout.ground === 'form');
1201
- got += built ? 'built at once' : 'NOT built';
1202
- } else if (took === 'vote') {
1203
- const id = itemIdOf(r);
1204
- await voteAll(id, seated);
1205
- built = store.buildouts.some((o) => o.authorised_by_item_id === String(id));
1206
- got += `filed as a vote, which ${stateOf(id)}${built ? ' and built it' : ''}`;
1207
- } else got += `${r.status} ${code(r)}`;
1208
- return { got, pass: took === want && rights.without_vote === (want === 'at_once') && rights.ground === 'form' && built };
1209
- });
1210
- }
1211
- // back to the Monarchy the rest of the walk runs under
1212
- {
1213
- const r = await call(FOUNDER_ID, 'POST', '/government/board/charter', { form: 'monarchy' });
1214
- await voteAll(itemIdOf(r), seated);
1215
- }
1216
- await check('Back under a Monarchy, the build-outs stand on the record with what allowed each', '2 at once (form), 2 by a vote', async () => {
1217
- const mine = store.buildouts.filter((o) => o.building === 'planning');
1218
- const atOnce = mine.filter((o) => !o.authorised_by_item_id && o.ground === 'form').length;
1219
- const voted = mine.filter((o) => o.authorised_by_item_id).length;
1220
- const form = charterForm(req);
1221
- return { got: `${atOnce} at once (form), ${voted} by a vote${form === 'monarchy' ? '' : `; form ${form}`}`, pass: atOnce === 2 && voted === 2 && form === 'monarchy' };
1222
- });
1223
-
1224
- // ══ 7. Asks and routing ══
1225
- section('A Asks');
1226
- await check('A slop ask is refused, every fix named, nothing stored', '400 ask_refused', async () => {
1227
- const before = side.asked.size;
1228
- const r = await call(BEN, 'POST', '/government/asks/check', SLOP_ASK, 'cli');
1229
- const n = (((r.json || {}).error || {}).details || {}).errors;
1230
- return { got: `${r.status} ${code(r)}${Array.isArray(n) && n.length ? '' : ' (no fixes named)'}${side.asked.size === before ? '' : ', STORED'}`, pass: r.status === 400 && code(r) === 'ask_refused' && Array.isArray(n) && n.length > 0 && side.asked.size === before };
1231
- });
1232
- await check('A card in the ask shape passes the check', '200 ok', async () => {
1233
- const r = await call(BEN, 'POST', '/government/asks/check', GOOD_ASK, 'cli');
1234
- return { got: `${r.status} ${r.json && r.json.ok ? 'ok' : code(r)}`, pass: r.status === 200 && r.json.ok === true };
1235
- });
1236
- await check('An AI session filing a blocker without an ask is refused, and nothing is filed', '400 ask_required; no blocker', async () => {
1237
- const before = side.blockers.length;
1238
- const r = await call(CY, 'POST', '/blockers', { title: 'Walk needs a decision', body_md: 'A long explanation.' }, 'cli');
1239
- return { got: `${r.status} ${code(r)}; ${side.blockers.length === before ? 'no blocker' : 'FILED'}`, pass: r.status === 400 && code(r) === 'ask_required' && side.blockers.length === before };
1240
- });
1241
- await check('A slop ask on a blocker files nothing', '400 ask_refused; no blocker', async () => {
1242
- const before = side.blockers.length;
1243
- const r = await call(CY, 'POST', '/blockers', { title: 'Walk needs a decision', ask: SLOP_ASK }, 'cli');
1244
- return { got: `${r.status} ${code(r)}; ${side.blockers.length === before ? 'no blocker' : 'FILED'}`, pass: r.status === 400 && code(r) === 'ask_refused' && side.blockers.length === before };
1245
- });
1246
- let matter = null;
1247
- await check('With an ask, the AI session\'s blocker is filed and carries its card', '201; the blocker reads back with its question', async () => {
1248
- const r = await call(CY, 'POST', '/blockers', { title: 'Walk needs a decision', ask: GOOD_ASK }, 'cli');
1249
- const id = r.json && r.json.blocker && r.json.blocker.id;
1250
- matter = id ? `blockers:${id}` : null;
1251
- const back = await call(CY, 'GET', `/blockers/${id}`);
1252
- const q = back.json && back.json.blocker && back.json.blocker.ask && back.json.blocker.ask.question;
1253
- return { got: `${r.status}; ${q === GOOD_ASK.question ? 'the blocker reads back with its question' : `read back ${q}`}`, pass: r.status === 201 && q === GOOD_ASK.question };
1254
- });
1255
- const routeFor = async (as) => {
1256
- const d = (await call(as, 'GET', '/government/docket')).json || {};
1257
- const m = (d.matters || []).find((x) => x.id === matter) || null;
1258
- return { d, m, route: (m && m.route) || {} };
1259
- };
1260
- await check('Routed to its seat: the ask waits on Planning\'s Lead, and is on Ben, not the owner', 'routed; the Planning Lead; Ben yes, founder no', async () => {
1261
- const ben = await routeFor(BEN);
1262
- const ada = await routeFor(FOUNDER_ID);
1263
- return { got: `${ben.d.routed ? 'routed' : 'NOT routed'}; ${ben.route.label}; Ben ${ben.route.yours ? 'yes' : 'no'}, founder ${ada.route.yours ? 'yes' : 'no'}`, pass: ben.d.routed === true && ben.route.seat === 'lead:planning' && ben.route.yours === true && ada.route.yours === false };
1264
- });
1265
- await check('Only whoever it waits on may pass it on', '403 not_yours', async () => {
1266
- const r = await call(FOUNDER_ID, 'POST', `/government/asks/${matter}/pass`, { seat: 'owner' });
1267
- return { got: `${r.status} ${code(r)}`, pass: r.status === 403 && code(r) === 'not_yours' };
1268
- });
1269
- await check('Ben passes it on to the owner: word for word, it leaves Ben and lands on the founder', '200; same question; Ben no, founder yes', async () => {
1270
- const r = await call(BEN, 'POST', `/government/asks/${matter}/pass`, { seat: 'owner' });
1271
- const ben = await routeFor(BEN);
1272
- const ada = await routeFor(FOUNDER_ID);
1273
- const kept = r.json && r.json.ask && r.json.ask.question === GOOD_ASK.question;
1274
- return { got: `${r.status}; ${kept ? 'same question' : 'CHANGED'}; Ben ${ben.route.yours ? 'yes' : 'no'}, founder ${ada.route.yours ? 'yes' : 'no'}`, pass: r.status === 200 && kept && ben.route.yours === false && ada.route.yours === true };
1275
- });
1276
- await check('The counts agree: GET /government/counts, the docket and the hall all say what is on each of them', 'founder 1 to do, Ben 0 to do; the hall reads the same', async () => {
1277
- const out = [];
1278
- let ok = true;
1279
- for (const [who, want] of [[FOUNDER_ID, 1], [BEN, 0]]) {
1280
- const c = (await call(who, 'GET', '/government/counts')).json || {};
1281
- const d = (await call(who, 'GET', '/government/docket')).json || {};
1282
- const me = { builder: { id: Number(who), rank: store.builders.get(who).rank } };
1283
- const hallServed = GovLiving.countsOf(GovLiving.livingModel({ counts: c, me, now: Date.now() }));
1284
- const hallDocket = GovLiving.countsOf(GovLiving.livingModel({ docket: d, me, now: Date.now() }));
1285
- const docketYours = (d.counts && d.counts.yours);
1286
- const agree = c.on_you === want && docketYours === want && hallServed.on_you === want && hallDocket.on_you === want;
1287
- ok = ok && agree;
1288
- out.push(agree ? `${who === FOUNDER_ID ? 'founder' : 'Ben'} ${want} to do` : `${who}: counts ${c.on_you}, docket ${docketYours}, hall ${hallServed.on_you}/${hallDocket.on_you}`);
1289
- }
1290
- return { got: `${out.join(', ')}${ok ? '; the hall reads the same' : ''}`, pass: ok };
1291
- });
1292
-
1293
- // ══ 8. The treasury ══
1294
- section('T Treasury');
1295
- const treasuryAs = async (as) => (await call(as, 'GET', '/government/treasury')).json || {};
1296
- await check('No pots, no spend limit, and the unseated Treasury answers to the owner', '0 pots; limit off; owner seat, not Eve\'s', async () => {
1297
- const t = await treasuryAs(EVE);
1298
- const a = t.answers || {};
1299
- return { got: `${(t.pots || []).length} pots; limit ${t.cap && t.cap.on ? 'ON' : 'off'}; ${a.fell_to_owner ? 'owner seat' : a.label}, ${a.yours ? 'Eve\'s' : 'not Eve\'s'}`, pass: (t.pots || []).length === 0 && t.cap && t.cap.on === false && a.fell_to_owner === true && a.yours === false };
1300
- });
1301
- await check('Someone who does not answer for the Treasury cannot give a goal a pot', '403 not_the_holder', async () => {
1302
- const r = await call(EVE, 'PUT', `/government/treasury/pots/${WALK_GOAL}`, { budget_usd: 100 });
1303
- return { got: `${r.status} ${code(r)}`, pass: r.status === 403 && code(r) === 'not_the_holder' };
1304
- });
1305
- await check('The owner gives the walk goal a $100 pot', '200, $100', async () => {
1306
- const r = await call(FOUNDER_ID, 'PUT', `/government/treasury/pots/${WALK_GOAL}`, { budget_usd: 100 });
1307
- return { got: `${r.status}, $${r.json && r.json.pot && r.json.pot.budget_usd}`, pass: r.status === 200 && r.json.pot.budget_usd === 100 };
1308
- });
1309
- await check('Spending $150 on it runs the pot dry', 'dry, $50 over', async () => {
1310
- side.treasury.spend.set(WALK_GOAL, 150);
1311
- const pot = ((await treasuryAs(FOUNDER_ID)).pots || [])[0] || {};
1312
- return { got: `${pot.dry ? 'dry' : 'not dry'}, $${-pot.left_usd} over`, pass: pot.dry === true && pot.left_usd === -50 };
1313
- });
1314
- let borrow = null;
1315
- await check('The sweep files one borrow from the reserve, its ask waiting on the Treasury; a second sweep files none', 'filed 1 for $250, waiting on lead:treasury; then 0', async () => {
1316
- const first = await sweep.runSweep({ now: () => TREASURY_NOW, log: () => {}, error: () => {} });
1317
- borrow = side.treasury.borrows[0] || null;
1318
- const ask = borrow ? side.asked.get(treasuryMod.matterId(borrow.id)) : null;
1319
- const second = await sweep.runSweep({ now: () => TREASURY_NOW, log: () => {}, error: () => {} });
1320
- return { got: `filed ${first.filed}${borrow ? ` for $${borrow.amount_usd}` : ''}, waiting on ${ask ? ask.waits_on : 'nothing'}; then ${second.filed}`, pass: first.filed === 1 && !!ask && ask.waits_on === 'lead:treasury' && second.filed === 0 };
1321
- });
1322
- await check('The borrow is on the owner\'s to-do, and only waits on others for Eve', 'founder: to do; Eve: on others', async () => {
1323
- const mid = borrow && treasuryMod.matterId(borrow.id);
1324
- const a = (await call(FOUNDER_ID, 'GET', '/government/counts')).json || {};
1325
- const e = (await call(EVE, 'GET', '/government/counts')).json || {};
1326
- const where = (c) => ((c.yours || []).includes(mid) ? 'to do' : (c.others || []).includes(mid) ? 'on others' : 'absent');
1327
- return { got: `founder: ${where(a)}; Eve: ${where(e)}`, pass: where(a) === 'to do' && where(e) === 'on others' };
1328
- });
1329
- await check('Someone it does not wait on cannot answer the borrow', '403 not_yours', async () => {
1330
- const r = await call(EVE, 'POST', `/government/treasury/borrows/${borrow && borrow.id}/answer`, { key: 'lend' });
1331
- return { got: `${r.status} ${code(r)}`, pass: r.status === 403 && code(r) === 'not_yours' };
1332
- });
1333
- await check('The owner lends it all: the pot refills; a second answer is refused', '200 lent $250; pot not dry; then 409 already_answered', async () => {
1334
- const r = await call(FOUNDER_ID, 'POST', `/government/treasury/borrows/${borrow && borrow.id}/answer`, { key: 'lend' });
1335
- const pot = ((await treasuryAs(FOUNDER_ID)).pots || [])[0] || {};
1336
- const again = await call(FOUNDER_ID, 'POST', `/government/treasury/borrows/${borrow && borrow.id}/answer`, { key: 'no' });
1337
- const b = (r.json && r.json.borrow) || {};
1338
- return { got: `${r.status} ${b.state} $${b.lent_usd}; pot ${pot.dry ? 'dry' : 'not dry'}; then ${again.status} ${code(again)}`, pass: r.status === 200 && b.state === 'lent' && b.lent_usd === 250 && pot.dry === false && again.status === 409 && code(again) === 'already_answered' };
1339
- });
1340
- await check('The pot is taken away again', '200 removed; 0 pots', async () => {
1341
- const r = await call(FOUNDER_ID, 'PUT', `/government/treasury/pots/${WALK_GOAL}`, { budget_usd: null });
1342
- const t = await treasuryAs(FOUNDER_ID);
1343
- return { got: `${r.status} ${r.json && r.json.removed ? 'removed' : 'KEPT'}; ${(t.pots || []).length} pots`, pass: r.status === 200 && r.json.removed === true && (t.pots || []).length === 0 };
1344
- });
1345
-
1346
- // ══ 9. Positions and the governing tabs ══
1347
- section('P Positions');
1348
- const SHELL = fs.readFileSync(path.join(ROOT, 'modules', 'hall-ui', 'public', 'shell.js'), 'utf8');
1349
- const cityGated = /\{ id: 'city',[^}]*position: true/.test(SHELL);
1350
- const held = async (id) => {
1351
- const p = await positionsPort().positionsFor(id);
1352
- const b = store.builders.get(id);
1353
- const view = GovPositions.positionsFor({ me: { builder: { id: Number(id), rank: b.rank }, positions: p } });
1354
- return { p, view, kinds: ((p && p.held) || []).map((x) => x.kind) };
1355
- };
1356
- // The shell's rule (shell.js): a governing tab needs a held seat once the seats are known.
1357
- const tabShows = (view) => !(cityGated && view.known && !view.has_position);
1358
- for (const [who, name, want, kinds] of [[FOUNDER_ID, 'The founder', 'owner, board; the City tab shows', ['owner', 'board']], [BEN, 'Ben, Planning\'s Lead', 'lead (Planning Lead); the City tab shows', ['lead']], [EVE, 'Eve, who holds no seat', 'none; the City tab is hidden', []]]) {
1359
- await check(`${name}: the seats GET /me carries, and the governing tab`, want, async () => {
1360
- const h = await held(who);
1361
- const title = h.p && h.p.title;
1362
- const shows = tabShows(h.view);
1363
- const got = `${h.kinds.join(', ') || 'none'}${who === BEN ? ` (${title})` : ''}; the City tab ${shows ? 'shows' : 'is hidden'}`;
1364
- return { got, pass: cityGated && same(h.kinds, kinds) && shows === kinds.length > 0 && (who !== BEN || title === 'Planning Lead') };
1365
- });
1366
- }
1367
- await check('Ben is removed by a People vote and holds no seat; Planning falls to the owner', 'passed; Ben none; Planning answers to the owner', async () => {
1368
- const r = await call(FOUNDER_ID, 'POST', '/government/board/matters', { area: 'people', title: 'Planning has no Lead', action: { type: 'remove_lead', building: 'planning' } });
1369
- const v = await vote(FOUNDER_ID, itemIdOf(r));
1370
- const h = await held(BEN);
1371
- const a = (await building('planning')).answers || {};
1372
- return { got: `${v.json && v.json.outcome}; Ben ${h.kinds.join(', ') || 'none'}; Planning answers to ${a.fell_to_owner ? 'the owner' : a.label}`, pass: v.json && v.json.outcome === 'passed' && h.kinds.length === 0 && a.fell_to_owner === true };
1373
- });
1374
- await check('Nothing the walk put up is left standing: no law, Lead, pot, open borrow or open sitting', 'none left', async () => {
1375
- const left = [];
1376
- if (store.laws.some((l) => !l.repealed_at)) left.push('a law');
1377
- if (store.leads.some((l) => !l.removed_at)) left.push('a Lead');
1378
- if (side.treasury.pots.size) left.push('a pot');
1379
- if (side.treasury.borrows.some((b) => b.state === 'open')) left.push('an open borrow');
1380
- if (store.items.some((i) => !i.closed_at)) left.push('an open sitting');
1381
- return { got: left.length ? left.join(', ') : 'none left', pass: left.length === 0 };
1382
- });
1383
- }
1384
-
1385
- function charterForm(req) {
1386
- const charter = req('modules/government/charter.js');
1387
- const config = req('modules/government/config.js');
1388
- return charter.readCharter(config.loadGovernmentConfig().board).form;
1389
- }
1390
-
1391
- // ── the table, as Markdown ──────────────────────────────────────────────────
1392
-
1393
- const SECTION_TITLES = {
1394
- G: '1. Genesis: founded, decided, five stages closed, alive',
1395
- F: '2. Every form: who can vote and what passes',
1396
- B: '3. Every building: decide by vote refuses acting alone',
1397
- M: '4. Every matter action: passed and carried out',
1398
- L: '5. Laws: passed by a vote, read in every session, locks enforced; strictness presets',
1399
- D: '6. Leads and build-outs under each form of government',
1400
- A: '7. Asks: the shape enforced, routed to a seat, passed on, counted',
1401
- T: '8. The treasury: a pot runs dry and borrows from the reserve',
1402
- P: '9. Positions: the seats GET /me carries and the governing tabs',
1403
- S: 'The walk itself',
1404
- };
1405
- const cell = (v) => String(v).replace(/\|/g, '\\|').replace(/\n/g, ' ');
1406
-
1407
- function renderTable({ mode, rows }) {
1408
- const out = [];
1409
- out.push('<!-- GENERATED by scripts/gds/government-walk.js - do not hand-edit. Regenerate: node scripts/gds/government-walk.js --write -->');
1410
- out.push('');
1411
- out.push('# The government walk');
1412
- out.push('');
1413
- out.push('One repeatable walk over a throwaway test project\'s government (task 1004658, goal 1000111). Re-run it with `node scripts/gds/government-walk.js`; `tests/government_walk.mjs` re-runs it in CI and fails if any row below changes, so this table is kept true, not just written once.');
1414
- out.push('');
1415
- out.push(`**Mode: ${mode}.** Every request is real HTTP through the real routers, and every decision is the real code: the permission gate, board membership, the vote, the tally, the close, the charter apply (written to a throwaway folder), the decision-rules apply, the act-alone gate on every building, and each module's matter act. The storage underneath is an in-memory stand-in for the government tables with the same guards (no Postgres was available where this was built), and the writes a passed matter makes into other modules (the automation fence, override requests, criteria, the GitHub gate approval, budgets) are recorded in memory. So are the new machinery's own tables (laws, asks, build-outs, pots and borrows), a builder's personal settings and the blockers; the shared database pool refuses every query. The treasury runs on a fixed mid-month clock, so a borrow's amount reads the same every run. Everything the walk puts up it takes down again: no law, Lead, pot, open borrow or open sitting is left standing (P5). A real-database run of this walk is not built yet.`);
1416
- out.push('');
1417
- out.push('The test project: Ada founds it (Archon); Ben and Cy are trusted builders (Metic) and sit on a Council rank; Dee (Thetes) and Eve (Xenos) are newer builders; Fay has left and only authors the probe ideas, so no probe is decided by its own author.');
1418
- out.push('');
1419
- const keys = Object.keys(SECTION_TITLES).filter((k) => rows.some((r) => r.section.startsWith(k)));
1420
- out.push('| Section | Pass | Fail |');
1421
- out.push('|---|---|---|');
1422
- for (const k of keys) {
1423
- const rs = rows.filter((r) => r.section.startsWith(k));
1424
- out.push(`| ${SECTION_TITLES[k]} | ${rs.filter((r) => r.pass).length} | ${rs.filter((r) => !r.pass).length} |`);
1425
- }
1426
- out.push(`| **All** | **${rows.filter((r) => r.pass).length}** | **${rows.filter((r) => !r.pass).length}** |`);
1427
- for (const k of keys) {
1428
- out.push('');
1429
- out.push(`## ${SECTION_TITLES[k]}`);
1430
- out.push('');
1431
- out.push('| # | Check | Expected | Got | Result |');
1432
- out.push('|---|---|---|---|---|');
1433
- for (const r of rows.filter((x) => x.section.startsWith(k))) {
1434
- const bug = KNOWN_BUGS[r.key];
1435
- const result = r.pass ? 'PASS' : `**FAIL**${bug ? ` (${bug})` : ''}`;
1436
- out.push(`| ${r.key} | ${cell(r.name)} | ${cell(r.expected)} | ${cell(r.got)} | ${result} |`);
1437
- }
1438
- }
1439
- out.push('');
1440
- return out.join('\n');
1441
- }
1442
-
1443
- async function main(argv) {
1444
- // Logs from the modules go to stderr so the table on stdout stays readable.
1445
- const realLog = console.log;
1446
- console.log = (...a) => console.error(...a);
1447
- const result = await runWalk();
1448
- const md = renderTable(result);
1449
- console.log = realLog;
1450
- const fails = result.rows.filter((r) => !r.pass);
1451
- if (argv.includes('--check')) {
1452
- const committed = fs.existsSync(DOC_PATH) ? fs.readFileSync(DOC_PATH, 'utf8').replace(/\r\n/g, '\n') : '';
1453
- if (committed !== md) {
1454
- process.stdout.write(md);
1455
- process.stdout.write(`\ngovernment-walk: the committed table (${path.relative(ROOT, DOC_PATH)}) differs from this run. A row changed: find it above, then regenerate with node scripts/gds/government-walk.js --write (and file any new FAIL as a bug under goal 1000111).\n`);
1456
- return 1;
1457
- }
1458
- process.stdout.write(`government-walk: ${result.rows.length - fails.length} pass, ${fails.length} fail - matches the committed table.\n`);
1459
- return 0;
1460
- }
1461
- process.stdout.write(md);
1462
- if (argv.includes('--write')) {
1463
- fs.writeFileSync(DOC_PATH, md);
1464
- process.stdout.write(`\nwrote ${path.relative(ROOT, DOC_PATH)}\n`);
1465
- }
1466
- process.stdout.write(`\ngovernment-walk: ${result.rows.length - fails.length} pass, ${fails.length} fail (${result.mode}).\n`);
1467
- return 0;
1468
- }
1469
-
1470
- if (require.main === module) {
1471
- main(process.argv.slice(2)).then((exitCode) => process.exit(exitCode), (err) => {
1472
- console.error(err);
1473
- process.exit(2);
1474
- });
1475
- }
1476
-
1477
- module.exports = { runWalk, renderTable, REQUESTS, ROUTERS, MATTER_PLAN, KNOWN_BUGS };
7
+ require('../bongos/forwarder.js').forward(module, 'government-walk.js');