@bongos/core 1.23.22 → 1.24.1

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 (424) hide show
  1. package/.bongos-core.json +902 -407
  2. package/.claude/skills/blocker-review/SKILL.md +9 -1
  3. package/.claude/skills/blocker-solve/SKILL.md +1 -1
  4. package/.claude/skills/builder-claim/SKILL.md +1 -1
  5. package/.claude/skills/builder-reauth/SKILL.md +1 -1
  6. package/.claude/skills/builder-redteam/SKILL.md +1 -1
  7. package/.claude/skills/builder-sequence/SKILL.md +1 -1
  8. package/.claude/skills/builder-setup/SKILL.md +1 -1
  9. package/.claude/skills/builder-ship/SKILL.md +1 -1
  10. package/.claude/skills/collab-review/SKILL.md +5 -2
  11. package/.claude/skills/design/SKILL.md +1 -1
  12. package/.claude/skills/goal-create/SKILL.md +2 -2
  13. package/.claude/skills/grade-recover/SKILL.md +1 -1
  14. package/.claude/skills/merge-mode/SKILL.md +1 -1
  15. package/.claude/skills/owner-review/SKILL.md +1 -1
  16. package/.claude/skills/planning-session/SKILL.md +11 -11
  17. package/.claude/skills/read-session-export/SKILL.md +1 -1
  18. package/.claude/skills/recall/SKILL.md +1 -1
  19. package/.claude/skills/scan-before-install/SKILL.md +1 -1
  20. package/.claude/skills/session-handoff/SKILL.md +1 -1
  21. package/.claude/skills/strand-fix/SKILL.md +13 -0
  22. package/.claude/skills/worktree-clean/SKILL.md +1 -1
  23. package/AGENTS.md +15 -0
  24. package/GEMINI.md +5 -0
  25. package/clients/bongos-client/README.md +1 -1
  26. package/clients/bongos-client/bongos-client.global.js +90 -0
  27. package/clients/bongos-client/index.cjs +90 -0
  28. package/clients/bongos-client/index.d.ts +149 -4
  29. package/clients/bongos-client/index.mjs +90 -0
  30. package/docs/adr/0054-session-token-reward-cost-plus.md +3 -1
  31. package/docs/adr/0055-server-mediated-branch-publish.md +1 -1
  32. package/docs/adr/0393-a-platform-account-is-a-person-and-github-is-one-way-in.md +37 -0
  33. package/docs/adr/0394-market-watch-searches-through-the-messages-api-on-the-projects-key-and-runs-from-its-own-poller.md +102 -0
  34. package/docs/adr/0395-a-task-says-what-it-needs-and-lists-show-only-what-you-can-do.md +36 -0
  35. package/docs/adr/0396-google-sign-in-a-stand-in-login-and-a-browser-approved-cli-sign-in.md +41 -0
  36. package/docs/adr/README.md +5 -1
  37. package/docs/api/openapi.json +8555 -5876
  38. package/docs/api-reference.md +63 -10
  39. package/docs/architecture.md +37 -1
  40. package/docs/canonical-permissions.md +1 -1
  41. package/docs/copy-inventory.md +420 -337
  42. package/docs/copy-registry.json +1321 -500
  43. package/docs/file-map.md +1 -0
  44. package/docs/module-api-changelog.md +5 -0
  45. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +3 -3
  46. package/docs/onboarding/diagrams/README.md +1 -1
  47. package/docs/onboarding/drachmae-and-karma.md +15 -15
  48. package/docs/onboarding/primer.md +2 -2
  49. package/docs/page-inventory.json +55 -6
  50. package/docs/page-readings.json +1185 -1011
  51. package/docs/recipes/google-sign-in.md +60 -0
  52. package/docs/recipes/ops-gotchas.md +1 -1
  53. package/migrations/core_282_builders_lower_login_idx.sql +33 -0
  54. package/migrations/core_283_claimable_ignores_page_markers.sql +53 -0
  55. package/migrations/core_283_payout_approvals.sql +183 -0
  56. package/migrations/core_284_payout_gates.sql +179 -0
  57. package/migrations/core_285_task_needs.sql +74 -0
  58. package/modules/ai-studio/billing.js +67 -0
  59. package/modules/ai-studio/context.js +29 -0
  60. package/modules/ai-studio/db.js +172 -0
  61. package/modules/ai-studio/gemini.js +75 -0
  62. package/modules/ai-studio/generate.js +119 -0
  63. package/modules/ai-studio/keys.js +73 -0
  64. package/modules/ai-studio/migrations/ai_studio_001_keys.sql +22 -0
  65. package/modules/ai-studio/migrations/ai_studio_002_ledger.sql +48 -0
  66. package/modules/ai-studio/migrations/ai_studio_003_requests.sql +55 -0
  67. package/modules/ai-studio/openrouter.js +90 -0
  68. package/modules/ai-studio/payments.js +105 -0
  69. package/modules/ai-studio/pricing.js +92 -0
  70. package/modules/ai-studio/routes/ai-studio.js +235 -5
  71. package/modules/ai-studio/studio.js +121 -0
  72. package/modules/autonomy/fence.js +64 -1
  73. package/modules/builder-settings/builder-needs.js +27 -1
  74. package/modules/copy-desk/routes/copy-desk.js +5 -0
  75. package/modules/economy/achievements.js +22 -10
  76. package/modules/economy/cost-classify.js +9 -0
  77. package/modules/economy/cost-write-guard.js +52 -0
  78. package/modules/economy/cost.js +2 -1
  79. package/modules/economy/credits.js +18 -15
  80. package/modules/economy/goal-reward.js +161 -0
  81. package/modules/economy/reward.js +4 -0
  82. package/modules/economy/routes/cost.js +33 -7
  83. package/modules/government/catalog.js +6 -0
  84. package/modules/government/db.js +34 -0
  85. package/modules/government/docket.js +36 -0
  86. package/modules/government/migrations/government_035_payout_approve.sql +29 -0
  87. package/modules/government/pollers/board-expiry.js +108 -20
  88. package/modules/government/protected-surfaces.json +1 -0
  89. package/modules/government/routes/government.js +22 -0
  90. package/modules/government/routing.js +39 -5
  91. package/modules/government/waiting.js +74 -0
  92. package/modules/hall-ui/public/ai-studio-lib.js +268 -0
  93. package/modules/hall-ui/public/ai-studio.css +193 -0
  94. package/modules/hall-ui/public/ai-studio.html +98 -0
  95. package/modules/hall-ui/public/ai-studio.js +556 -0
  96. package/modules/hall-ui/public/ai-studio.states.json +94 -0
  97. package/modules/hall-ui/public/blockers-by-person.js +156 -0
  98. package/modules/hall-ui/public/blockers-lib.js +15 -1
  99. package/modules/hall-ui/public/blockers.html +8 -0
  100. package/modules/hall-ui/public/blockers.js +1 -1
  101. package/modules/hall-ui/public/claim-action.js +3 -0
  102. package/modules/hall-ui/public/collab.html +12 -0
  103. package/modules/hall-ui/public/craft-mode.js +4 -1
  104. package/modules/hall-ui/public/criterion-uat-ui.js +4 -1
  105. package/modules/hall-ui/public/drachmae.html +1 -1
  106. package/modules/hall-ui/public/genesis/r5-life-1-primordial-sea.jpg +0 -0
  107. package/modules/hall-ui/public/genesis/r5-life-2-first-cells-cut.webp +0 -0
  108. package/modules/hall-ui/public/genesis/r5-life-2-first-cells.jpg +0 -0
  109. package/modules/hall-ui/public/genesis/r5-life-3-genome-cut.webp +0 -0
  110. package/modules/hall-ui/public/genesis/r5-life-3-genome.jpg +0 -0
  111. package/modules/hall-ui/public/genesis/r5-life-4-membrane-cut.webp +0 -0
  112. package/modules/hall-ui/public/genesis/r5-life-4-membrane.jpg +0 -0
  113. package/modules/hall-ui/public/genesis/r5-life-5-nervous-system-cut.webp +0 -0
  114. package/modules/hall-ui/public/genesis/r5-life-5-nervous-system.jpg +0 -0
  115. package/modules/hall-ui/public/goal-inbox.js +1 -1
  116. package/modules/hall-ui/public/goals-render.js +4 -0
  117. package/modules/hall-ui/public/goals.html +8 -0
  118. package/modules/hall-ui/public/gov-living.js +6 -2
  119. package/modules/hall-ui/public/hall-ask.css +5 -0
  120. package/modules/hall-ui/public/hall-ask.js +39 -3
  121. package/modules/hall-ui/public/notes-panel.css +20 -0
  122. package/modules/hall-ui/public/notes-panel.js +146 -0
  123. package/modules/hall-ui/public/project-settings.html +1 -1
  124. package/modules/hall-ui/public/project-settings.js +7 -5
  125. package/modules/hall-ui/public/settings-ai-keys.js +124 -0
  126. package/modules/hall-ui/public/settings.html +15 -0
  127. package/modules/hall-ui/public/street-deck.js +12 -3
  128. package/modules/hall-ui/public/studio.css +90 -8
  129. package/modules/hall-ui/public/studio.html +39 -10
  130. package/modules/hall-ui/public/studio.js +148 -18
  131. package/modules/hall-ui/public/task.html +2 -0
  132. package/modules/hall-ui/public/task.js +4 -0
  133. package/modules/hall-ui/public/tweak-editor.js +12 -3
  134. package/modules/hall-ui/public/welcome-boot.css +42 -6
  135. package/modules/hall-ui/public/welcome-boot.js +20 -6
  136. package/modules/hall-ui/public/work.js +20 -0
  137. package/modules/hall-ui/records/ai-studio.md +36 -0
  138. package/modules/hall-ui/records/blockers-people.md +24 -0
  139. package/modules/lifecycle/db-claims.js +32 -4
  140. package/modules/lifecycle/db-goals.js +18 -5
  141. package/modules/lifecycle/db-tasks.js +15 -6
  142. package/modules/lifecycle/done-when.js +23 -1
  143. package/modules/lifecycle/lifecycle.js +5 -0
  144. package/modules/lifecycle/migrations/lifecycle_017_notes.sql +46 -0
  145. package/modules/lifecycle/module.json +2 -1
  146. package/modules/lifecycle/notes.js +219 -0
  147. package/modules/lifecycle/page-notice.js +124 -0
  148. package/modules/lifecycle/page-tweak-artist.js +18 -1
  149. package/modules/lifecycle/publish-reconciler.js +67 -20
  150. package/modules/lifecycle/routes/claims.js +5 -2
  151. package/modules/lifecycle/routes/goals.js +3 -1
  152. package/modules/lifecycle/routes/notes.js +91 -0
  153. package/modules/lifecycle/routes/project-settings.js +43 -35
  154. package/modules/lifecycle/routes/task-route-helpers.js +21 -0
  155. package/modules/lifecycle/routes/task-write-routes.js +21 -3
  156. package/modules/lifecycle/routes/tasks.js +12 -12
  157. package/modules/lifecycle/task-needs-gate.js +70 -0
  158. package/modules/market-watch/CLAUDE.md +15 -0
  159. package/modules/market-watch/db.js +340 -0
  160. package/modules/market-watch/key.js +58 -0
  161. package/modules/market-watch/migrations/market_watch_001_tables.sql +249 -0
  162. package/modules/market-watch/migrations/market_watch_002_run.sql +46 -0
  163. package/modules/market-watch/module.json +26 -0
  164. package/modules/market-watch/pollers/hub-seed.js +54 -0
  165. package/modules/market-watch/pollers/weekly-run.js +100 -0
  166. package/modules/market-watch/research.js +350 -0
  167. package/modules/market-watch/run.js +245 -0
  168. package/modules/market-watch/seed/market-data.json +38 -0
  169. package/modules/market-watch/seed/partners-data.json +497 -0
  170. package/modules/market-watch/seed.js +252 -0
  171. package/modules/market-watch/store.js +230 -0
  172. package/modules/memory/routes/memory.js +14 -2
  173. package/modules/memory/routes/search.js +8 -2
  174. package/modules/platform-identity/account-logins.js +192 -0
  175. package/modules/platform-identity/migrations/platform_identity_034_account_logins.sql +96 -0
  176. package/modules/platform-identity/platform-identity.js +5 -4
  177. package/modules/platform-identity/routes/my-projects.js +6 -0
  178. package/modules/platform-identity/routes/profile.js +18 -0
  179. package/modules/platform-identity/routes/public-profile.js +10 -1
  180. package/modules/platform-identity/routes/sso.js +26 -1
  181. package/modules/platform-identity/tests/platform-identity.mjs +2 -1
  182. package/modules/provisioning/credential-preflight.js +13 -3
  183. package/modules/provisioning/pollers/app-liveness.js +25 -5
  184. package/modules/provisioning/routes/provisioning.js +1 -1
  185. package/modules/provisioning/starter-bundles.js +6 -2
  186. package/modules/public-landing/public/account.html +10 -2
  187. package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.jpg +0 -0
  188. package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.jpg.json +1 -1
  189. package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.webp +0 -0
  190. package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.webp.json +1 -1
  191. package/modules/public-landing/public/assets/world/r2-chrome-blob-one-cut.webp +0 -0
  192. package/modules/public-landing/public/assets/world/r2-chrome-blob-one-cut.webp.json +1 -1
  193. package/modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg +0 -0
  194. package/modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg.json +1 -1
  195. package/modules/public-landing/public/assets/world/r2-chrome-blob-one.webp +0 -0
  196. package/modules/public-landing/public/assets/world/r2-chrome-blob-one.webp.json +1 -1
  197. package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.jpg +0 -0
  198. package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.jpg.json +1 -1
  199. package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.webp +0 -0
  200. package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.webp.json +1 -1
  201. package/modules/public-landing/public/assets/world/r3-frost-bead-cut.webp +0 -0
  202. package/modules/public-landing/public/assets/world/r3-frost-bead-cut.webp.json +1 -1
  203. package/modules/public-landing/public/assets/world/r3-frost-pair-cut.webp +0 -0
  204. package/modules/public-landing/public/assets/world/r3-frost-pair-cut.webp.json +1 -1
  205. package/modules/public-landing/public/assets/world/r3-gold-blob-cut.webp +0 -0
  206. package/modules/public-landing/public/assets/world/r3-gold-blob-cut.webp.json +1 -1
  207. package/modules/public-landing/public/assets/world/r3-gold-pair-cut.webp +0 -0
  208. package/modules/public-landing/public/assets/world/r3-gold-pair-cut.webp.json +1 -1
  209. package/modules/public-landing/public/assets/world/r3-obsidian-blob-cut.webp +0 -0
  210. package/modules/public-landing/public/assets/world/r3-obsidian-blob-cut.webp.json +1 -1
  211. package/modules/public-landing/public/assets/world/r3-obsidian-pair-cut.webp +0 -0
  212. package/modules/public-landing/public/assets/world/r3-obsidian-pair-cut.webp.json +1 -1
  213. package/modules/public-landing/public/assets/world/r3-space-nebula.jpg +0 -0
  214. package/modules/public-landing/public/assets/world/r3-space-nebula.jpg.json +1 -1
  215. package/modules/public-landing/public/assets/world/r4-card-chrome.jpg +0 -0
  216. package/modules/public-landing/public/assets/world/r4-card-chrome.jpg.json +1 -1
  217. package/modules/public-landing/public/assets/world/r4-card-nebula.jpg +0 -0
  218. package/modules/public-landing/public/assets/world/r4-card-nebula.jpg.json +1 -1
  219. package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg +0 -0
  220. package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg.json +1 -1
  221. package/modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp +0 -0
  222. package/modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp.json +1 -1
  223. package/modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg +0 -0
  224. package/modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg.json +1 -1
  225. package/modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp +0 -0
  226. package/modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp.json +1 -1
  227. package/modules/public-landing/public/assets/world/r5-life-3-genome.jpg +0 -0
  228. package/modules/public-landing/public/assets/world/r5-life-3-genome.jpg.json +1 -1
  229. package/modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp +0 -0
  230. package/modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp.json +1 -1
  231. package/modules/public-landing/public/assets/world/r5-life-4-membrane.jpg +0 -0
  232. package/modules/public-landing/public/assets/world/r5-life-4-membrane.jpg.json +1 -1
  233. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp +0 -0
  234. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp.json +1 -1
  235. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg +0 -0
  236. package/modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg.json +1 -1
  237. package/modules/public-landing/public/community.html +1 -1
  238. package/modules/public-landing/public/connections.html +2 -2
  239. package/modules/public-landing/public/guild.html +1 -1
  240. package/modules/public-landing/public/invitations.html +2 -2
  241. package/modules/public-landing/public/projects.html +5 -5
  242. package/modules/raise/views/nda.html +2 -0
  243. package/modules/specialities/db.js +32 -1
  244. package/modules/specialities/routes/specialities.js +10 -6
  245. package/modules/status-ui/public/index.html +1 -1
  246. package/package-lock.json +2 -2
  247. package/package.json +1 -1
  248. package/release-notes.json +220 -0
  249. package/scripts/bongos/autobongos-tweak-lane.js +46 -1
  250. package/scripts/bongos/backfill-subagent-rewards.js +2 -2
  251. package/scripts/bongos/claim.js +22 -1
  252. package/scripts/bongos/db-backup-nightly.sh +29 -0
  253. package/scripts/bongos/deploy-divergence.js +7 -0
  254. package/scripts/bongos/doc-cli-guard.js +6 -0
  255. package/scripts/bongos/fitness.js +3 -2
  256. package/scripts/bongos/gen-diagrams.js +3 -3
  257. package/scripts/bongos/lib.sh +4 -5
  258. package/scripts/bongos/migration-namespace.js +13 -1
  259. package/scripts/bongos/plain-cards.js +4 -0
  260. package/scripts/bongos/provision-github-setup.js +3 -1
  261. package/scripts/bongos/provision-units.js +6 -1
  262. package/scripts/bongos/publish-manifest.js +3 -0
  263. package/scripts/bongos/release.js +2 -0
  264. package/scripts/bongos/run-unit-tests.js +268 -82
  265. package/scripts/bongos/seed-tasks.example.json +56 -0
  266. package/scripts/bongos/seed-tasks.js +222 -0
  267. package/scripts/bongos/seed-verify-criteria.js +1 -2
  268. package/scripts/bongos/ship-finish.js +2 -0
  269. package/scripts/bongos/ship-resume.js +2 -0
  270. package/scripts/bongos/strand-lease.js +250 -0
  271. package/scripts/bongos/strand-watch.js +26 -5
  272. package/scripts/bongos/version-literal-guard.js +2 -2
  273. package/scripts/discord/post.js +4 -3
  274. package/scripts/gds/seed-tasks.js +7 -0
  275. package/scripts/gds/{build-bongos.js → strand-lease.js} +3 -3
  276. package/scripts/hall-preview/server.js +21 -0
  277. package/src/bongos/auth-config.js +29 -1
  278. package/src/bongos/auth-discord.js +3 -3
  279. package/src/bongos/auth-github.js +3 -6
  280. package/src/bongos/auth-google.js +217 -0
  281. package/src/bongos/device-approval.js +140 -0
  282. package/src/bongos/llm-pricing.js +17 -1
  283. package/src/bongos/metrics.js +48 -2
  284. package/src/bongos/middleware/rate-limit.js +30 -11
  285. package/src/bongos/module-scope-map.js +12 -1
  286. package/src/bongos/optimizer.js +15 -1
  287. package/src/bongos/payout-approvals.js +342 -0
  288. package/src/bongos/payout-gates.js +364 -0
  289. package/src/bongos/prelaunch-gate.js +7 -9
  290. package/src/bongos/prelaunch-switch.js +20 -0
  291. package/src/bongos/route-rank-check.js +3 -0
  292. package/src/bongos/routes/auth-google.js +246 -0
  293. package/src/bongos/routes/auth.js +38 -1
  294. package/src/bongos/routes/backup.js +33 -9
  295. package/src/bongos/routes/builders.js +57 -30
  296. package/src/bongos/routes/github.js +9 -0
  297. package/src/bongos/routes/me.js +18 -0
  298. package/src/bongos/routes/my-payouts.js +133 -0
  299. package/src/bongos/routes/payout-approvals.js +312 -0
  300. package/src/bongos/routes/payout-gates.js +179 -0
  301. package/src/bongos/routes.js +15 -1
  302. package/src/bongos/secret-box.js +18 -3
  303. package/src/bongos/serve-internal.js +47 -19
  304. package/src/bongos/sign-in-pages.js +138 -0
  305. package/src/bongos/task-needs.js +146 -0
  306. package/src/bongos-downloads.js +18 -1
  307. package/src/instance-config.js +28 -0
  308. package/src/module-api.js +14 -1
  309. package/tests/account_logins.mjs +326 -0
  310. package/tests/account_logins_db.mjs +161 -0
  311. package/tests/ai_studio_billing.mjs +253 -0
  312. package/tests/ai_studio_generate.mjs +282 -0
  313. package/tests/ai_studio_keys.mjs +159 -0
  314. package/tests/ai_studio_requests.mjs +319 -0
  315. package/tests/auth_backchannel_logout_route.mjs +201 -0
  316. package/tests/auto_satisfy_criteria.mjs +10 -1
  317. package/tests/autobongos_tweak_lane.mjs +144 -0
  318. package/tests/autobongos_tweak_pin_identity.mjs +137 -0
  319. package/tests/backfill_subagent_rewards.mjs +17 -1
  320. package/tests/backup_trigger_lock.mjs +119 -0
  321. package/tests/blockers_people.mjs +198 -0
  322. package/tests/bounded_rate_maps.mjs +184 -0
  323. package/tests/claimable_blocker_status.mjs +1 -1
  324. package/tests/claims_batch_routes.mjs +421 -0
  325. package/tests/config_read_cache.mjs +171 -0
  326. package/tests/copy_desk_page_editor.mjs +12 -0
  327. package/tests/cost_write_guard.mjs +200 -0
  328. package/tests/craft_achievements.mjs +33 -10
  329. package/tests/criterion_goal_attach.mjs +1 -1
  330. package/tests/db_backup_nightly.mjs +73 -1
  331. package/tests/deploy_divergence_line.mjs +7 -0
  332. package/tests/effective_visibility_predicate.mjs +12 -0
  333. package/tests/fitness.mjs +19 -0
  334. package/tests/fixtures/seed-tasks/bongos-v1-idea-routing.json +256 -0
  335. package/tests/fixtures/seed-tasks/bv1-profiles.json +592 -0
  336. package/tests/fixtures/seed-tasks/bv2-ideator-surface.json +373 -0
  337. package/tests/fixtures/seed-tasks/fake-api.mjs +80 -0
  338. package/tests/github_one_trip.mjs +34 -0
  339. package/tests/github_repo_visibility.mjs +20 -0
  340. package/tests/goal_achievement.mjs +30 -1
  341. package/tests/goal_achievement_reward.mjs +205 -0
  342. package/tests/goal_sort_staleness.mjs +2 -1
  343. package/tests/goal_tier.mjs +11 -1
  344. package/tests/google_fonts_nonblocking.mjs +84 -0
  345. package/tests/google_sign_in.mjs +401 -0
  346. package/tests/government_board_expiry.mjs +94 -0
  347. package/tests/government_protected_surfaces.mjs +1 -1
  348. package/tests/government_routes.mjs +1 -1
  349. package/tests/hall_ai_studio.mjs +347 -0
  350. package/tests/hall_page_gate_map.mjs +3 -0
  351. package/tests/hall_studio_home.mjs +61 -2
  352. package/tests/home_attention_cards.mjs +1 -1
  353. package/tests/human_signal.mjs +141 -0
  354. package/tests/install_script_reader.mjs +51 -0
  355. package/tests/integration_fixture_ids.mjs +82 -0
  356. package/tests/invite_expiry_db.mjs +13 -1
  357. package/tests/lib_sh_resolution.mjs +0 -4
  358. package/tests/market_watch_data.mjs +244 -0
  359. package/tests/market_watch_data_db.mjs +308 -0
  360. package/tests/market_watch_module.mjs +114 -0
  361. package/tests/market_watch_run.mjs +503 -0
  362. package/tests/metrics.mjs +124 -0
  363. package/tests/migration_namespace.mjs +14 -0
  364. package/tests/module_api.mjs +2 -0
  365. package/tests/module_loader.mjs +1 -1
  366. package/tests/notes.mjs +182 -0
  367. package/tests/own_scope_guard.mjs +5 -0
  368. package/tests/page_tweak_marker_sql.mjs +76 -0
  369. package/tests/page_tweak_no_block.mjs +135 -0
  370. package/tests/page_tweak_notice.mjs +103 -0
  371. package/tests/payout_approvals.mjs +253 -0
  372. package/tests/payout_approvals_db.mjs +106 -0
  373. package/tests/payout_gates.mjs +322 -0
  374. package/tests/payout_gates_db.mjs +113 -0
  375. package/tests/planning_session_skill.mjs +13 -3
  376. package/tests/project_settings_page.mjs +29 -5
  377. package/tests/project_settings_spend_cap_route.mjs +235 -0
  378. package/tests/promotion_sweep.mjs +29 -1
  379. package/tests/provision.mjs +3 -2
  380. package/tests/provisioning_app_status.mjs +18 -0
  381. package/tests/provisioning_credential_preflight.mjs +53 -0
  382. package/tests/provisioning_env_manifest_edit_delete.mjs +223 -0
  383. package/tests/publish_reconciler_overlap.mjs +60 -0
  384. package/tests/rank_change_broadcast_port.mjs +151 -0
  385. package/tests/seed_tasks.mjs +176 -0
  386. package/tests/seed_verify_criteria.mjs +2 -6
  387. package/tests/site_classified_once.mjs +142 -0
  388. package/tests/speciality_db_shape.mjs +23 -0
  389. package/tests/speciality_session_skills.mjs +48 -2
  390. package/tests/strand_lease.mjs +249 -0
  391. package/tests/strand_watch.mjs +10 -0
  392. package/tests/task_criteria_routes.mjs +275 -0
  393. package/tests/task_criteria_unlink_db.mjs +123 -0
  394. package/tests/task_needs.mjs +233 -0
  395. package/tests/task_needs_db.mjs +110 -0
  396. package/tests/unit_runner_serial.mjs +266 -43
  397. package/tests/version_literals.mjs +5 -7
  398. package/tests/welcome_boot.mjs +16 -5
  399. package/tests/welcome_boot_browser.mjs +36 -4
  400. package/docs/recipes/bongos-cli-release.md +0 -66
  401. package/scripts/bongos/backfill-disciplines.js +0 -144
  402. package/scripts/bongos/backfill-session-earnings.js +0 -123
  403. package/scripts/bongos/backfill-session-types.js +0 -87
  404. package/scripts/bongos/build-bongos.js +0 -94
  405. package/scripts/bongos/cleanup-orphans.js +0 -74
  406. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +0 -152
  407. package/scripts/bongos/seed-bv1-profiles-tasks.js +0 -135
  408. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +0 -390
  409. package/scripts/bongos/smoke-batch-claim.sh +0 -238
  410. package/scripts/bongos/smoke-batch-release.sh +0 -316
  411. package/scripts/bongos/smoke-claim-consistency.sh +0 -222
  412. package/scripts/bongos/smoke-dependencies.sh +0 -143
  413. package/scripts/gds/backfill-disciplines.js +0 -7
  414. package/scripts/gds/backfill-session-earnings.js +0 -7
  415. package/scripts/gds/backfill-session-types.js +0 -7
  416. package/scripts/gds/cleanup-orphans.js +0 -7
  417. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +0 -6
  418. package/scripts/gds/seed-bv1-profiles-tasks.js +0 -6
  419. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +0 -6
  420. package/scripts/gds/smoke-batch-claim.sh +0 -8
  421. package/scripts/gds/smoke-batch-release.sh +0 -8
  422. package/scripts/gds/smoke-claim-consistency.sh +0 -8
  423. package/scripts/gds/smoke-dependencies.sh +0 -8
  424. package/tests/smoke_dependencies_witness.mjs +0 -46
@@ -1,143 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Smoke test for the dependency + auto-promotion system (ADR 0015 / migration 020).
3
- #
4
- # Round-trip:
5
- # 1. Create task A with status='backlog', kind='feature'
6
- # 2. Create task B with status='ready'
7
- # 3. Wire A.dependencies = [B] (A's status stays backlog — auto-promotion only
8
- # fires when B SHIPS, not when the edge is added)
9
- # 4. Try to claim A — must fail 409 DEPS_NOT_SHIPPED (manual promote test)
10
- # 5. Promote A manually (the route allows it; the gate is at claim time)
11
- # 6. Try to claim A — still 409 DEPS_NOT_SHIPPED
12
- # 7. Claim B, ship B (active → completed → confirmed → shipped)
13
- # 8. Verify C — a second dependent of B that NOTHING ever promoted by hand —
14
- # flipped backlog→ready. This is the only assertion that can fail if the
15
- # auto-promotion trigger is broken (task 1004191): A was already 'ready'
16
- # from the manual step, so A's status proves nothing about the trigger.
17
- # 9. Claim A — succeeds
18
- # 10. Release A, abandon A and C (B is shipped and cannot be abandoned)
19
- #
20
- # Run from any environment with a valid CLI session (/builder-setup).
21
- # Requires curl.
22
- set -euo pipefail
23
-
24
- # Token + API base both come from lib.sh, which resolves them through
25
- # instance-config the way every /builder-* command does. The literals that used
26
- # to live here were doubly broken: a macOS-only /Users/$USER path and a baked-in
27
- # founder host, so this smoke could not run on any other OS or instance
28
- # (task 1002567).
29
- # shellcheck source=scripts/bongos/lib.sh
30
- source "$(dirname "$0")/lib.sh"
31
-
32
- TOKEN="$(gds_resolve_token)" || exit $?
33
- BASE="${GDS_BASE:-$(gds_api_base)}"
34
- SUFFIX="$(date +%s)"
35
-
36
- echo "=== 1. Create task B (depends-on target, status=ready) ==="
37
- B=$(curl -sS -X POST "$BASE/api/bongos/tasks" \
38
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
39
- --data "{\"version_id\":\"GDS-V3\",\"title\":\"__smoke__ dep-test B $SUFFIX\",\"description\":\"smoke\",\"status\":\"ready\",\"kind\":\"feature\",\"discipline\":\"engineering\",\"priority\":5,\"touches\":[\"smoke-dep-B-$SUFFIX/\"],\"source\":\"smoke\",\"source_ref\":\"smoke-dep-B-$SUFFIX\"}")
40
- B_ID=$(echo "$B" | python3 -c "import json,sys; print(json.load(sys.stdin)['task']['id'])")
41
- echo " B id=$B_ID"
42
-
43
- echo "=== 2. Create task A (dependent, status=backlog) ==="
44
- A=$(curl -sS -X POST "$BASE/api/bongos/tasks" \
45
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
46
- --data "{\"version_id\":\"GDS-V3\",\"title\":\"__smoke__ dep-test A $SUFFIX\",\"description\":\"smoke\",\"status\":\"backlog\",\"kind\":\"feature\",\"discipline\":\"engineering\",\"priority\":5,\"touches\":[\"smoke-dep-A-$SUFFIX/\"],\"source\":\"smoke\",\"source_ref\":\"smoke-dep-A-$SUFFIX\"}")
47
- A_ID=$(echo "$A" | python3 -c "import json,sys; print(json.load(sys.stdin)['task']['id'])")
48
- echo " A id=$A_ID"
49
-
50
- echo "=== 2b. Create task C (dependent, status=backlog, NEVER promoted by hand) ==="
51
- # task 1004191 (finding 62 of the task 1000379 audit): A is promoted manually in
52
- # step 4, so "A is ready after B ships" held whether or not the auto-promotion
53
- # trigger fired. C exists to be the dependent only the trigger can flip.
54
- C=$(curl -sS -X POST "$BASE/api/bongos/tasks" \
55
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
56
- --data "{\"version_id\":\"GDS-V3\",\"title\":\"__smoke__ dep-test C $SUFFIX\",\"description\":\"smoke\",\"status\":\"backlog\",\"kind\":\"feature\",\"discipline\":\"engineering\",\"priority\":5,\"touches\":[\"smoke-dep-C-$SUFFIX/\"],\"source\":\"smoke\",\"source_ref\":\"smoke-dep-C-$SUFFIX\"}")
57
- C_ID=$(echo "$C" | python3 -c "import json,sys; print(json.load(sys.stdin)['task']['id'])")
58
- echo " C id=$C_ID"
59
-
60
- echo "=== 3. Wire A → depends_on B, and C → depends_on B ==="
61
- curl -sS -X POST "$BASE/api/bongos/tasks/$C_ID/dependencies" \
62
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
63
- --data "{\"depends_on_task_id\": $B_ID}" >/dev/null
64
- C_PRE=$(curl -sS -H "Authorization: Bearer $TOKEN" "$BASE/api/bongos/tasks/$C_ID" | python3 -c "import json,sys; print(json.load(sys.stdin)['task']['status'])")
65
- [ "$C_PRE" = "backlog" ] && echo " PASS: C is backlog before B ships" || (echo " FAIL: C is '$C_PRE' before B ships — the auto-promotion check below would prove nothing"; exit 1)
66
- curl -sS -X POST "$BASE/api/bongos/tasks/$A_ID/dependencies" \
67
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
68
- --data "{\"depends_on_task_id\": $B_ID}" | python3 -m json.tool
69
-
70
- echo "=== 4. Manually promote A (testing claim-time gate, not auto-promote) ==="
71
- curl -sS -X POST "$BASE/api/bongos/tasks/$A_ID/promote" -H "Authorization: Bearer $TOKEN" | python3 -m json.tool
72
-
73
- echo "=== 5. Attempt claim A — MUST 409 DEPS_NOT_SHIPPED ==="
74
- CLAIM_RESP=$(curl -sS -X POST "$BASE/api/bongos/claims" \
75
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
76
- --data "{\"task_id\": $A_ID, \"worktree_name\": \"smoke-$SUFFIX\"}")
77
- echo "$CLAIM_RESP" | python3 -m json.tool
78
- echo "$CLAIM_RESP" | grep -q "DEPS_NOT_SHIPPED" && echo " PASS: claim refused with DEPS_NOT_SHIPPED" || (echo " FAIL: claim was not refused"; exit 1)
79
-
80
- echo "=== 6. Claim + ship B (the dep) ==="
81
- node scripts/bongos/claim.js "$B_ID" --worktree "smoke-$SUFFIX-B"
82
- # Move through completed → confirmed → shipped using direct API calls (skip the
83
- # scanner/grader by going straight at /resolve + /confirm + /ship)
84
- curl -sS -X POST "$BASE/api/bongos/claims/by-task/$B_ID/resolve" \
85
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
86
- --data '{"outcome":"completed","verification":{"passed":true,"smoke_ok":true}}' >/dev/null
87
- curl -sS -X POST "$BASE/api/bongos/tasks/$B_ID/confirm" -H "Authorization: Bearer $TOKEN" >/dev/null
88
- curl -sS -X POST "$BASE/api/bongos/tasks/$B_ID/ship" -H "Authorization: Bearer $TOKEN" >/dev/null
89
-
90
- echo "=== 7. Verify the auto-promotion trigger fired: C backlog → ready ==="
91
- # C was never promoted by hand, so only promote_dependents_on_ship can have made
92
- # it 'ready'. (A is 'ready' from the manual step 4 regardless, so A is not asserted
93
- # here — that is the assertion that used to pass with the trigger broken.)
94
- C_STATUS=$(curl -sS -H "Authorization: Bearer $TOKEN" "$BASE/api/bongos/tasks/$C_ID" | python3 -c "import json,sys; print(json.load(sys.stdin)['task']['status'])")
95
- echo " C status: $C_STATUS"
96
- [ "$C_STATUS" = "ready" ] && echo " PASS: C auto-promoted" || (echo " FAIL: C is '$C_STATUS' — B shipped but the auto-promotion trigger did not flip its dependent"; exit 1)
97
-
98
- echo "=== 8. Claim A — must succeed now ==="
99
- node scripts/bongos/claim.js "$A_ID" --worktree "smoke-$SUFFIX-A"
100
-
101
- echo "=== 9. Cleanup — abandon A and C; B is shipped and stays ==="
102
- # task 1004026: this step used to ANNOUNCE "release A; mark both abandoned" and then
103
- # only release A. Neither task reached a terminal state, so every run leaked two
104
- # __smoke__ rows into the live tasks table — invisibly, because anyone grepping the
105
- # cleanup step read a line saying both were handled.
106
- #
107
- # "mark both abandoned" was never possible. B is SHIPPED by step 6, and the abandon
108
- # route refuses shipped work (cannot_abandon_shipped) because shipped rows are
109
- # immutable history. Only A can reach a terminal state here, so the echo now states
110
- # what the code does instead of the reverse.
111
- #
112
- # Follows scripts/bongos/smoke-write.sh's cleanup (task 1002018): abandon is the right
113
- # terminal state for a smoke row, and cleanup is STRICTLY best-effort. task.abandon is
114
- # floor-metic (ADR 0152), so a Xenos/Thetes token gets a 403 here while every assertion
115
- # above genuinely passed — a cleanup that cannot run must never turn a passing smoke
116
- # into a failing one. Hence the `|| true` and the reported-not-raised status codes.
117
- # Reaching this line at all means every assertion passed: the script is `set -e` and
118
- # each check above exits non-zero on failure, so a FAILED run stops earlier and leaves
119
- # both rows in place for inspection, which is the same deliberate choice smoke-write makes.
120
- node scripts/bongos/release.js "$A_ID" --reason "smoke cleanup" || true
121
-
122
- A_CLEANUP_CODE=$(curl -sS -o /dev/null -w '%{http_code}' -X POST \
123
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
124
- --data '{"reason":"smoke cleanup (task 1004026) - dependency smoke passed; the throwaway row has served its purpose"}' \
125
- "$BASE/api/bongos/tasks/$A_ID/abandon") || true
126
- case "${A_CLEANUP_CODE:-000}" in
127
- 2*) echo " PASS cleaned up throwaway task #$A_ID (abandoned)" ;;
128
- 403) echo " SKIP cleanup — task.abandon needs Metic+ (ADR 0152); task #$A_ID left in the ledger" ;;
129
- 000) echo " SKIP cleanup — POST /tasks/$A_ID/abandon got no response; task #$A_ID left in the ledger" ;;
130
- *) echo " SKIP cleanup — POST /tasks/$A_ID/abandon returned HTTP $A_CLEANUP_CODE; task #$A_ID left in the ledger" ;;
131
- esac
132
- C_CLEANUP_CODE=$(curl -sS -o /dev/null -w '%{http_code}' -X POST \
133
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
134
- --data '{"reason":"smoke cleanup (task 1004191) - auto-promotion witness; the throwaway row has served its purpose"}' \
135
- "$BASE/api/bongos/tasks/$C_ID/abandon") || true
136
- case "${C_CLEANUP_CODE:-000}" in
137
- 2*) echo " PASS cleaned up throwaway task #$C_ID (abandoned)" ;;
138
- *) echo " SKIP cleanup — POST /tasks/$C_ID/abandon returned HTTP ${C_CLEANUP_CODE:-000}; task #$C_ID left in the ledger" ;;
139
- esac
140
- echo " NOTE task #$B_ID is SHIPPED and is deliberately left in the ledger — the abandon route refuses shipped work (cannot_abandon_shipped)."
141
-
142
- echo
143
- echo "ALL SMOKE STEPS PASSED."
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- // scripts/gds/backfill-disciplines.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/backfill-disciplines.js. This forwarder keeps callers that still name
5
- // the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- 'use strict';
7
- require('../bongos/forwarder.js').forward(module, 'backfill-disciplines.js');
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- // scripts/gds/backfill-session-earnings.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/backfill-session-earnings.js. This forwarder keeps callers that still name
5
- // the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- 'use strict';
7
- require('../bongos/forwarder.js').forward(module, 'backfill-session-earnings.js');
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- // scripts/gds/backfill-session-types.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/backfill-session-types.js. This forwarder keeps callers that still name
5
- // the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- 'use strict';
7
- require('../bongos/forwarder.js').forward(module, 'backfill-session-types.js');
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- // scripts/gds/cleanup-orphans.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/cleanup-orphans.js. This forwarder keeps callers that still name
5
- // the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- 'use strict';
7
- require('../bongos/forwarder.js').forward(module, 'cleanup-orphans.js');
@@ -1,6 +0,0 @@
1
- // scripts/gds/seed-bongos-v1-idea-routing-tasks.js — @bongos-forwarder (task 1004848). Generated by
2
- // scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
3
- // The real script is scripts/bongos/seed-bongos-v1-idea-routing-tasks.js. This forwarder keeps callers that still name
4
- // the old path working, and warns once so they get repointed. Task 1003706 removes it.
5
- 'use strict';
6
- require('../bongos/forwarder.js').forward(module, 'seed-bongos-v1-idea-routing-tasks.js');
@@ -1,6 +0,0 @@
1
- // scripts/gds/seed-bv1-profiles-tasks.js — @bongos-forwarder (task 1004848). Generated by
2
- // scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
3
- // The real script is scripts/bongos/seed-bv1-profiles-tasks.js. This forwarder keeps callers that still name
4
- // the old path working, and warns once so they get repointed. Task 1003706 removes it.
5
- 'use strict';
6
- require('../bongos/forwarder.js').forward(module, 'seed-bv1-profiles-tasks.js');
@@ -1,6 +0,0 @@
1
- // scripts/gds/seed-bv2-ideator-surface-tasks.js — @bongos-forwarder (task 1004848). Generated by
2
- // scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
3
- // The real script is scripts/bongos/seed-bv2-ideator-surface-tasks.js. This forwarder keeps callers that still name
4
- // the old path working, and warns once so they get repointed. Task 1003706 removes it.
5
- 'use strict';
6
- require('../bongos/forwarder.js').forward(module, 'seed-bv2-ideator-surface-tasks.js');
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- # scripts/gds/smoke-batch-claim.sh — @bongos-forwarder (task 1004848). Generated by
3
- # scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
- # The real script is scripts/bongos/smoke-batch-claim.sh. This forwarder keeps callers that still name
5
- # the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- if [ -z "${BONGOS_FORWARDER_WARNED:-}" ]; then echo "[bongos] scripts/gds/smoke-batch-claim.sh has moved to scripts/bongos/smoke-batch-claim.sh. This old path still works for now, but update whatever called it. The forwarders in scripts/gds/ are removed in a later release." >&2; fi
7
- export BONGOS_FORWARDER_WARNED=1
8
- exec bash "$(dirname "$0")/../bongos/smoke-batch-claim.sh" "$@"
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- # scripts/gds/smoke-batch-release.sh — @bongos-forwarder (task 1004848). Generated by
3
- # scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
- # The real script is scripts/bongos/smoke-batch-release.sh. This forwarder keeps callers that still name
5
- # the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- if [ -z "${BONGOS_FORWARDER_WARNED:-}" ]; then echo "[bongos] scripts/gds/smoke-batch-release.sh has moved to scripts/bongos/smoke-batch-release.sh. This old path still works for now, but update whatever called it. The forwarders in scripts/gds/ are removed in a later release." >&2; fi
7
- export BONGOS_FORWARDER_WARNED=1
8
- exec bash "$(dirname "$0")/../bongos/smoke-batch-release.sh" "$@"
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- # scripts/gds/smoke-claim-consistency.sh — @bongos-forwarder (task 1004848). Generated by
3
- # scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
- # The real script is scripts/bongos/smoke-claim-consistency.sh. This forwarder keeps callers that still name
5
- # the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- if [ -z "${BONGOS_FORWARDER_WARNED:-}" ]; then echo "[bongos] scripts/gds/smoke-claim-consistency.sh has moved to scripts/bongos/smoke-claim-consistency.sh. This old path still works for now, but update whatever called it. The forwarders in scripts/gds/ are removed in a later release." >&2; fi
7
- export BONGOS_FORWARDER_WARNED=1
8
- exec bash "$(dirname "$0")/../bongos/smoke-claim-consistency.sh" "$@"
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- # scripts/gds/smoke-dependencies.sh — @bongos-forwarder (task 1004848). Generated by
3
- # scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
- # The real script is scripts/bongos/smoke-dependencies.sh. This forwarder keeps callers that still name
5
- # the old path working, and warns once so they get repointed. Task 1003706 removes it.
6
- if [ -z "${BONGOS_FORWARDER_WARNED:-}" ]; then echo "[bongos] scripts/gds/smoke-dependencies.sh has moved to scripts/bongos/smoke-dependencies.sh. This old path still works for now, but update whatever called it. The forwarders in scripts/gds/ are removed in a later release." >&2; fi
7
- export BONGOS_FORWARDER_WARNED=1
8
- exec bash "$(dirname "$0")/../bongos/smoke-dependencies.sh" "$@"
@@ -1,46 +0,0 @@
1
- // tests/smoke_dependencies_witness.mjs
2
- //
3
- // task 1004191 (finding 62 of the task 1000379 audit): scripts/bongos/smoke-dependencies.sh
4
- // is the only round-trip for the auto-promotion trigger, and its status check used
5
- // to assert on task A — which the script itself promotes BY HAND in an earlier
6
- // step. "A is ready after B ships" therefore passed with the trigger broken.
7
- //
8
- // The fix adds C: a dependent of B that nothing ever promotes by hand, checked to
9
- // be 'backlog' before B ships and 'ready' after. This pins that shape statically
10
- // (the smoke itself writes live tasks, so CI cannot run it).
11
- //
12
- // Run: node tests/smoke_dependencies_witness.mjs
13
-
14
- import { strict as assert } from 'node:assert';
15
- import { readFileSync } from 'node:fs';
16
- import { makeRunner } from './helpers.mjs';
17
-
18
- const { test, summary } = makeRunner();
19
- const src = readFileSync(new URL('../scripts/bongos/smoke-dependencies.sh', import.meta.url), 'utf8');
20
- const code = src.split('\n').filter((l) => !/^\s*#/.test(l)).join('\n');
21
-
22
- await test('a second dependent C is created at backlog and wired to B', () => {
23
- assert.match(code, /__smoke__ dep-test C [^"]*\\",\\"description\\":\\"smoke\\",\\"status\\":\\"backlog\\"/);
24
- assert.match(code, /tasks\/\$C_ID\/dependencies"[\s\S]*depends_on_task_id\\": \$B_ID/);
25
- });
26
-
27
- await test('C is never promoted by hand', () => {
28
- assert.doesNotMatch(code, /tasks\/\$C_ID\/promote/);
29
- });
30
-
31
- await test('C is asserted backlog BEFORE B ships and ready AFTER', () => {
32
- const pre = code.indexOf('[ "$C_PRE" = "backlog" ]');
33
- const ship = code.indexOf('tasks/$B_ID/ship');
34
- const post = code.indexOf('[ "$C_STATUS" = "ready" ]');
35
- assert.ok(pre >= 0 && ship > pre && post > ship, 'pre-check, ship, post-check in that order');
36
- });
37
-
38
- await test('the post-ship status assertion is not made on the hand-promoted A', () => {
39
- assert.doesNotMatch(code, /\[ "\$A_STATUS" = "ready" \]/);
40
- });
41
-
42
- await test('C is cleaned up (abandoned) like A', () => {
43
- assert.match(code, /tasks\/\$C_ID\/abandon/);
44
- });
45
-
46
- summary();