@bongos/core 1.19.1073 → 1.19.1075

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 (377) hide show
  1. package/.bongos-core.json +404 -549
  2. package/.claude/skills/feedback/SKILL.md +2 -2
  3. package/bin/bongos.js +1 -3
  4. package/clients/bongos-client/README.md +1 -1
  5. package/clients/bongos-client/bongos-client.global.js +4 -60
  6. package/clients/bongos-client/index.cjs +4 -60
  7. package/clients/bongos-client/index.d.ts +5 -90
  8. package/clients/bongos-client/index.mjs +4 -60
  9. package/config/branding.neutral.json +1 -5
  10. package/config/modules.neutral.json +2 -3
  11. package/config/scheduled-routines.json +0 -2
  12. package/docs/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md +1 -0
  13. package/docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md +1 -0
  14. package/docs/adr/0323-hosting-is-three-shapes-and-we-are-not-the-landlord.md +1 -1
  15. package/docs/adr/0327-a-cloud-host-runs-on-the-owners-account-and-the-key-is-borrowed.md +1 -1
  16. package/docs/adr/0341-the-page-is-the-unit-of-tweak-mode.md +2 -0
  17. package/docs/adr/0345-we-host-every-projects-hall-and-its-app-deploys-where-the-owner-chooses.md +94 -0
  18. package/docs/adr/README.md +1 -0
  19. package/docs/api/openapi.json +175 -1665
  20. package/docs/api-reference.md +9 -41
  21. package/docs/architecture.md +16 -1
  22. package/docs/branding-contract.md +0 -3
  23. package/docs/copy-inventory.md +454 -479
  24. package/docs/copy-registry.json +746 -978
  25. package/docs/file-map.md +5 -34
  26. package/docs/module-api-changelog.md +4 -0
  27. package/docs/modules-contract.md +13 -1
  28. package/docs/onboarding/diagrams/04-architecture.mmd +11 -22
  29. package/docs/onboarding/diagrams/README.md +3 -3
  30. package/docs/onboarding/diagrams/assertions.json +2 -22
  31. package/docs/onboarding/primer.md +9 -28
  32. package/docs/page-inventory.json +4 -1
  33. package/docs/page-readings.json +1032 -1077
  34. package/docs/recipes/render-pilot.md +29 -10
  35. package/migrations/core_257_module_store_registry.sql +87 -0
  36. package/migrations/core_258_drop_dev_box_tables.sql +55 -0
  37. package/modules/agents/module.json +1 -0
  38. package/modules/autonomy/module.json +1 -0
  39. package/modules/builder-settings/module.json +1 -0
  40. package/modules/builder-settings/render-prefs.js +4 -5
  41. package/modules/copy-desk/docx.js +78 -5
  42. package/modules/copy-desk/module.json +1 -0
  43. package/modules/copy-desk/routes/copy-desk.js +10 -10
  44. package/modules/copy-desk/tests/copy_docx.mjs +107 -1
  45. package/modules/copy-desk/tests/fixtures/word-docx.mjs +30 -0
  46. package/modules/discord/module.json +1 -0
  47. package/modules/discord/ship-broadcast.js +3 -3
  48. package/modules/economy/credits.js +2 -2
  49. package/modules/economy/module.json +1 -0
  50. package/modules/economy/routes/credits.js +1 -2
  51. package/modules/government/catalog.js +13 -17
  52. package/modules/government/migrations/government_019_retire_box_permissions.sql +33 -0
  53. package/modules/government/module.json +1 -0
  54. package/modules/government/protected-surfaces.json +3 -11
  55. package/modules/government/resolver.js +3 -46
  56. package/modules/government/routes/government.js +0 -2
  57. package/modules/government/session-scopes.js +43 -83
  58. package/modules/government/session-scopes.json +8 -18
  59. package/modules/grading/module.json +1 -0
  60. package/modules/hall-ui/module.json +1 -0
  61. package/modules/hall-ui/public/board-lib.js +2 -2
  62. package/modules/hall-ui/public/builders.js +29 -40
  63. package/modules/hall-ui/public/collab.html +1 -1
  64. package/modules/hall-ui/public/collab.js +1 -1
  65. package/modules/hall-ui/public/diagrams.html +3 -3
  66. package/modules/hall-ui/public/dom-utils.js +1 -1
  67. package/modules/hall-ui/public/gate.js +2 -2
  68. package/modules/hall-ui/public/gate.states.json +1 -1
  69. package/modules/hall-ui/public/hall-render.js +43 -79
  70. package/modules/hall-ui/public/index.html +5 -1
  71. package/modules/hall-ui/public/modules.js +1 -0
  72. package/modules/hall-ui/public/oversight.css +5 -5
  73. package/modules/hall-ui/public/palette.js +0 -11
  74. package/modules/hall-ui/public/primer.js +1 -1
  75. package/modules/hall-ui/public/sessions.html +1 -1
  76. package/modules/hall-ui/public/settings-sessions.js +1 -1
  77. package/modules/hall-ui/public/settings.css +0 -1
  78. package/modules/hall-ui/public/settings.html +4 -33
  79. package/modules/hall-ui/public/settings.js +3 -33
  80. package/modules/hall-ui/public/settings.states.json +2 -2
  81. package/modules/hall-ui/public/studio.html +1 -1
  82. package/modules/hall-ui/public/style.css +10 -13
  83. package/modules/hall-ui/public/task.html +4 -1
  84. package/modules/hall-ui/public/task.js +36 -1
  85. package/modules/hall-ui/public/tweak-editor-lib.js +18 -1
  86. package/modules/hall-ui/public/tweak-editor.css +16 -0
  87. package/modules/hall-ui/public/tweak-editor.html +26 -3
  88. package/modules/hall-ui/public/tweak-editor.js +32 -1
  89. package/modules/hall-ui/public/work.js +1 -1
  90. package/modules/hall-ui/records/tweak-editor.md +1 -0
  91. package/modules/ideas/module.json +1 -0
  92. package/modules/ideas/projection.js +1 -1
  93. package/modules/lifecycle/db-claim-reads.js +1 -58
  94. package/modules/lifecycle/db-ship.js +4 -9
  95. package/modules/lifecycle/db.js +0 -4
  96. package/modules/lifecycle/github-push.js +12 -14
  97. package/modules/lifecycle/kickoff-checklist.js +0 -4
  98. package/modules/lifecycle/lifecycle.js +0 -8
  99. package/modules/lifecycle/module.json +1 -0
  100. package/modules/lifecycle/publish-reconciler.js +10 -10
  101. package/modules/lifecycle/routes/tasks.js +13 -15
  102. package/modules/lifecycle/ship-card.js +1 -1
  103. package/modules/lifecycle/task-visuals.js +2 -2
  104. package/modules/memory/module.json +1 -0
  105. package/modules/memory/routes/memory.js +2 -2
  106. package/modules/npm-release/module.json +1 -0
  107. package/modules/onboarding/module.json +1 -0
  108. package/modules/onboarding/onboarding-state.js +17 -36
  109. package/modules/onboarding/routes/access-requests.js +3 -3
  110. package/modules/platform-identity/module.json +1 -0
  111. package/modules/platform-identity/platform-identity.js +13 -5
  112. package/modules/platform-identity/routes/sso.js +5 -4
  113. package/modules/platform-identity/tests/platform-identity.mjs +17 -3
  114. package/modules/provisioning/capacity.js +1 -1
  115. package/modules/provisioning/module.json +1 -0
  116. package/modules/provisioning/provisioning.js +6 -5
  117. package/modules/provisioning/routes/provisioning.js +4 -4
  118. package/modules/provisioning/starter-bundles.js +5 -25
  119. package/modules/public-landing/module.json +1 -0
  120. package/modules/public-landing/public/assets/cosmos.css +1 -1
  121. package/modules/public-landing/public/contact.html +1 -1
  122. package/modules/public-landing/public/privacy.html +1 -1
  123. package/modules/public-landing/public/projects.html +101 -32
  124. package/modules/public-landing/public/projects.probes.json +2 -2
  125. package/modules/public-landing/public/projects.states.json +4 -3
  126. package/modules/public-landing/public/terms.html +1 -1
  127. package/modules/security/module.json +1 -0
  128. package/modules/sessions/db.js +1 -1
  129. package/modules/sessions/module.json +1 -0
  130. package/modules/specialities/module.json +1 -0
  131. package/modules/status-ui/module.json +1 -0
  132. package/modules/ui-design/module.json +1 -0
  133. package/package-lock.json +2 -2
  134. package/package.json +1 -1
  135. package/release-notes.json +84 -0
  136. package/scripts/gds/artifact-format.js +203 -0
  137. package/scripts/gds/artifact-staleness.js +2 -2
  138. package/scripts/gds/audit-authorship.sh +1 -13
  139. package/scripts/gds/backfill-task-rewards.js +5 -5
  140. package/scripts/gds/claim.js +0 -15
  141. package/scripts/gds/claude-materialize.js +2 -2
  142. package/scripts/gds/cli-lib.js +15 -15
  143. package/scripts/gds/codemod-rename-src-gds.js +1 -1
  144. package/scripts/gds/context-pack.js +5 -7
  145. package/scripts/gds/diagram-facts.js +12 -23
  146. package/scripts/gds/do-api.js +13 -80
  147. package/scripts/gds/doc-cli-guard.js +2 -0
  148. package/scripts/gds/doctor.js +4 -4
  149. package/scripts/gds/feedback-latest.js +139 -9
  150. package/scripts/gds/fitness-checks-identity.js +2 -7
  151. package/scripts/gds/fitness-checks-packaging.js +4 -4
  152. package/scripts/gds/fitness-checks-write-validation.js +4 -0
  153. package/scripts/gds/fitness-ratchets.js +5 -5
  154. package/scripts/gds/fitness.js +10 -10
  155. package/scripts/gds/gen-api-client.js +4 -4
  156. package/scripts/gds/gen-api-docs.js +1 -1
  157. package/scripts/gds/gen-diagrams.js +49 -71
  158. package/scripts/gds/gen-repo-map.js +13 -14
  159. package/scripts/gds/gen-session-index.js +8 -8
  160. package/scripts/gds/http-api-client.js +12 -19
  161. package/scripts/gds/init.js +1 -1
  162. package/scripts/gds/leak-scan-allowlist.js +1 -1
  163. package/scripts/gds/lint-infra-exec.js +1 -1
  164. package/scripts/gds/local-preview-lib.js +8 -39
  165. package/scripts/gds/local-preview.js +2 -15
  166. package/scripts/gds/migration-namespace.js +3 -3
  167. package/scripts/gds/module-artifact.js +212 -0
  168. package/scripts/gds/module.js +95 -6
  169. package/scripts/gds/package-core.js +5 -116
  170. package/scripts/gds/plain-cards.js +1 -1
  171. package/scripts/gds/provision-config.js +2 -2
  172. package/scripts/gds/provision-net.js +2 -3
  173. package/scripts/gds/provision.js +9 -9
  174. package/scripts/gds/publish-manifest.js +1 -2
  175. package/scripts/gds/push-path-brief.js +10 -10
  176. package/scripts/gds/regen-instance-docs.js +1 -1
  177. package/scripts/gds/rename-history-check.js +1 -1
  178. package/scripts/gds/run-unit-tests.js +2 -16
  179. package/scripts/gds/sandbox-stage.js +39 -341
  180. package/scripts/gds/session-digest-build.js +2 -2
  181. package/scripts/gds/ship-deploy-target.js +13 -13
  182. package/scripts/gds/ship-flow.js +7 -7
  183. package/scripts/gds/ship-land.js +9 -10
  184. package/scripts/gds/ship-merge.js +4 -4
  185. package/scripts/gds/ship-preflight-steps.js +4 -4
  186. package/scripts/gds/ship-regen.js +15 -49
  187. package/scripts/gds/ship.js +13 -33
  188. package/scripts/gds/skill-preflight.js +9 -8
  189. package/scripts/gds/start.js +0 -15
  190. package/scripts/hall-preview/README.md +5 -5
  191. package/scripts/hall-preview/server.js +6 -6
  192. package/scripts/render-diagrams.sh +1 -1
  193. package/src/bongos/api-errors.js +1 -1
  194. package/src/bongos/api-prefix.js +4 -4
  195. package/src/bongos/auth-github.js +2 -3
  196. package/src/bongos/auth.js +51 -126
  197. package/src/bongos/db-kernel.js +2 -3
  198. package/src/bongos/db.js +5 -28
  199. package/src/bongos/module-scope-map.js +14 -29
  200. package/src/bongos/module-store.js +141 -0
  201. package/src/bongos/platform-visibility-gate.js +1 -1
  202. package/src/bongos/route-rank-check.js +3 -16
  203. package/src/bongos/routes/auth.js +0 -116
  204. package/src/bongos/routes/builders.js +5 -15
  205. package/src/bongos/routes/instance.js +8 -14
  206. package/src/bongos/routes/me.js +7 -23
  207. package/src/bongos/routes/modules.js +83 -0
  208. package/src/bongos/routes/security.js +3 -3
  209. package/src/bongos/routes.js +7 -2
  210. package/src/bongos/serve-internal.js +5 -6
  211. package/src/bongos-downloads.js +1 -6
  212. package/src/branding.js +2 -2
  213. package/src/build-info.js +4 -6
  214. package/src/instance-config.js +2 -2
  215. package/src/module-api.js +13 -6
  216. package/src/module-loader/catalog.js +3 -0
  217. package/src/module-loader/loader.js +4 -4
  218. package/src/module-loader/manifest-schema.js +16 -8
  219. package/src/module-seams.js +2 -3
  220. package/src/modules.js +42 -14
  221. package/tests/agents_spend_guard.mjs +1 -1
  222. package/tests/api_alias_caller_ratchet.mjs +1 -1
  223. package/tests/api_alias_exceptions.mjs +1 -1
  224. package/tests/api_client.mjs +1 -16
  225. package/tests/api_path_404.mjs +1 -1
  226. package/tests/auth_page_gate.mjs +10 -10
  227. package/tests/backfill_task_rewards.mjs +1 -1
  228. package/tests/canonical_profile_url.mjs +1 -3
  229. package/tests/claim_action.mjs +4 -1
  230. package/tests/claim_from_task_and_home.mjs +127 -0
  231. package/tests/{box_ship_permissions.mjs → cli_allowlist_permissions.mjs} +5 -5
  232. package/tests/cli_sessions.mjs +1 -1
  233. package/tests/consumer_layout_boot.mjs +2 -0
  234. package/tests/context_pack.mjs +13 -13
  235. package/tests/copy_desk_page_docx.mjs +33 -2
  236. package/tests/copy_inventory.mjs +7 -7
  237. package/tests/core_upgrade_runner.mjs +6 -6
  238. package/tests/credit_grant.mjs +2 -2
  239. package/tests/criterion_suggest.mjs +1 -1
  240. package/tests/deploy_divergence_line.mjs +11 -11
  241. package/tests/design_tokens_sync.mjs +3 -2
  242. package/tests/diagram_facts_offset.mjs +1 -1
  243. package/tests/do_api.mjs +106 -0
  244. package/tests/feedback_latest.mjs +122 -0
  245. package/tests/fitness.mjs +44 -42
  246. package/tests/fitness_ratchets.mjs +2 -2
  247. package/tests/gate_approvals.mjs +0 -1
  248. package/tests/github_push_land_proof.mjs +1 -1
  249. package/tests/go_live.mjs +3 -3
  250. package/tests/goal_advisory.mjs +3 -3
  251. package/tests/goal_suggest.mjs +3 -3
  252. package/tests/government_abuse_matrix.mjs +21 -19
  253. package/tests/government_ownership_scope.mjs +33 -35
  254. package/tests/government_parity.mjs +2 -2
  255. package/tests/government_protected_surfaces.mjs +56 -37
  256. package/tests/government_require_permission.mjs +3 -3
  257. package/tests/government_seed.mjs +37 -4
  258. package/tests/government_session_scope.mjs +92 -366
  259. package/tests/hall_audit.mjs +1 -1
  260. package/tests/hall_error_envelope.mjs +4 -0
  261. package/tests/hall_landing_boot.mjs +4 -1
  262. package/tests/hall_palette.mjs +1 -16
  263. package/tests/hall_record_world.mjs +6 -0
  264. package/tests/hall_tweak_editor.mjs +52 -1
  265. package/tests/helpers.mjs +1 -1
  266. package/tests/host_topology_skips.mjs +3 -4
  267. package/tests/html_comment_nesting.mjs +137 -0
  268. package/tests/infra_exec_paths.mjs +9 -10
  269. package/tests/init.mjs +4 -5
  270. package/tests/instance_manifest.mjs +18 -25
  271. package/tests/kickoff_checklist.mjs +1 -1
  272. package/tests/lib_sh_resolution.mjs +0 -221
  273. package/tests/local_preview.mjs +0 -12
  274. package/tests/migration_namespace.mjs +6 -6
  275. package/tests/module-scope-map.mjs +9 -9
  276. package/tests/module_api.mjs +2 -2
  277. package/tests/module_catalog.mjs +1 -1
  278. package/tests/module_cli.mjs +20 -20
  279. package/tests/module_contributions.mjs +6 -6
  280. package/tests/module_loader.mjs +6 -6
  281. package/tests/module_manifest.mjs +26 -17
  282. package/tests/module_route_rank.mjs +2 -2
  283. package/tests/module_store_publish.mjs +307 -0
  284. package/tests/module_store_publish_route.mjs +121 -0
  285. package/tests/module_store_registry_migration.mjs +70 -0
  286. package/tests/modules.mjs +56 -26
  287. package/tests/modules_route_wiring.mjs +1 -1
  288. package/tests/onboarding_route_signals.mjs +21 -31
  289. package/tests/onboarding_state.mjs +35 -49
  290. package/tests/paste_token_session_store.mjs +1 -1
  291. package/tests/permission_path.mjs +0 -3
  292. package/tests/platform_boot.mjs +1 -2
  293. package/tests/platform_visibility_gate.mjs +1 -1
  294. package/tests/profile_route.mjs +1 -6
  295. package/tests/project_modules_ui.mjs +17 -17
  296. package/tests/projects_hub.mjs +5 -5
  297. package/tests/projects_hub_app_step.mjs +138 -0
  298. package/tests/projects_hub_module_picker.mjs +77 -76
  299. package/tests/projects_hub_pre_uat.mjs +4 -5
  300. package/tests/provision.mjs +7 -7
  301. package/tests/provisioning_capacity.mjs +1 -1
  302. package/tests/provisioning_recommendations.mjs +2 -1
  303. package/tests/provisioning_starter_bundles.mjs +0 -22
  304. package/tests/publish_branch_route.mjs +11 -19
  305. package/tests/publish_manifest.mjs +2 -3
  306. package/tests/publish_reconciler.mjs +8 -8
  307. package/tests/push_path_brief.mjs +10 -9
  308. package/tests/rank_tier_single_source.mjs +1 -13
  309. package/tests/regrade_eligibility.mjs +1 -1
  310. package/tests/rename_history_restraint.mjs +1 -1
  311. package/tests/repo_map.mjs +12 -13
  312. package/tests/runner_drift.mjs +3 -21
  313. package/tests/sandbox_stage.mjs +57 -390
  314. package/tests/seam_wiring_guard.mjs +11 -11
  315. package/tests/search_isolation.mjs +3 -3
  316. package/tests/session_records.mjs +1 -1
  317. package/tests/session_rename_fallback.mjs +1 -22
  318. package/tests/session_start_freshness.mjs +3 -3
  319. package/tests/session_token_hash_db.mjs +1 -1
  320. package/tests/ship_card.mjs +1 -1
  321. package/tests/ship_ci_deploy.mjs +17 -17
  322. package/tests/ship_error_shape.mjs +1 -1
  323. package/tests/ship_premerge.mjs +1 -1
  324. package/tests/ship_resume.mjs +1 -1
  325. package/tests/skill_preflight.mjs +2 -2
  326. package/tests/skip_is_not_pass.mjs +1 -1
  327. package/tests/task_visual_slots.mjs +31 -0
  328. package/tests/terms_acceptance.mjs +2 -2
  329. package/tests/upgrade.mjs +4 -4
  330. package/tests/watch_sealed_floor.mjs +0 -1
  331. package/tests/wizard_draft_resume.mjs +2 -2
  332. package/tests/wizard_intent_resume.mjs +21 -10
  333. package/tests/wizard_preselect_why.mjs +18 -18
  334. package/docs/onboarding/browser-terminal-guide.md +0 -73
  335. package/docs/recipes/managed-settings-remote-control.md +0 -416
  336. package/modules/dev-box/CLAUDE.md +0 -15
  337. package/modules/dev-box/box-access.js +0 -623
  338. package/modules/dev-box/box-credential.js +0 -94
  339. package/modules/dev-box/box-onboard.js +0 -486
  340. package/modules/dev-box/boxes.js +0 -1038
  341. package/modules/dev-box/db.js +0 -39
  342. package/modules/dev-box/module.json +0 -19
  343. package/modules/dev-box/routes/box.js +0 -1223
  344. package/scripts/gds/box-auth-check.js +0 -160
  345. package/scripts/gds/box-infra.js +0 -321
  346. package/scripts/gds/box-sync.js +0 -216
  347. package/scripts/gds/box.js +0 -1332
  348. package/scripts/gds/cf-tunnel.js +0 -558
  349. package/scripts/gds/smoke-box.sh +0 -150
  350. package/scripts/gds/tree-preflight.js +0 -241
  351. package/src/bongos/app-pair.js +0 -172
  352. package/tests/app_pair.mjs +0 -168
  353. package/tests/box_access.mjs +0 -578
  354. package/tests/box_auth_check.mjs +0 -114
  355. package/tests/box_code_staleness.mjs +0 -129
  356. package/tests/box_connect_e2e.mjs +0 -196
  357. package/tests/box_cost.mjs +0 -70
  358. package/tests/box_credential.mjs +0 -125
  359. package/tests/box_dns_repoint.mjs +0 -153
  360. package/tests/box_env.mjs +0 -64
  361. package/tests/box_host_keys.mjs +0 -126
  362. package/tests/box_infra_resolve.mjs +0 -246
  363. package/tests/box_onboard.mjs +0 -317
  364. package/tests/box_scope_session.mjs +0 -119
  365. package/tests/box_sweep_docs.mjs +0 -119
  366. package/tests/box_sync.mjs +0 -55
  367. package/tests/box_sync_scope_report.mjs +0 -126
  368. package/tests/box_task_scope.mjs +0 -169
  369. package/tests/box_task_scope_pause.mjs +0 -66
  370. package/tests/box_terminal_ssrf.mjs +0 -96
  371. package/tests/boxes.mjs +0 -1585
  372. package/tests/cf_ruleset_preflight.mjs +0 -142
  373. package/tests/cf_tunnel.mjs +0 -496
  374. package/tests/docs_scrubber_damage.mjs +0 -111
  375. package/tests/module_scope_active_claims.mjs +0 -94
  376. package/tests/ship_api_client_pathspec.mjs +0 -100
  377. package/tests/tree_preflight.mjs +0 -243
@@ -57,8 +57,7 @@ const PUBLISH = [
57
57
  'modules/lifecycle/db.js',
58
58
  'modules/grading/grader.js',
59
59
  'modules/hall-ui/public/work.js',
60
- 'modules/dev-box/boxes.js',
61
- 'modules/provisioning/provisioning.js', // instance-hosting control plane — CORE like its sibling dev-box (task 2135)
60
+ 'modules/provisioning/provisioning.js', // instance-hosting control plane — CORE (task 2135)
62
61
  // served-at-runtime surfaces a standalone must carry (task 2078) — their absence
63
62
  // from the packaged core 404'd the hall UI + /docs on demo.cloudbongos.com
64
63
  'clients/bongos-client/bongos-client.global.js', // /lib/bongos-client.js (window.BongosClient)
@@ -116,7 +115,7 @@ const EXCLUDE = [
116
115
  // instance identity + history
117
116
  'config/branding.json',
118
117
  'config/modules.json',
119
- 'config/devbox-app.json',
118
+ 'config/hierarchy.json',
120
119
  'CODEOWNERS',
121
120
  'docs/project-context.md',
122
121
  'docs/lore/founding-myth.md',
@@ -3,7 +3,7 @@
3
3
  // Unit tests for the server-owned publish reconciler (task 1134) — the durable
4
4
  // cure for the "strands at confirmed" class. A server-mediated publish (ADR 0055)
5
5
  // is async; ship.js stops polling after ~9 min, so the confirmed→shipped flip had
6
- // no driver once the box exited. This module sweeps confirmed tasks on a timer and
6
+ // no driver once the client exited. This module sweeps confirmed tasks on a timer and
7
7
  // runs the EXACT shipTask + postShipBroadcast the publish-status route runs.
8
8
  //
9
9
  // runSweep is pure w.r.t. injected deps (db / githubPush / emit / loggers)
@@ -1366,7 +1366,7 @@ test('1002606 the aged stale strand now ALSO emits task.strand-flagged', async (
1366
1366
 
1367
1367
  // ---------------------------------------------------------------------------
1368
1368
  // task 1002645 — the reconciler was blind to laptop/wave ships. The sweep derives
1369
- // claude/<worktree_name> (dev-box convention); a wave ship pushes
1369
+ // claude/<worktree_name> first; a wave ship pushes
1370
1370
  // worktree-<worktree_name>, so getPublishStatus saw pr_state:'none' and the whole
1371
1371
  // PR path (mergeIfGreen nudge — the ONLY merger where native auto-merge is
1372
1372
  // repo-disallowed — conflict heal, land proof) never engaged. PRs 34/35/36 all
@@ -1378,7 +1378,7 @@ test('1002645 THE PIN: a worktree-named branch (laptop wave ship) lands UNATTEND
1378
1378
  const deps = mkDeps({
1379
1379
  rows: [{ task_id: 2645, builder_id: 95, worktree_name: 'task-2645', published_head_sha: ON_MAIN }],
1380
1380
  statusByBranch: {
1381
- 'claude/task-2645': NONE, // the derived dev-box branch has no PR
1381
+ 'claude/task-2645': NONE, // the derived claude/ branch has no PR
1382
1382
  'worktree-task-2645': LANDED_NO_WORKFLOW, // the REAL branch: merged, pin-bump repo
1383
1383
  },
1384
1384
  taskPrByTask: { 2645: { branch: 'worktree-task-2645', pr_number: 36, pr_state: 'closed', merged: true } },
@@ -1418,14 +1418,14 @@ test('1002645 a legacy laptop strand (no recorded tip) heals retroactively via t
1418
1418
  assert.deepEqual(deps._calls.ship, [{ taskId: 2616, builderId: 95 }]);
1419
1419
  });
1420
1420
 
1421
- test('1002645 the fallback does NOT fire when the derived branch already has a PR (dev-box path unchanged)', async () => {
1421
+ test('1002645 the fallback does NOT fire when the derived branch already has a PR (derived-branch path unchanged)', async () => {
1422
1422
  const deps = mkDeps({
1423
- rows: [{ task_id: 900, builder_id: 1, worktree_name: 'wt-box' }],
1424
- statusByBranch: { 'claude/wt-box': PENDING },
1423
+ rows: [{ task_id: 900, builder_id: 1, worktree_name: 'wt-derived' }],
1424
+ statusByBranch: { 'claude/wt-derived': PENDING },
1425
1425
  taskPrByTask: { 900: new Error('search must not run') },
1426
1426
  });
1427
1427
  await reconciler.runSweep(deps);
1428
- assert.equal(deps._calls.search.length, 0, 'a dev-box ship keeps the derived-branch path — no extra API call');
1428
+ assert.equal(deps._calls.search.length, 0, 'a ship whose derived branch has a PR keeps that path — no extra API call');
1429
1429
  });
1430
1430
 
1431
1431
  test('1002645 a PR-search failure is swallowed — the sweep continues to the next task and retries next sweep', async () => {
@@ -1481,7 +1481,7 @@ test('1002723 THE PIN: a PR on the BARE worktree branch (task-<id>, no prefix) l
1481
1481
  });
1482
1482
  const r = await reconciler.runSweep(deps);
1483
1483
  assert.equal(r.reconciled, 1, 'the merged-PR-on-bare-branch shape must land with no manual flip');
1484
- assert.ok(deps._calls.status.includes('claude/task-77'), 'dev-box convention tried first');
1484
+ assert.ok(deps._calls.status.includes('claude/task-77'), 'the derived claude/<worktree_name> branch is tried first');
1485
1485
  assert.ok(deps._calls.status.includes('task-77'), 'then the bare worktree branch');
1486
1486
  assert.deepEqual(deps._calls.ship, [{ taskId: 77, builderId: 3 }]);
1487
1487
  });
@@ -1,11 +1,12 @@
1
1
  // tests/push_path_brief.mjs
2
2
  //
3
- // Task 1003259 / idea 1000838 — a dev-box agent, unable to see WHY its git probes were
4
- // failing, asked the owner to mint a PAT and store it on the box. push-path-brief.js is
5
- // the SessionStart line that states the credential model natively so that request never
6
- // gets made again. These tests pin BOTH halves: the line fires on the server-publish
7
- // path with the load-bearing phrases intact, and it is SILENT everywhere else — the
8
- // silence is half the design (a line firing on every healthy laptop becomes wallpaper).
3
+ // Task 1003259 / idea 1000838 — an agent on a checkout with no GitHub push credential, unable
4
+ // to see WHY its git probes were failing, asked the owner to mint a PAT and store it on the
5
+ // machine. push-path-brief.js is the SessionStart line that states the credential model
6
+ // natively so that request never gets made again. These tests pin BOTH halves: the line
7
+ // fires on the server-publish path with the load-bearing phrases intact, and it is SILENT
8
+ // everywhere else — the silence is half the design (a line firing on every healthy laptop
9
+ // becomes wallpaper).
9
10
  //
10
11
  // DB-free + network-free: briefLine is pure, and the CLI cases force the path with
11
12
  // OTB_PUSH_VIA_SERVER so pushVia() never spawns gh. Run: node tests/push_path_brief.mjs
@@ -31,14 +32,14 @@ t('server path gets the brief, with every load-bearing phrase', () => {
31
32
  const l = brief.briefLine('server');
32
33
  assert.ok(typeof l === 'string' && l.length > 0, 'expected a line on the server path');
33
34
  // Each phrase is one of the three facts the 2026-08-24 incident showed an agent
34
- // cannot infer from inside a box. Losing any of them re-opens the gap.
35
+ // cannot infer from inside such a checkout. Losing any of them re-opens the gap.
35
36
  for (const must of [
36
37
  'NO GitHub push credential',
37
38
  'BY DESIGN',
38
39
  '/builder-ship',
39
40
  'NEVER ask the owner for a PAT',
40
41
  'publish-status',
41
- // task 1003988: a box that cannot see which test failed re-pushes blind.
42
+ // task 1003988: a session that cannot see which test failed re-pushes blind.
42
43
  'merge_driver.failing_tests',
43
44
  'checks_unreadable',
44
45
  ]) {
@@ -58,7 +59,7 @@ t('undetermined path stays silent (fail-open, exact vocabulary only)', () => {
58
59
  });
59
60
 
60
61
  t('the line is the exported static constant — nothing is interpolated', () => {
61
- // Trust boundary: this string is injected into every box session's context. Pinning
62
+ // Trust boundary: this string is injected into every server-publish session's context. Pinning
62
63
  // it to the constant proves no builder-authored text can ever ride along.
63
64
  assert.equal(brief.briefLine('server'), brief.BRIEF);
64
65
  });
@@ -12,8 +12,7 @@
12
12
  // modules/discord/discord-channels.js): dependency-free substrate
13
13
  // (permission-path-check runs in a bare git hook), source-parsed literals
14
14
  // (src/bongos/db.js — gate-review.js + diagram-facts.js regex its text),
15
- // standalone CLIs (sequence), the require-free dev-box
16
- // module template (boxes.js), zero-dep catalog + its text-parsing auditor
15
+ // standalone CLIs (sequence), zero-dep catalog + its text-parsing auditor
17
16
  // (route-rank-check), and the hall browser statics.
18
17
  // 3. NO NEW parallel map can land: a repo scan flags any rank→number map or
19
18
  // rank-ladder array literal outside the allowlist below, both directions —
@@ -38,7 +37,6 @@ const lifecycleDb = require(path.join(ROOT, 'modules', 'lifecycle', 'db.js'));
38
37
  const ppc = require(path.join(ROOT, 'src', 'bongos', 'permission-path-check.js'));
39
38
  const rrc = require(path.join(ROOT, 'src', 'bongos', 'route-rank-check.js'));
40
39
  const sequence = require(path.join(ROOT, 'scripts', 'gds', 'sequence.js'));
41
- const boxes = require(path.join(ROOT, 'modules', 'dev-box', 'boxes.js'));
42
40
  const catalog = require(path.join(ROOT, 'modules', 'government', 'catalog.js'));
43
41
 
44
42
  const LADDER = kernel.LIVE_RANK_LADDER;
@@ -81,15 +79,6 @@ test('1-based local copies match: permission-path-check, sequence CLI', () => {
81
79
  assert.deepEqual(sequence.RANK_TIER, TIER, 'sequence.js CLI copy drifted');
82
80
  });
83
81
 
84
- test('0-based local copies match: dev-box boxes.js', () => {
85
- for (const [name, map] of [['boxes', boxes.RANK_ORDER]]) {
86
- assert.deepEqual(Object.keys(map).sort(), [...RANK_KEYS].sort(), `${name} keys drifted`);
87
- for (const r of RANK_KEYS) {
88
- assert.equal(map[r], TIER[r] - 1, `${name}.RANK_ORDER.${r} must be tier-1 (0-based)`);
89
- }
90
- }
91
- });
92
-
93
82
  test('ladder mirrors match: governance catalog, route-rank-check', () => {
94
83
  assert.deepEqual([...catalog.RANK_ORDER], [...LADDER]);
95
84
  assert.deepEqual([...rrc.PERMISSION_RANK_ORDER], [...LADDER]);
@@ -192,7 +181,6 @@ const MAP_ALLOWLIST = new Set([
192
181
  'src/bongos/db.js',
193
182
  'src/bongos/permission-path-check.js',
194
183
  'scripts/gds/sequence.js',
195
- 'modules/dev-box/boxes.js',
196
184
  'modules/hall-ui/public/builders.js',
197
185
  // task 1003206 carved the hall page scripts up. builders.js KEPT its map (the
198
186
  // renderers read it through the injected ctx), while goals-page.js's travelled
@@ -202,7 +202,7 @@ test('buildGradePayload confidence defaults to null when signals omit it', () =>
202
202
  //
203
203
  // The 'confirmed' answer hardcoded "run /merge-mode", which lands by pushing main
204
204
  // via push-main.js (SEC #863 / ADR 0043) and needs an authenticated gh plus a main
205
- // checkout. A server-mediated builder (pushVia()==='server' — every dev box) has
205
+ // checkout. A server-mediated builder (pushVia()==='server' — a checkout with no GitHub push credential) has
206
206
  // neither, so the advice was unreachable by construction. It cost a real builder
207
207
  // 163 minutes on 2026-08-21. strandNextStep already had the right wording for both
208
208
  // modes; these pin that the two modes now diverge and that neither regresses.
@@ -123,7 +123,7 @@ test('the alias mount passes while present and FAILS when dropped', () => {
123
123
  assert.equal(check.checkAliasMounts({ mounts: ['/api/bongos/v1', '/api/bongos', '/api/gds'], required }).ok, true);
124
124
 
125
125
  const r = check.checkAliasMounts({ mounts: ['/api/bongos/v1', '/api/bongos'], required });
126
- assert.equal(r.ok, false, 'shipped Dev Box binaries call the alias and cannot be force-updated');
126
+ assert.equal(r.ok, false, 'shipped binaries and live instances call the alias and cannot be force-updated');
127
127
  assert.deepEqual(r.missing, ['/api/gds']);
128
128
  });
129
129
 
@@ -87,22 +87,21 @@ test('extractor parses functions, classes, arrow consts, and module.exports', ()
87
87
  // exercise the pure extractor against the real auth.js + a known class file
88
88
  const r = run(['--json']);
89
89
  const model = JSON.parse(r.stdout);
90
- // cf-tunnel.js moved modules/dev-box/ -> scripts/gds/ in task 1943 (ADR 0111 §2,
91
- // shared control-plane clients). Pin the extractor against its current home.
92
- const cfTunnel = model.allSyms.find((s) => s.name === 'CfTunnelApi' && s.file === 'scripts/gds/cf-tunnel.js');
93
- assert.ok(cfTunnel && cfTunnel.kind === 'class', 'class declarations are detected');
90
+ // DoApi is a plain `class X extends Y` declaration in a control-plane client.
91
+ const doApi = model.allSyms.find((s) => s.name === 'DoApi' && s.file === 'scripts/gds/do-api.js');
92
+ assert.ok(doApi && doApi.kind === 'class', 'class declarations are detected');
94
93
  const apiCall = model.allSyms.find((s) => s.name === 'apiCall' && s.file === 'scripts/gds/cli-lib.js');
95
94
  assert.ok(apiCall && apiCall.exported && apiCall.kind === 'fn', 'exported arrow/fn const detected with export flag');
96
95
  });
97
96
 
98
- test('--whole-only never writes a TRACKED nested block (the sparse-box deadlock guard, task 1002962)', () => {
99
- // A dev box is a SPARSE checkout — box-access.js materializes only the claim's
100
- // module cone. The block ordering is `b.refs - a.refs || name` and `refs` counts
101
- // references across the VISIBLE corpus, so a box with 7 of 20 modules emits a
102
- // legitimately different block. box-source-fetch.sh used to write it, dirtying
103
- // tracked files, and the NEXT `git pull` aborted on "local changes would be
104
- // overwritten" — a silent permanent sync deadlock (one box sat 257 commits behind
105
- // for three days). A box CONSUMES these blocks; only a full checkout may write them.
97
+ test('--whole-only never writes a TRACKED nested block (the sparse-checkout deadlock guard, task 1002962)', () => {
98
+ // A SPARSE checkout holds only part of the module tree. The block ordering is
99
+ // `b.refs - a.refs || name` and `refs` counts references across the VISIBLE
100
+ // corpus, so a checkout with 7 of 20 modules emits a legitimately different block.
101
+ // A fetch script used to write it, dirtying tracked files, and the NEXT `git pull`
102
+ // aborted on "local changes would be overwritten" — a silent permanent sync
103
+ // deadlock (one checkout sat 257 commits behind for three days). A sparse checkout
104
+ // CONSUMES these blocks; only a full checkout may write them.
106
105
  //
107
106
  // Asserted on CONTENT, not on the log line: dirty a tracked block, run --whole-only,
108
107
  // and require the block to come back byte-identical. A regression that re-enabled the
@@ -117,7 +116,7 @@ test('--whole-only never writes a TRACKED nested block (the sparse-box deadlock
117
116
  assert.equal(
118
117
  readFileSync(tracked, 'utf8'),
119
118
  drifted,
120
- '--whole-only rewrote a tracked nested block — this is the deadlock that stranded a box 257 commits behind',
119
+ '--whole-only rewrote a tracked nested block — this is the deadlock that stranded a checkout 257 commits behind',
121
120
  );
122
121
  assert.ok(!r.stdout.includes('CLAUDE.md'), `--whole-only must not report a nested-doc write; got: ${r.stdout.trim()}`);
123
122
  } finally {
@@ -77,9 +77,9 @@ t('assessRunnerUnit: a drop-in that ADDS an ExecStart without clearing leaves th
77
77
  t('runnerScriptPath: node + a relative script resolves against WorkingDirectory; a wrapper resolves to null', () => {
78
78
  assert.equal(runnerScriptPath({ workingDirectory: INSTANCE, execStart: '/usr/bin/node node_modules/@bongos/core/scripts/gds/provision.js run-intents --apply' }),
79
79
  `${INSTANCE}/node_modules/@bongos/core/scripts/gds/provision.js`);
80
- assert.equal(runnerScriptPath({ workingDirectory: '/w', execStart: '/usr/bin/env node /abs/core/scripts/gds/box.js run-intents' }), '/abs/core/scripts/gds/box.js');
81
- assert.equal(runnerScriptPath({ workingDirectory: '/w', execStart: '-/usr/bin/node scripts/gds/box.js' }), '/w/scripts/gds/box.js', 'systemd exec prefixes are stripped');
82
- assert.equal(runnerScriptPath({ workingDirectory: '/w', execStart: '/usr/bin/env NODE_ENV=production node --max-old-space-size=512 scripts/gds/box.js' }), '/w/scripts/gds/box.js', 'env assignments and node flags are skipped');
80
+ assert.equal(runnerScriptPath({ workingDirectory: '/w', execStart: '/usr/bin/env node /abs/core/scripts/gds/provision.js run-intents' }), '/abs/core/scripts/gds/provision.js');
81
+ assert.equal(runnerScriptPath({ workingDirectory: '/w', execStart: '-/usr/bin/node scripts/gds/provision.js' }), '/w/scripts/gds/provision.js', 'systemd exec prefixes are stripped');
82
+ assert.equal(runnerScriptPath({ workingDirectory: '/w', execStart: '/usr/bin/env NODE_ENV=production node --max-old-space-size=512 scripts/gds/provision.js' }), '/w/scripts/gds/provision.js', 'env assignments and node flags are skipped');
83
83
  assert.equal(runnerScriptPath({ workingDirectory: '/w', execStart: '/usr/bin/env bash infra/core-node.sh scripts/gds/provision.js' }), null,
84
84
  'a shell wrapper decides at runtime which core it loads — the gate must not guess');
85
85
  });
@@ -130,24 +130,6 @@ t('runnerBanner: names the runner core + path, and flags a differing instance co
130
130
  assert.equal(runnerBanner({ runnerVersion: null, runnerRoot: '/r', instanceVersion: null, instanceRoot: '/i' }), 'runner core ? from /r (no installed core at /i)');
131
131
  });
132
132
 
133
- // box.js run-intents is the other runner the incident class covers — it opens with the same line.
134
- const { cmdRunIntents: boxRunIntents } = await import('../scripts/gds/box.js');
135
- {
136
- const lines = [];
137
- const origLog = console.log;
138
- const origRoot = process.env.BONGOS_INSTANCE_ROOT;
139
- process.env.BONGOS_INSTANCE_ROOT = '/no/such/instance';
140
- console.log = (l) => lines.push(String(l));
141
- try { await boxRunIntents({ query: async () => ({ rows: [] }) }, {}, null, { apply: false }); }
142
- finally {
143
- console.log = origLog;
144
- if (origRoot === undefined) delete process.env.BONGOS_INSTANCE_ROOT; else process.env.BONGOS_INSTANCE_ROOT = origRoot;
145
- }
146
- t('box.js run-intents opens with the runner core version line', () => {
147
- assert.match(lines[0], /^runner core \d+\.\d+\.\d+ from .+ \(no installed core at \/no\/such\/instance\)$/);
148
- });
149
- }
150
-
151
133
  const { runnerDriftRows } = await import('../scripts/gds/doctor.js');
152
134
 
153
135
  t('doctor maps each verdict to a row: ok → ok, drift → FAIL with the fix, unresolved → warn', () => {