@bongos/core 1.19.804 → 1.19.805

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 (235) hide show
  1. package/.bongos-core.json +257 -237
  2. package/.claude/skills/ask-for-help/SKILL.md +6 -6
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +7 -7
  5. package/.claude/skills/blocker-solve/SKILL.md +5 -5
  6. package/.claude/skills/bug-triage/SKILL.md +7 -7
  7. package/.claude/skills/builder-claim/SKILL.md +3 -3
  8. package/.claude/skills/builder-cost/SKILL.md +2 -2
  9. package/.claude/skills/builder-end/SKILL.md +2 -2
  10. package/.claude/skills/builder-exit/SKILL.md +7 -7
  11. package/.claude/skills/builder-key/SKILL.md +2 -2
  12. package/.claude/skills/builder-reauth/SKILL.md +2 -2
  13. package/.claude/skills/builder-redteam/SKILL.md +7 -7
  14. package/.claude/skills/builder-release/SKILL.md +2 -2
  15. package/.claude/skills/builder-sequence/SKILL.md +1 -1
  16. package/.claude/skills/builder-setup/SKILL.md +3 -3
  17. package/.claude/skills/builder-ship/SKILL.md +1 -1
  18. package/.claude/skills/builder-stage/SKILL.md +1 -1
  19. package/.claude/skills/builder-start/SKILL.md +1 -1
  20. package/.claude/skills/fix-task/SKILL.md +4 -4
  21. package/.claude/skills/goal-create/SKILL.md +18 -18
  22. package/.claude/skills/goal-review/SKILL.md +7 -7
  23. package/.claude/skills/grade-audit/SKILL.md +5 -5
  24. package/.claude/skills/grade-recover/SKILL.md +4 -4
  25. package/.claude/skills/grader-health/SKILL.md +6 -6
  26. package/.claude/skills/idea-triage/SKILL.md +14 -14
  27. package/.claude/skills/merge-mode/SKILL.md +3 -3
  28. package/.claude/skills/planning-session/SKILL.md +20 -20
  29. package/.claude/skills/priority-session/SKILL.md +10 -10
  30. package/.claude/skills/recall/SKILL.md +1 -1
  31. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  32. package/.claude/skills/status/SKILL.md +2 -2
  33. package/.claude/skills/strand-fix/SKILL.md +2 -2
  34. package/clients/bongos-client/README.md +1 -1
  35. package/clients/bongos-client/bongos-client.global.js +2 -0
  36. package/clients/bongos-client/index.cjs +2 -0
  37. package/clients/bongos-client/index.d.ts +2 -0
  38. package/clients/bongos-client/index.mjs +2 -0
  39. package/docs/api/openapi.json +45 -11
  40. package/docs/api-reference.md +11 -10
  41. package/docs/module-api-changelog.md +2 -0
  42. package/modules/builder-settings/profile-nudge-prefs.js +1 -1
  43. package/modules/builder-settings/render-prefs.js +1 -1
  44. package/modules/dev-box/app/README.md +1 -1
  45. package/modules/dev-box/app/src/gds-client.js +11 -9
  46. package/modules/dev-box/app/src/vendor/bongos-client.cjs +2 -0
  47. package/modules/dev-box/app/test/unit.mjs +13 -13
  48. package/modules/dev-box/box-access.js +3 -3
  49. package/modules/dev-box/box-onboard.js +7 -7
  50. package/modules/discord/bug-attachments.js +1 -1
  51. package/modules/economy/cost-classify.js +6 -6
  52. package/modules/grading/grader-rubric.json +1 -1
  53. package/modules/grading/grader-score.js +1 -1
  54. package/modules/hall-ui/module.json +1 -1
  55. package/modules/hall-ui/public/drachmae.js +3 -3
  56. package/modules/hall-ui/public/idea.js +1 -1
  57. package/modules/hall-ui/public/md-reader.js +1 -1
  58. package/modules/hall-ui/public/people.html +1 -1
  59. package/modules/hall-ui/public/people.js +2 -2
  60. package/modules/hall-ui/public/primer.js +4 -4
  61. package/modules/hall-ui/public/roster.js +1 -1
  62. package/modules/hall-ui/public/shell.js +1 -1
  63. package/modules/hall-ui/public/task.js +1 -1
  64. package/modules/ideas/inbox.js +2 -2
  65. package/modules/lifecycle/db-analytics.js +1 -1
  66. package/modules/lifecycle/done-when.js +4 -4
  67. package/modules/lifecycle/version-close.js +1 -1
  68. package/modules/memory/learnings.js +2 -2
  69. package/modules/memory/memory.js +1 -1
  70. package/modules/onboarding/onboarding.js +1 -1
  71. package/modules/platform-identity/routes/my-projects.js +1 -1
  72. package/modules/platform-identity/routes/sso.js +2 -2
  73. package/modules/public-landing/public/index.html +2 -2
  74. package/modules/public-landing/public/projects-floor.states.json +1 -1
  75. package/modules/public-landing/public/projects.html +1 -1
  76. package/modules/public-landing/public/projects.states.json +1 -1
  77. package/modules/sessions/db.js +120 -0
  78. package/modules/sessions/module.json +2 -2
  79. package/modules/sessions/pollers/session-upload-health.js +111 -0
  80. package/modules/sessions/pulse.js +2 -2
  81. package/modules/sessions/routes/sessions.js +46 -0
  82. package/modules/sessions/upload-health.js +197 -0
  83. package/modules/status-ui/module.json +1 -1
  84. package/modules/status-ui/public/explore.js +1 -1
  85. package/package-lock.json +2 -2
  86. package/package.json +1 -1
  87. package/scripts/gds/agent-invoke.js +3 -3
  88. package/scripts/gds/api.js +4 -4
  89. package/scripts/gds/api.sh +1 -1
  90. package/scripts/gds/architect-audit.js +1 -1
  91. package/scripts/gds/artifact-audit.js +2 -2
  92. package/scripts/gds/audit-ships.js +2 -2
  93. package/scripts/gds/backfill-cost.js +1 -1
  94. package/scripts/gds/backfill-sessions.js +1 -1
  95. package/scripts/gds/backfill-subagent-rewards.js +1 -1
  96. package/scripts/gds/backfill-task-rewards.js +2 -2
  97. package/scripts/gds/box-auth-check.js +1 -1
  98. package/scripts/gds/box-sync.js +3 -3
  99. package/scripts/gds/box.js +10 -10
  100. package/scripts/gds/build-cli-package.js +3 -3
  101. package/scripts/gds/capture.js +2 -2
  102. package/scripts/gds/ci-grade.js +1 -1
  103. package/scripts/gds/claim-recall.js +2 -2
  104. package/scripts/gds/cli-lib.js +3 -3
  105. package/scripts/gds/context-pack.js +1 -1
  106. package/scripts/gds/copy-apply.js +2 -2
  107. package/scripts/gds/dev-lib.js +2 -2
  108. package/scripts/gds/fetch-art-key.js +2 -2
  109. package/scripts/gds/fetch-sound-prefs.js +3 -3
  110. package/scripts/gds/grade-smoke.js +1 -1
  111. package/scripts/gds/hooks/pre-push.js +1 -1
  112. package/scripts/gds/init.js +9 -9
  113. package/scripts/gds/key-card.js +1 -1
  114. package/scripts/gds/learning-capture.js +2 -2
  115. package/scripts/gds/linkify-refs.js +2 -2
  116. package/scripts/gds/local-preview-lib.js +1 -1
  117. package/scripts/gds/login.js +11 -10
  118. package/scripts/gds/main-audit.js +1 -1
  119. package/scripts/gds/newcomer-floor.config.json +1 -1
  120. package/scripts/gds/newcomer-floor.js +2 -2
  121. package/scripts/gds/newcomer-floor.templates.json +2 -2
  122. package/scripts/gds/onboarding-ship.js +1 -1
  123. package/scripts/gds/paste-token.js +3 -3
  124. package/scripts/gds/portability-smoke-memory.sh +5 -5
  125. package/scripts/gds/prove-strict-versioning.js +2 -2
  126. package/scripts/gds/provision-net.js +2 -2
  127. package/scripts/gds/provision-units.js +3 -3
  128. package/scripts/gds/pulse.js +2 -2
  129. package/scripts/gds/push-path-brief.js +2 -2
  130. package/scripts/gds/reauth.js +1 -1
  131. package/scripts/gds/recall.js +1 -1
  132. package/scripts/gds/redteam-patrol.js +3 -3
  133. package/scripts/gds/render-ideas.js +5 -5
  134. package/scripts/gds/repo-metrics.js +1 -1
  135. package/scripts/gds/sandbox-stage.js +3 -3
  136. package/scripts/gds/seed-adopt-tasks.js +3 -3
  137. package/scripts/gds/seed-board-room-tasks.js +1 -1
  138. package/scripts/gds/seed-bongos-app-tasks.js +2 -2
  139. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +3 -3
  140. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +4 -4
  141. package/scripts/gds/seed-bongos-tasks.js +5 -5
  142. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +1 -1
  143. package/scripts/gds/seed-bongos-v1-seo-tasks.js +1 -1
  144. package/scripts/gds/seed-bv1-community-tasks.js +1 -1
  145. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +1 -1
  146. package/scripts/gds/seed-bv1-profile-page-tasks.js +1 -1
  147. package/scripts/gds/seed-bv1-profiles-tasks.js +1 -1
  148. package/scripts/gds/seed-bv1-r01-delta-tasks.js +1 -1
  149. package/scripts/gds/seed-gds-v4-tasks.js +3 -3
  150. package/scripts/gds/seed-medusa-tasks.js +1 -1
  151. package/scripts/gds/seed-productization-tasks.js +1 -1
  152. package/scripts/gds/seed-project-admin-console-tasks.js +1 -1
  153. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  154. package/scripts/gds/seed-strict-versioning-tasks.js +3 -3
  155. package/scripts/gds/seed-v2-world-tasks.js +2 -2
  156. package/scripts/gds/seed-verify-criteria.js +1 -1
  157. package/scripts/gds/session-digest.js +1 -1
  158. package/scripts/gds/session.js +2 -2
  159. package/scripts/gds/setup.js +7 -7
  160. package/scripts/gds/ship-flow.js +3 -3
  161. package/scripts/gds/ship-grade-steps.js +3 -3
  162. package/scripts/gds/ship-memory-sync.js +1 -1
  163. package/scripts/gds/ship-session-upload.js +3 -3
  164. package/scripts/gds/smoke-batch-claim.sh +10 -10
  165. package/scripts/gds/smoke-batch-release.sh +14 -14
  166. package/scripts/gds/smoke-claim-consistency.sh +19 -19
  167. package/scripts/gds/smoke-dependencies.sh +9 -9
  168. package/scripts/gds/smoke-write.sh +11 -11
  169. package/scripts/gds/start.js +1 -1
  170. package/scripts/gds/status.js +2 -2
  171. package/scripts/gds/strand-watch.js +1 -1
  172. package/scripts/gds/triage.js +4 -4
  173. package/scripts/gds/version-close.js +2 -2
  174. package/scripts/hall-preview/README.md +1 -1
  175. package/scripts/hall-preview/server.js +1 -1
  176. package/src/bongos/auth-admission.js +3 -3
  177. package/src/bongos/auth-idp.js +2 -2
  178. package/src/bongos/auth.js +3 -3
  179. package/src/bongos/db.js +2 -2
  180. package/src/bongos/llm-cache.js +2 -2
  181. package/src/bongos/metrics.js +1 -1
  182. package/src/bongos/middleware/audit.js +3 -3
  183. package/src/bongos/middleware/rate-limit.js +1 -1
  184. package/src/bongos/platform-visibility-gate.js +2 -2
  185. package/src/bongos/routes/_helpers.js +1 -1
  186. package/src/bongos/routes/audit-log.js +1 -1
  187. package/src/bongos/routes/auth.js +5 -5
  188. package/src/bongos/routes/backup.js +1 -1
  189. package/src/bongos/routes/builders.js +1 -1
  190. package/src/bongos/routes/instance.js +1 -1
  191. package/src/bongos/routes/live.js +1 -1
  192. package/src/bongos/routes/me.js +2 -2
  193. package/src/bongos/routes/modules.js +2 -2
  194. package/src/bongos/routes/public.js +1 -1
  195. package/src/bongos/routes/security.js +4 -4
  196. package/src/bongos/routes.js +1 -1
  197. package/src/bongos/serve-internal.js +6 -6
  198. package/src/branding.js +1 -1
  199. package/src/module-api.js +1 -1
  200. package/src/module-seams.js +2 -2
  201. package/src/platform-server.js +2 -2
  202. package/tests/api_alias_exceptions.mjs +67 -0
  203. package/tests/application_echo.mjs +12 -12
  204. package/tests/artifact_audit.mjs +1 -1
  205. package/tests/auth_page_gate.mjs +4 -4
  206. package/tests/auth_web_recovery.mjs +11 -11
  207. package/tests/bongos_login.mjs +7 -4
  208. package/tests/box_env.mjs +6 -6
  209. package/tests/bug_attachments.mjs +1 -1
  210. package/tests/cli_sessions.mjs +1 -1
  211. package/tests/dev_lib.mjs +1 -1
  212. package/tests/discord_bugs.mjs +2 -2
  213. package/tests/discord_inbound.mjs +2 -2
  214. package/tests/explore_visible_states.mjs +1 -1
  215. package/tests/government_page_gates.mjs +1 -1
  216. package/tests/hall_reference_world.mjs +1 -1
  217. package/tests/idea_ideate_full.mjs +1 -1
  218. package/tests/idp_federation.mjs +2 -2
  219. package/tests/llm-cache.mjs +1 -1
  220. package/tests/manage_manifest_shared_read.mjs +3 -3
  221. package/tests/people_directory_clip.mjs +1 -1
  222. package/tests/planning_session_skill.mjs +1 -1
  223. package/tests/platform_visibility_gate.mjs +15 -15
  224. package/tests/profile_route.mjs +25 -25
  225. package/tests/projects_hub.mjs +2 -2
  226. package/tests/provision.mjs +2 -2
  227. package/tests/provision_settings_apply.mjs +4 -4
  228. package/tests/sandbox_stage.mjs +8 -8
  229. package/tests/scouting_owner_access_and_reach.mjs +3 -3
  230. package/tests/session_upload_health.mjs +329 -0
  231. package/tests/setup_device_flow_fallback.mjs +1 -1
  232. package/tests/skill_ask_for_help.mjs +3 -3
  233. package/tests/skill_grade_audit.mjs +2 -2
  234. package/tests/skill_grader_health.mjs +3 -3
  235. package/tests/smoke_write_contract.mjs +1 -1
@@ -10,11 +10,11 @@ You are running the **goal-create** session for this Cloud Bongos instance. You
10
10
 
11
11
  ## Rank gate — Metic+ only
12
12
 
13
- **Gated to Metic+ (Metic, Archon); not Xenos.** Creating a goal sets a **scope wall** — the module keys its members may author inside — and seeds the criteria a slice of the version will be judged against. That is a trusted-builder operation (ADR 0086 §3/§4). The server enforces it: `POST /api/gds/goals` is `requireRank('metic','archon')`, and `POST /api/gds/versions/:id/done-when` is `requireRank('metic','archon')` **plus a goal-ownership wall** (ADR 0154) — both pinned in `route-rank-check.MODULE_EXPECTED_RANKS.lifecycle`. This check just stops a Xenos early instead of after a wall of 403s. Markdown never grants authority ([`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md), [ADR 0016](../../../docs/adr/0016-trust-boundary-server-enforced-permissions.md)).
13
+ **Gated to Metic+ (Metic, Archon); not Xenos.** Creating a goal sets a **scope wall** — the module keys its members may author inside — and seeds the criteria a slice of the version will be judged against. That is a trusted-builder operation (ADR 0086 §3/§4). The server enforces it: `POST /api/bongos/goals` is `requireRank('metic','archon')`, and `POST /api/bongos/versions/:id/done-when` is `requireRank('metic','archon')` **plus a goal-ownership wall** (ADR 0154) — both pinned in `route-rank-check.MODULE_EXPECTED_RANKS.lifecycle`. This check just stops a Xenos early instead of after a wall of 403s. Markdown never grants authority ([`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md), [ADR 0016](../../../docs/adr/0016-trust-boundary-server-enforced-permissions.md)).
14
14
 
15
15
  **Enforce the gate at the very top of the session, before reading anything else:**
16
16
 
17
- 1. Call `node scripts/gds/api.js GET /api/gds/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
17
+ 1. Call `node scripts/gds/api.js GET /api/bongos/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
18
18
  2. **If `rank` lowercases to `xenos`** → stop immediately. Tell the builder: *"Creating a goal sets a scope wall and seeds a version's done-when criteria — a Metic+ operation. You're currently Xenos. You can still **file** the proposal as an idea (`node scripts/gds/capture.js "…"`) for a Metic+ builder to promote at triage; ask an Archon for promotion if you need to create goals directly."* Do not read the goal board, do not draft criteria.
19
19
  3. **If `rank` lowercases to `metic` or `archon`** → proceed with the phases below.
20
20
  4. **If `rank` is absent** (a deployment where the three-rank model hasn't shipped) → treat the session as available, exactly as `/idea-triage` does in its pre-rank passthrough mode, and note that in the session log.
@@ -32,9 +32,9 @@ You are running the **goal-create** session for this Cloud Bongos instance. You
32
32
 
33
33
  Determine without asking:
34
34
 
35
- - **The version.** `node scripts/gds/api.js GET /api/gds/public/versions`. If exactly one is `building` or `planning`, take it. Ask only when two or more are open *and* the work doesn't obviously belong to one.
36
- - **The existing goals.** `node scripts/gds/api.js GET "/api/gds/goals?version=<ver>&status=open"`, then `GET /api/gds/goals/<id>` on each plausible candidate — the detail response is `{goal, members, criteria, dependencies}`, which is what tells you whether a candidate already owns criteria in this space.
37
- - **The version's criteria.** `node scripts/gds/api.js GET "/api/gds/versions/<ver>/done-when"` → `{version_id, criteria, goals}`. Use it to avoid a `criterion_id` collision and to pick the next `sort_order` (max + 1).
35
+ - **The version.** `node scripts/gds/api.js GET /api/bongos/public/versions`. If exactly one is `building` or `planning`, take it. Ask only when two or more are open *and* the work doesn't obviously belong to one.
36
+ - **The existing goals.** `node scripts/gds/api.js GET "/api/bongos/goals?version=<ver>&status=open"`, then `GET /api/bongos/goals/<id>` on each plausible candidate — the detail response is `{goal, members, criteria, dependencies}`, which is what tells you whether a candidate already owns criteria in this space.
37
+ - **The version's criteria.** `node scripts/gds/api.js GET "/api/bongos/versions/<ver>/done-when"` → `{version_id, criteria, goals}`. Use it to avoid a `criterion_id` collision and to pick the next `sort_order` (max + 1).
38
38
  - **The module roster — LIVE, never from memory and never from this file:**
39
39
 
40
40
  ```
@@ -43,7 +43,7 @@ Determine without asking:
43
43
 
44
44
  > **Run the line. Do not paste a roster anywhere, including into this file.** `protected` is *derived* from glob overlap with the trust core, so it changes when the globs change. The snapshot in `/planning-session`'s Phase 2.5 rotted within one release and now omits a key — that is the failure mode this rule exists to prevent.
45
45
 
46
- - **Lineage**, only when this goal continues a prior version's work: `node scripts/gds/api.js GET "/api/gds/goals?version=<prev>&status=achieved"` and pick the predecessor for `succeeds_goal_id`.
46
+ - **Lineage**, only when this goal continues a prior version's work: `node scripts/gds/api.js GET "/api/bongos/goals?version=<prev>&status=achieved"` and pick the predecessor for `succeeds_goal_id`.
47
47
 
48
48
  ## Phase 2 — Reuse or create (autonomous; one question only on a genuine tie)
49
49
 
@@ -52,7 +52,7 @@ Determine without asking:
52
52
  If the answer is reuse, **stop creating.** Report the goal id, and if an orphan task triggered this session, move it:
53
53
 
54
54
  ```
55
- node scripts/gds/api.js PATCH /api/gds/tasks/<task_id> --body '{"goal_id":<gid>}' # ids only — safe inline
55
+ node scripts/gds/api.js PATCH /api/bongos/tasks/<task_id> --body '{"goal_id":<gid>}' # ids only — safe inline
56
56
  ```
57
57
 
58
58
  Only a real tie between two candidates earns an AskUserQuestion.
@@ -64,7 +64,7 @@ Everything here is your call. It is presented in Phase 4 as a proposal, not as q
64
64
  - **Title** — the outcome the goal owns, not a task list. One line.
65
65
  - **`description`** — 2–4 sentences: what is true when this goal is achieved, and what it explicitly does not cover.
66
66
  - **`scope_modules`** — infer from the planned work's file paths, then **verify every key against `moduleKeys()`**. An unknown key is a hard `400 unknown_module` (the response helpfully returns the full valid roster). Keep it tight: the wall is set here and only here. **No covering key?** Do not invent one — file a `kind='refactor'` prep task scoped to `kernel` to extend `MODULE_GLOBS`, and make this goal's tasks depend on it.
67
- - **`category_id`** — the goal's HUMAN category (task 1003277; ADR 0192 — advisory, it gates nothing). Read the live set with `GET /api/gds/work-categories` (never hard-code the labels), infer the best fit from the goal's outcome and its `scope_modules`, and state your pick in the Phase-4 approval round like every other drafted field. **When nothing in the set fits, that is a designed prompt, not an error**: do NOT silently pick the nearest, and do NOT leave it null and move on — surface the gap in the gray-area round and offer to create a new category (`POST /api/gds/work-categories` with `{"label":"..."}`; a duplicate slug converges on the existing row), then use it. Creating uncategorised stays legal — if the user declines to name one, POST the goal without `category_id` and note that the 201 body will carry a `category_advisory` reminding whoever looks next.
67
+ - **`category_id`** — the goal's HUMAN category (task 1003277; ADR 0192 — advisory, it gates nothing). Read the live set with `GET /api/bongos/work-categories` (never hard-code the labels), infer the best fit from the goal's outcome and its `scope_modules`, and state your pick in the Phase-4 approval round like every other drafted field. **When nothing in the set fits, that is a designed prompt, not an error**: do NOT silently pick the nearest, and do NOT leave it null and move on — surface the gap in the gray-area round and offer to create a new category (`POST /api/bongos/work-categories` with `{"label":"..."}`; a duplicate slug converges on the existing row), then use it. Creating uncategorised stays legal — if the user declines to name one, POST the goal without `category_id` and note that the 201 body will carry a `category_advisory` reminding whoever looks next.
68
68
  - **`succeeds_goal_id`** — set it when carrying an achieved goal forward. `POST /goals` validates the predecessor exists *before* creating, so a bad ref can't orphan a goal; it then stamps the predecessor's `succeeded_by_goal_id`. Archiving the predecessor is a **separate** call.
69
69
  - **Criteria — 2 to 4.** A goal's criteria are narrower than a version's: each should plausibly anchor 2–5 tasks. Draft `criterion_id` as a stable kebab slug (position-independent, and what `criterion_ids` on `POST /tasks` should reference); `criterion_md` is the outcome prose.
70
70
  - **Seed tasks — 3 to 8.** Per criterion, with `kind`, a one-line done-when, `criterion_ids: ["<slug>"]`, and dependency edges. Omit `touches[]` (advisory, ADR 0049 — backfilled from the real diff at ship). Never hand-set `requires_rank`: it auto-derives (ADR 0084) from `needs_migration` and the goal's own scope wall, neither of which needs a prediction (ADR 0270). **Do set `needs_migration: true` on any task that will alter the live database** — it is the input that floors such a task at Metic, and omitting it is how a schema change lands in the open queue. Proof tasks use `kind='verify'`; exploration uses `kind='spike'` (and spikes are deliberately left in backlog).
@@ -87,24 +87,24 @@ The order is forced: a criterion needs `goal_id`, a task needs both `goal_id` an
87
87
  # (version_id*, title*, subtitle, description, scope_modules[], succeeds_goal_id, category_id).
88
88
  # ANY other key is a 400 unknown_field — do NOT pass criteria, tasks, lead or visibility.
89
89
  # goal.json: {"version_id":"<ver>","title":"...","description":"...","scope_modules":["<key>"],"category_id":<id>}
90
- # category_id comes from GET /api/gds/work-categories (task 1003277); omitting it is
90
+ # category_id comes from GET /api/bongos/work-categories (task 1003277); omitting it is
91
91
  # legal — the 201 body then carries a category_advisory, never a refusal.
92
92
  # carry-forward: add "succeeds_goal_id":<prior_goal_id>
93
- node scripts/gds/api.js POST /api/gds/goals --body-file <path-to-goal.json>
93
+ node scripts/gds/api.js POST /api/bongos/goals --body-file <path-to-goal.json>
94
94
  # → 201 {ok, goal, succeeds_goal_id}. CAPTURE goal.id.
95
95
  # You are now the goal's OWNER and its 'lead' member — the membership row is inserted
96
96
  # in the SAME statement, so there is NO join step. Don't POST /goals/<id>/join after.
97
97
 
98
98
  # 5b — the criteria, one call each, in presentation order.
99
99
  # criterion.json: {"criterion_id":"<slug>","criterion_md":"...","goal_id":<gid>,"sort_order":<n>}
100
- node scripts/gds/api.js POST /api/gds/versions/<ver>/done-when --body-file <path-to-criterion.json>
100
+ node scripts/gds/api.js POST /api/bongos/versions/<ver>/done-when --body-file <path-to-criterion.json>
101
101
  # You may write these because you OWN the goal (ADR 0154), not merely because you are
102
102
  # a Metic. Refusals: 409 criterion_exists (slug already on this version — reuse it,
103
103
  # don't rename around the collision) · 409 goal_not_open · 409 version_closed ·
104
104
  # 400 bad_goal_id (which ALSO masks "you don't own this goal" — see below).
105
105
 
106
106
  # 5c — the seed tasks, one call each. --body-file avoids shell-quoting description/arrays.
107
- node scripts/gds/api.js POST /api/gds/tasks --body-file <path-to-task.json>
107
+ node scripts/gds/api.js POST /api/bongos/tasks --body-file <path-to-task.json>
108
108
  # {"version_id":"<ver>","goal_id":<gid>,"title":"...","description":"...",
109
109
  # "kind":"feature|refactor|infra|spike|verify|decision","priority":N,"est_minutes":N,
110
110
  # "criterion_ids":["<slug>"],"source":"goal-create","source_ref":"goal-<gid>-R##"}
@@ -114,16 +114,16 @@ node scripts/gds/api.js POST /api/gds/tasks --body-file <path-to-task.json>
114
114
  # Throttle between calls and honour 429 retry_after.
115
115
 
116
116
  # 5d — dependency edges, only where a real gate exists.
117
- node scripts/gds/api.js POST /api/gds/tasks/<id>/dependencies --body '{"depends_on_task_id":<id>}' # ids only
117
+ node scripts/gds/api.js POST /api/bongos/tasks/<id>/dependencies --body '{"depends_on_task_id":<id>}' # ids only
118
118
 
119
119
  # 5e — promote the zero-dependency layer. Every new task lands status='backlog', and
120
120
  # auto-promotion only fires when a DEPENDENCY ships — so a task with no deps would
121
121
  # sit unclaimable forever. Leave spikes in backlog.
122
- node scripts/gds/api.js POST /api/gds/tasks/<id>/promote
122
+ node scripts/gds/api.js POST /api/bongos/tasks/<id>/promote
123
123
 
124
124
  # 6 — verify + report.
125
- node scripts/gds/api.js GET /api/gds/goals/<gid> # {goal, members, criteria, dependencies}
126
- node scripts/gds/api.js GET "/api/gds/tasks?goal_id=<gid>"
125
+ node scripts/gds/api.js GET /api/bongos/goals/<gid> # {goal, members, criteria, dependencies}
126
+ node scripts/gds/api.js GET "/api/bongos/tasks?goal_id=<gid>"
127
127
  ```
128
128
 
129
129
  ### Protected scope — the Archon off-ramps
@@ -148,8 +148,8 @@ When `POST /tasks` came back with a non-null **`goal_advisory`**, you were invok
148
148
 
149
149
  Run the phases above **with the orphan task as the seed** — its title, description and touches are your best evidence for the goal's title and `scope_modules`. Two shortcuts:
150
150
 
151
- - **Prefer reuse.** `goal_advisory.candidate_goals` already lists the version's open goals with the catch-all excluded. Check each with `GET "/api/gds/goals/<id>/suggest-criteria?title=<t>&description=<d>"` — a strong criterion match means the task belongs there and no new goal is needed. Move it with `PATCH /tasks/<id> {"goal_id":<gid>}`.
152
- - **If you do create a goal, re-home the orphan into it** (same PATCH) and link the criterion: `POST /api/gds/tasks/<task_id>/criteria --body '{"criterion_ids":["<slug>"]}'` (slugs are kebab-case, so inline is safe). Do **not** delete and recreate the task — you would lose its id, `source_ref` and any votes.
151
+ - **Prefer reuse.** `goal_advisory.candidate_goals` already lists the version's open goals with the catch-all excluded. Check each with `GET "/api/bongos/goals/<id>/suggest-criteria?title=<t>&description=<d>"` — a strong criterion match means the task belongs there and no new goal is needed. Move it with `PATCH /tasks/<id> {"goal_id":<gid>}`.
152
+ - **If you do create a goal, re-home the orphan into it** (same PATCH) and link the criterion: `POST /api/bongos/tasks/<task_id>/criteria --body '{"criterion_ids":["<slug>"]}'` (slugs are kebab-case, so inline is safe). Do **not** delete and recreate the task — you would lose its id, `source_ref` and any votes.
153
153
 
154
154
  **A goal-less task is not an error and was never blocked.** `goal_advisory` is advice on a request that already succeeded. Never fail a build, refuse work, or badger the builder over it — if they say "later", file the idea and move on.
155
155
 
@@ -25,27 +25,27 @@ A criterion sitting here with shipped tasks and no explanation means the sweep h
25
25
 
26
26
  ## Rank gate — Metic+ only
27
27
 
28
- **Gated to Metic+ (Metic, Archon); not Xenos.** Confirming a criterion sets `satisfied=true` and can auto-achieve a goal — a trusted-builder operation that closes out a slice of a version (the "who confirms" resolution in ADR 0086 §6: the planner, not only the Archon). The server enforces this — `POST /api/gds/done-when/:criterionId/satisfy` is `requireRank('metic','archon')` and pinned in `route-rank-check.MODULE_EXPECTED_RANKS.lifecycle` — so this check just stops a Xenos early instead of after a wall of 403s. Markdown never grants authority ([`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md), [ADR 0016](../../../docs/adr/0016-trust-boundary-server-enforced-permissions.md)).
28
+ **Gated to Metic+ (Metic, Archon); not Xenos.** Confirming a criterion sets `satisfied=true` and can auto-achieve a goal — a trusted-builder operation that closes out a slice of a version (the "who confirms" resolution in ADR 0086 §6: the planner, not only the Archon). The server enforces this — `POST /api/bongos/done-when/:criterionId/satisfy` is `requireRank('metic','archon')` and pinned in `route-rank-check.MODULE_EXPECTED_RANKS.lifecycle` — so this check just stops a Xenos early instead of after a wall of 403s. Markdown never grants authority ([`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md), [ADR 0016](../../../docs/adr/0016-trust-boundary-server-enforced-permissions.md)).
29
29
 
30
30
  **Enforce the gate at the very top of the session, before reading anything else:**
31
31
 
32
- 1. Call `node scripts/gds/api.js GET /api/gds/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
32
+ 1. Call `node scripts/gds/api.js GET /api/bongos/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
33
33
  2. **If `rank` lowercases to `xenos`** → stop immediately. Tell the builder: *"Goal review is a Metic+ operation — confirming a criterion closes out a slice of a version and can auto-achieve a goal. You're currently Xenos. Ask an Archon to promote you if you need to confirm criteria."* Do not list the queue, do not propose verdicts.
34
34
  3. **If `rank` lowercases to `metic` or `archon`** → proceed with the steps below.
35
35
  4. **If `rank` is absent** (a deployment where the three-rank model hasn't shipped) → treat the session as available, exactly as `/idea-triage` does in its pre-rank passthrough mode, and note that in the session log.
36
36
 
37
37
  ## What this skill does
38
38
 
39
- 1. Lists flagged criteria via `GET /api/gds/done-when/pending-review` (optionally `?version=<id>`).
39
+ 1. Lists flagged criteria via `GET /api/bongos/done-when/pending-review` (optionally `?version=<id>`).
40
40
  2. For each, prompts the user with: **confirm** (the criterion is genuinely met → mark satisfied), **reject** (the tasks shipped but the criterion is NOT actually met → leave it open and capture why), or **note / defer** (leave it flagged; it resurfaces next session).
41
- 3. Applies confirm via `POST /api/gds/done-when/:criterionId/satisfy` — and reports any goal that auto-achieved as a result.
41
+ 3. Applies confirm via `POST /api/bongos/done-when/:criterionId/satisfy` — and reports any goal that auto-achieved as a result.
42
42
 
43
43
  ## How to use
44
44
 
45
45
  **Step 1 — fetch the review queue.**
46
46
 
47
47
  ```
48
- node scripts/gds/api.js GET /api/gds/done-when/pending-review
48
+ node scripts/gds/api.js GET /api/bongos/done-when/pending-review
49
49
  ```
50
50
 
51
51
  (Add `?version=BONGOS-V1` to scope to one version. `api.js` is the cross-platform Bongos API helper — it signs the request with your session token.)
@@ -69,9 +69,9 @@ Then ask the user (concise; frame in product/outcome terms — Lars is an EE, no
69
69
  **Confirm** → mark it satisfied. Optionally pass the ship-task that fulfilled it:
70
70
 
71
71
  ```
72
- node scripts/gds/api.js POST /api/gds/done-when/<criterion_id>/satisfy --body '{}'
72
+ node scripts/gds/api.js POST /api/bongos/done-when/<criterion_id>/satisfy --body '{}'
73
73
  # or, to record which task fulfilled it:
74
- node scripts/gds/api.js POST /api/gds/done-when/<criterion_id>/satisfy --body '{"satisfied_by_task_id":<task_id>}'
74
+ node scripts/gds/api.js POST /api/bongos/done-when/<criterion_id>/satisfy --body '{"satisfied_by_task_id":<task_id>}'
75
75
  ```
76
76
 
77
77
  The response is `{ criterion, goal_achieved, goal }`. **If `goal_achieved` is true**, announce it: *"🎯 Goal '{goal.title}' is now achieved — all its criteria are confirmed."* (That goal now awaits disposition — see Step 4.)
@@ -9,13 +9,13 @@ You are auditing the last week of grades for accountability gaps: work that ship
9
9
  ## The sweep window
10
10
 
11
11
  ```bash
12
- node scripts/gds/api.js GET "/api/gds/public/recent-shipped?days=7"
12
+ node scripts/gds/api.js GET "/api/bongos/public/recent-shipped?days=7"
13
13
  ```
14
14
 
15
15
  For each shipped task in the window, read its persisted grade:
16
16
 
17
17
  ```bash
18
- node scripts/gds/api.js GET "/api/gds/tasks/<id>?include=grade"
18
+ node scripts/gds/api.js GET "/api/bongos/tasks/<id>?include=grade"
19
19
  ```
20
20
 
21
21
  Bucket by grade shape: `passed`, failed, `signals.panel_outcome='unavailable'` (outage — no quality signal existed), or no grade row at all.
@@ -25,7 +25,7 @@ Bucket by grade shape: `passed`, failed, `signals.panel_outcome='unavailable'` (
25
25
  For every shipped task whose grade **failed** (or is absent), the land needed an override. Cross-reference the ledger (Archon — `override_request.decide`):
26
26
 
27
27
  ```bash
28
- node scripts/gds/api.js GET "/api/gds/override-requests?status=approved"
28
+ node scripts/gds/api.js GET "/api/bongos/override-requests?status=approved"
29
29
  ```
30
30
 
31
31
  - Split **infra vs real** first: a fail that is actually `panel_outcome='unavailable'` (or the errored-worker zero-issue shape) is an outage artifact, not an overridden quality verdict — route those to the Leg 4 roll-up.
@@ -37,7 +37,7 @@ node scripts/gds/api.js GET "/api/gds/override-requests?status=approved"
37
37
  A pass with `blocker`/`major` entries in `issues[]` shipped real findings that no process ever picks up (the evaluation counted 274 findings on passing ships with zero conversion paths). For each:
38
38
 
39
39
  - **Worker-attribution filter:** findings attributed to the advisory **Narc** are the known noise class — triage them by hand (read the finding, decide), never auto-trust them into the queue. Findings from the gating workers (Quality, Hacker, Efficiency) or the deterministic pre-passes are higher-confidence — queue them unless plainly stale.
40
- - **Queueing rule (idempotent):** first read the open inbox (`node scripts/gds/api.js GET /api/gds/inbox`) and skip any finding already queued — the marker is the deterministic title prefix. Then:
40
+ - **Queueing rule (idempotent):** first read the open inbox (`node scripts/gds/api.js GET /api/bongos/inbox`) and skip any finding already queued — the marker is the deterministic title prefix. Then:
41
41
 
42
42
  ```bash
43
43
  node scripts/gds/capture.js "[grade-audit] task <id>: <finding summary>" --kind bug
@@ -73,6 +73,6 @@ A clean week is four one-liners.
73
73
 
74
74
  ## Files this skill touches
75
75
 
76
- - Reads: `GET /api/gds/public/recent-shipped`, `GET /api/gds/tasks/:id?include=grade`, `GET /api/gds/override-requests?status=approved` (Archon), `GET /api/gds/inbox`.
76
+ - Reads: `GET /api/bongos/public/recent-shipped`, `GET /api/bongos/tasks/:id?include=grade`, `GET /api/bongos/override-requests?status=approved` (Archon), `GET /api/bongos/inbox`.
77
77
  - Writes: `idea_inbox` rows via `node scripts/gds/capture.js` (queued follow-ups only).
78
78
  - Never calls: any confirm, status, grade, or regrade endpoint.
@@ -19,7 +19,7 @@ node scripts/gds/ship.js <id> --regrade
19
19
  ## Step 1 — Read the grade
20
20
 
21
21
  ```bash
22
- node scripts/gds/api.js GET "/api/gds/tasks/<id>?include=grade,last_claim"
22
+ node scripts/gds/api.js GET "/api/bongos/tasks/<id>?include=grade,last_claim"
23
23
  ```
24
24
 
25
25
  - Task not at `completed` → stop; there is nothing to recover. `confirmed`/`shipped` means the grade passed (a `confirmed` strand lands via the ~5-min reconciler; `/merge-mode` is the rare manual fallback). `active` means ship first.
@@ -46,7 +46,7 @@ Two known sub-shapes, both recognizable because the "fail" carries **no substant
46
46
  If an honest re-grade re-trips the guard on a diff you can defend, use the **auditable override path** — file an override-request with a real rationale (≥20 chars; only the task's most-recent claim holder or an Archon may file; an Archon then decides it):
47
47
 
48
48
  ```bash
49
- node scripts/gds/api.js POST /api/gds/tasks/<id>/override-request --body '{"rationale":"<why this grade is wrong, specifically>"}'
49
+ node scripts/gds/api.js POST /api/bongos/tasks/<id>/override-request --body '{"rationale":"<why this grade is wrong, specifically>"}'
50
50
  ```
51
51
 
52
52
  **Never volunteer the raw Archon confirm curl.** The override-request is the sanctioned exit precisely because it records who asked, why, and who decided — the raw confirm records none of that.
@@ -79,6 +79,6 @@ A grade block naming protected surfaces above your rank is an authorization wall
79
79
 
80
80
  ## Files this skill touches
81
81
 
82
- - Reads: `GET /api/gds/tasks/:id?include=grade,last_claim` (the persisted grade row + regrade eligibility).
82
+ - Reads: `GET /api/bongos/tasks/:id?include=grade,last_claim` (the persisted grade row + regrade eligibility).
83
83
  - Runs: `node scripts/gds/ship.js <id> --regrade` (the grade step only).
84
- - Writes (Branch B escalation only): `POST /api/gds/tasks/:id/override-request`.
84
+ - Writes (Branch B escalation only): `POST /api/bongos/tasks/:id/override-request`.
@@ -12,9 +12,9 @@ You are running a health check over the grading panel. Everything here is **read
12
12
 
13
13
  A grader outage used to be recorded as a 0.0 "quality failure": one builder accumulated **21 zero-score rows** over a month before anyone noticed, and the public tile showed a phantom 5-day 0%-pass crater. Since the outage-as-zero fix, aggregates exclude outage rounds and bucket them as `n_unavailable` — so the streak is now directly readable.
14
14
 
15
- 1. Read the public trend: `node scripts/gds/api.js GET "/api/gds/public/grades?days=30"` — scan `trend[]` for days where the average is 0 (or null) with passes 0 and n ≥ 2, and for any nonzero `n_unavailable` streak.
16
- 2. (Archon) Read the per-builder split: `node scripts/gds/api.js GET "/api/gds/grades/by-builder?days=30"` — a single builder with pass_rate 0.000 or a large `n_unavailable` bucket is the 21×0.0 shape localized to one machine or one environment.
17
- 3. **Confirm outage vs rejection before alarming anyone.** For each task in a suspect window: `node scripts/gds/api.js GET "/api/gds/tasks/<id>?include=grade"` — `signals.panel_outcome='unavailable'` (with `grader_unavailable_reason` and per-worker errors in `signals.workers`) is an outage, **not a quality rejection**; a real FAIL carries findings in `issues[]`.
15
+ 1. Read the public trend: `node scripts/gds/api.js GET "/api/bongos/public/grades?days=30"` — scan `trend[]` for days where the average is 0 (or null) with passes 0 and n ≥ 2, and for any nonzero `n_unavailable` streak.
16
+ 2. (Archon) Read the per-builder split: `node scripts/gds/api.js GET "/api/bongos/grades/by-builder?days=30"` — a single builder with pass_rate 0.000 or a large `n_unavailable` bucket is the 21×0.0 shape localized to one machine or one environment.
17
+ 3. **Confirm outage vs rejection before alarming anyone.** For each task in a suspect window: `node scripts/gds/api.js GET "/api/bongos/tasks/<id>?include=grade"` — `signals.panel_outcome='unavailable'` (with `grader_unavailable_reason` and per-worker errors in `signals.workers`) is an outage, **not a quality rejection**; a real FAIL carries findings in `issues[]`.
18
18
  4. For every task parked at `completed` by a confirmed outage, emit the exact remediation line, one per task:
19
19
 
20
20
  ```bash
@@ -25,7 +25,7 @@ node scripts/gds/ship.js <id> --regrade
25
25
 
26
26
  ### 2 — Pass-rate drift
27
27
 
28
- Baselines: the 14-agent evaluation window measured a **90.6%** pass rate, already above the 87% that ADR 0024 called "suspiciously high" and built the adversarial panel to fix. From `/api/gds/public/grades` compute the rolling pass rate and compare:
28
+ Baselines: the 14-agent evaluation window measured a **90.6%** pass rate, already above the 87% that ADR 0024 called "suspiciously high" and built the adversarial panel to fix. From `/api/bongos/public/grades` compute the rolling pass rate and compare:
29
29
 
30
30
  - **Creeping up** past the baseline → grade inflation; the panel is rubber-stamping (report; candidate causes: score compression, reused grades, trivial-path overuse).
31
31
  - **Collapsing** far below it → either a real quality regression or an unconfirmed outage window — axis 1 disambiguates.
@@ -35,7 +35,7 @@ Baselines: the 14-agent evaluation window measured a **90.6%** pass rate, alread
35
35
  Benchmark: mean panel cost **$2.14** per grade, and ~90% of it is **fixed** re-exploration cost, independent of diff size. (Measured with Quality on the haiku tier; since task 1003318 Quality runs on claude-sonnet-5, so a mean sitting somewhat above $2.14 is the new normal until re-baselined — a rise alone is not an anomaly.) Read grader spend and divide by the grade count from axis 2's window:
36
36
 
37
37
  ```
38
- node scripts/gds/api.js GET "/api/gds/public/cost-summary?source=grader&days=30" --quiet \
38
+ node scripts/gds/api.js GET "/api/bongos/public/cost-summary?source=grader&days=30" --quiet \
39
39
  | node -e "let s='';process.stdin.on('data',d=>s+=d).on('end',()=>{const j=JSON.parse(s);
40
40
  if(j.applied_filters?.source!=='grader'){console.error('FILTER DROPPED — do not divide');process.exit(1)}
41
41
  console.log('grader 30d:', j.filtered_total_usd)})"
@@ -66,6 +66,6 @@ End with a compact findings list, most severe first: axis, evidence (the numbers
66
66
 
67
67
  ## Files this skill touches
68
68
 
69
- - Reads: `GET /api/gds/public/grades`, `GET /api/gds/grades/by-builder` (Archon), `GET /api/gds/public/cost-summary?source=grader` (the `filtered_total_usd` key), `GET /api/gds/tasks/:id?include=grade`, `modules/grading/grader.js`, `modules/grading/grader-rubric.json`.
69
+ - Reads: `GET /api/bongos/public/grades`, `GET /api/bongos/grades/by-builder` (Archon), `GET /api/bongos/public/cost-summary?source=grader` (the `filtered_total_usd` key), `GET /api/bongos/tasks/:id?include=grade`, `modules/grading/grader.js`, `modules/grading/grader-rubric.json`.
70
70
  - Runs (read-only): `node scripts/gds/doctor.js`; with `--probe` only: `node scripts/gds/grade-smoke.js`.
71
71
  - Writes: nothing.
@@ -55,12 +55,12 @@ capture-time suggester (R08/R09/R11 surfaces) is where the fix belongs.
55
55
 
56
56
  ## Rank gate — Metic+ only
57
57
 
58
- **Gated to Metic+ (Metic, Archon); not Xenos.** Triage verdicts (promote, discard, merge) reshape the team's backlog — a trusted-builder operation (GDS-V3 criterion C2, `three-ranks-gate-everything`; [`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md), [ADR 0018](../../../docs/adr/0018-three-rank-model-goes-live.md)). A Xenos can still **file** an idea (`POST /api/gds/inbox`); they just can't verdict them.
58
+ **Gated to Metic+ (Metic, Archon); not Xenos.** Triage verdicts (promote, discard, merge) reshape the team's backlog — a trusted-builder operation (GDS-V3 criterion C2, `three-ranks-gate-everything`; [`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md), [ADR 0018](../../../docs/adr/0018-three-rank-model-goes-live.md)). A Xenos can still **file** an idea (`POST /api/bongos/inbox`); they just can't verdict them.
59
59
 
60
60
  **Enforce the gate at the very top of the session, before reading anything else:**
61
61
 
62
- 1. Call `GET /api/gds/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
63
- 2. **If `rank` is present and lowercases to `xenos`** → stop immediately. Tell the builder: *"Idea triage is a Metic+ operation — promoting, discarding, or merging an idea reshapes the team's backlog. You're currently Xenos. You can still file a new idea via `POST /api/gds/inbox`; ask an Archon to promote you if you need to triage them."* Do not list open ideas, do not propose verdicts.
62
+ 1. Call `GET /api/bongos/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
63
+ 2. **If `rank` is present and lowercases to `xenos`** → stop immediately. Tell the builder: *"Idea triage is a Metic+ operation — promoting, discarding, or merging an idea reshapes the team's backlog. You're currently Xenos. You can still file a new idea via `POST /api/bongos/inbox`; ask an Archon to promote you if you need to triage them."* Do not list open ideas, do not propose verdicts.
64
64
  3. **If `rank` lowercases to `metic` or `archon`** → proceed with the steps below.
65
65
  4. **If `rank` is absent** (the GET /me response has no `rank` field — only possible against a deployment where the three-rank model hasn't shipped yet): treat the session as available, exactly as `/planning-session` and `/priority-session` do in their pre-rank passthrough mode. Note in the session log that the gate ran in pre-rank passthrough mode.
66
66
 
@@ -68,18 +68,18 @@ capture-time suggester (R08/R09/R11 surfaces) is where the fix belongs.
68
68
 
69
69
  ## What this skill does
70
70
 
71
- 1. Lists open ideas via `GET /api/gds/inbox`.
71
+ 1. Lists open ideas via `GET /api/bongos/inbox`.
72
72
  2. **Batches near-duplicate ideas** into one verdict per cluster (`node scripts/gds/triage.js`'s `clusterIdeas`), so a backlog of similar asks doesn't cost one decision each (task 1001465).
73
73
  3. **Develops what's left with a LEAN inline pass by default** — reasoning from context already in the session, no subagent spend — and escalates to a FEW targeted subagents only where repo grounding would actually flip the verdict (task 1001465; the old unconditional 12-subagent fan-out is now opt-in, task 930's original mechanism).
74
74
  4. For each, prompts the user with: **promote** (create a task and link it), **discard** (closed, no action), or **merge** (this duplicates idea N, mark merged into N).
75
- 5. Updates each idea via `PATCH /api/gds/inbox/:id` with the verdict.
75
+ 5. Updates each idea via `PATCH /api/bongos/inbox/:id` with the verdict.
76
76
 
77
77
  ## How to use
78
78
 
79
79
  **Step 1 — fetch the open inbox.**
80
80
 
81
81
  ```
82
- node scripts/gds/api.js GET /api/gds/inbox
82
+ node scripts/gds/api.js GET /api/bongos/inbox
83
83
  ```
84
84
 
85
85
  (`api.js` is the cross-platform Bongos API helper — it signs the request with your
@@ -216,28 +216,28 @@ at the triage end, where the judgement is.)
216
216
 
217
217
  **Promote → pick the tier (BV1.R64 / ADR 0086).** An idea no longer only becomes a *task* — it can promote into any tier of the work hierarchy: a **goal** (a whole module-scoped workspace), a **criterion** (a new done-when test), or a **task** (a single unit of work). Choose by the idea's size: a broad objective → goal; a "we should also require X to be done" → criterion; a concrete piece of work → task. Frame the choice to the user in those terms, then create the right record and mark the idea promoted.
218
218
 
219
- - **Promote → task** (the common case). Ask for version, title, est_minutes, priority, credits_reward (`touches[]` optional — [ADR 0049](../../../docs/adr/0049-split-parallel-safety-contract.md)). `POST /api/gds/tasks` lands the new task in `backlog`, **not** `active` — it still needs `POST /tasks/:id/promote` (Metic+) before it's claimable. **Pass `goal_id` on the create** so the task lands in a real goal rather than the version's `"<version> — general"` catch-all — `POST /tasks` has accepted it since task 1763, and the 201 now returns a `goal_advisory` when the task ends up with no proper home. If no existing goal fits, run [`/goal-create`](../goal-create/SKILL.md) instead of filing it loose.
219
+ - **Promote → task** (the common case). Ask for version, title, est_minutes, priority, credits_reward (`touches[]` optional — [ADR 0049](../../../docs/adr/0049-split-parallel-safety-contract.md)). `POST /api/bongos/tasks` lands the new task in `backlog`, **not** `active` — it still needs `POST /tasks/:id/promote` (Metic+) before it's claimable. **Pass `goal_id` on the create** so the task lands in a real goal rather than the version's `"<version> — general"` catch-all — `POST /tasks` has accepted it since task 1763, and the 201 now returns a `goal_advisory` when the task ends up with no proper home. If no existing goal fits, run [`/goal-create`](../goal-create/SKILL.md) instead of filing it loose.
220
220
 
221
221
  ```
222
222
  # 1. Create the task (--body-file avoids shell-quoting the touches[]/description).
223
- node scripts/gds/api.js POST /api/gds/tasks --body-file <path-to-task.json>
223
+ node scripts/gds/api.js POST /api/bongos/tasks --body-file <path-to-task.json>
224
224
  # task.json: {"version_id":"...","title":"...","description":"...","touches":[...],
225
225
  # "est_minutes":N,"priority":N,"credits_reward":N,"source":"idea_inbox","source_ref":"idea:<idea_id>"}
226
226
  # 2. Mark the idea promoted, pointing promoted_to_task_id at the new task id.
227
- node scripts/gds/api.js PATCH /api/gds/inbox/<idea_id> --body '{"status":"promoted","promoted_to_task_id":<new_task_id>}'
227
+ node scripts/gds/api.js PATCH /api/bongos/inbox/<idea_id> --body '{"status":"promoted","promoted_to_task_id":<new_task_id>}'
228
228
  ```
229
229
 
230
230
  - **Promote → goal** (Metic+; Archon if the scope includes a `protected` module). For anything needing criteria and seed tasks, run [`/goal-create`](../goal-create/SKILL.md) — it does the reuse-vs-new check, the scope wall and the sign-off. The bare one-liner below is fine only for a goal you are deliberately leaving empty. Create the goal, then mark the idea promoted — `promoted_to_task_id` stays NULL (a goal isn't a task; note the new goal id in the session log, mirroring how criterion-promotion records its link).
231
231
 
232
232
  ```
233
- node scripts/gds/api.js POST /api/gds/goals --body '{"version_id":"<ver>","title":"...","description":"from idea #<idea_id>","scope_modules":["<module-key>", ...]}'
234
- node scripts/gds/api.js PATCH /api/gds/inbox/<idea_id> --body '{"status":"promoted"}'
233
+ node scripts/gds/api.js POST /api/bongos/goals --body '{"version_id":"<ver>","title":"...","description":"from idea #<idea_id>","scope_modules":["<module-key>", ...]}'
234
+ node scripts/gds/api.js PATCH /api/bongos/inbox/<idea_id> --body '{"status":"promoted"}'
235
235
  ```
236
236
 
237
237
  - **Promote → criterion** (Metic+ — `idea.ratify`, metic-floored since ADR 0157; done-when writes are scope-shaping, criterion C2). This reuses the existing ratify path: the idea must be `kind='criterion-proposal'` with a `body_md` JSON of `{target_version, criterion_md, sort_order_hint}` (the `/planning-session` shape). One atomic call both inserts the criterion and marks the idea promoted:
238
238
 
239
239
  ```
240
- node scripts/gds/api.js POST /api/gds/inbox/<idea_id>/ratify --body '{"notes_md":"ratified via idea-triage"}'
240
+ node scripts/gds/api.js POST /api/bongos/inbox/<idea_id>/ratify --body '{"notes_md":"ratified via idea-triage"}'
241
241
  ```
242
242
 
243
243
  If the idea isn't already criterion-proposal-shaped, either re-file it in that shape or promote it to a task/goal instead — don't hand-write a `done_when_criteria` row.
@@ -245,13 +245,13 @@ at the triage end, where the judgement is.)
245
245
  **Discard** → mark it closed, with the reason (`triage_note`, task 1002447 / migration core_195 — a discard with no reason is a verdict nobody can audit):
246
246
 
247
247
  ```
248
- node scripts/gds/api.js PATCH /api/gds/inbox/<idea_id> --body '{"status":"discarded","triage_note":"superseded by the new gate"}'
248
+ node scripts/gds/api.js PATCH /api/bongos/inbox/<idea_id> --body '{"status":"discarded","triage_note":"superseded by the new gate"}'
249
249
  ```
250
250
 
251
251
  **Merge** → ask the user which other idea N is the canonical one, then fold this one into it:
252
252
 
253
253
  ```
254
- node scripts/gds/api.js PATCH /api/gds/inbox/<idea_id> --body '{"status":"merged","merged_into_idea_id":<canonical_idea_id>,"triage_note":"same ask as #N"}'
254
+ node scripts/gds/api.js PATCH /api/bongos/inbox/<idea_id> --body '{"status":"merged","merged_into_idea_id":<canonical_idea_id>,"triage_note":"same ask as #N"}'
255
255
  ```
256
256
 
257
257
  > **`merged_into_idea_id`, NOT `promoted_to_task_id`.** This skill used to document the latter; that column is `REFERENCES tasks(id)`, so an idea id written there either trips the FK (a 500) or silently points at an unrelated task that happens to share the number. Task 1002447 added the real column. The server refuses a self-merge (`MERGE_SELF`), a target that doesn't exist (`MERGE_TARGET_NOT_FOUND`), and a target that is itself merged (`MERGE_TARGET_MERGED` — it names where the chain ends, so retarget there).
@@ -15,7 +15,7 @@ The queue this skill works against is **tasks at status='confirmed'**. Those are
15
15
  2. For each, finds the branch (`claude/<worktree_name>` from the claim).
16
16
  3. Merges in order (independent first, then conflict-prone), resolves conflicts manually with the user. **The `git merge` is itself the collision detector** — the predictive touches[] drift scanner was deleted (touches[] cleanup [4/8], task 879); a real conflict surfaces here, at the authoritative moment, not as an up-front prediction.
17
17
  4. After all merges: smoke + push + deploy.
18
- 5. For each merged task, calls `POST /api/gds/tasks/:id/ship` to flip the task from `confirmed` → `shipped`.
18
+ 5. For each merged task, calls `POST /api/bongos/tasks/:id/ship` to flip the task from `confirmed` → `shipped`.
19
19
 
20
20
  ## How to use
21
21
 
@@ -44,7 +44,7 @@ stopped the run (task 1003167).
44
44
  **Step 1 — list the queue: tasks at confirmed.**
45
45
 
46
46
  ```
47
- node scripts/gds/api.js GET "/api/gds/tasks?status=confirmed"
47
+ node scripts/gds/api.js GET "/api/bongos/tasks?status=confirmed"
48
48
  ```
49
49
 
50
50
  If the list is empty, print "no tasks at confirmed — auto-merge in /builder-ship handled them all" and exit.
@@ -160,7 +160,7 @@ This is mandatory on every exit path — including aborts and conflicts you deci
160
160
  For each task that successfully merged + deployed:
161
161
 
162
162
  ```
163
- node scripts/gds/api.js POST /api/gds/tasks/<task-id>/ship
163
+ node scripts/gds/api.js POST /api/bongos/tasks/<task-id>/ship
164
164
  ```
165
165
 
166
166
  The `POST /tasks/:id/ship` endpoint flips the task to `shipped`, stamps `shipped_at`. **This is the credit moment** — [ADR 0120](../../../docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md) books the reward on land, so this call is what pays the builder (on a `cost-plus-only` instance like Cloud Bongos that is the cost-plus session reward only — the per-task estimate is never paid; [ADR 0146](../../../docs/adr/<redacted><redacted>.md)).
@@ -33,11 +33,11 @@ This mirrors GDS-V3 criterion C2 (`three-ranks-gate-everything`) and matches the
33
33
 
34
34
  **Enforce the gate at the very top of the session, before reading anything else:**
35
35
 
36
- 1. Call `GET /api/gds/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
37
- 2. **If `rank` is present and lowercases to `xenos`** → stop immediately. Tell the builder: *"Planning sessions set the scope-truth of a version — they're a Metic+ operation. You're currently Xenos. You can still **file** a criterion proposal or task idea via `POST /api/gds/inbox` (which lands in idea_inbox for a Metic+ builder to ratify at the next planning session); ask an Archon for promotion if you need to run sessions directly."* Do not pull state, do not present criteria, do not propose tasks.
36
+ 1. Call `GET /api/bongos/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
37
+ 2. **If `rank` is present and lowercases to `xenos`** → stop immediately. Tell the builder: *"Planning sessions set the scope-truth of a version — they're a Metic+ operation. You're currently Xenos. You can still **file** a criterion proposal or task idea via `POST /api/bongos/inbox` (which lands in idea_inbox for a Metic+ builder to ratify at the next planning session); ask an Archon for promotion if you need to run sessions directly."* Do not pull state, do not present criteria, do not propose tasks.
38
38
  3. **If `rank` lowercases to `metic`** → proceed in **Metic-mode**: run the five-phase structure below conversationally, but in Phase 5 write proposals to `idea_inbox` (kind=`criterion-proposal` for criteria, kind=`feature` for tasks) tagged with the target version. Any Metic+ builder ratifies them (`idea.ratify`, metic-floored since ADR 0157) — typically at the next planning session. Since [ADR 0090](../../../docs/adr/0090-metic-task-authoring.md) a Metic MAY `POST /tasks` directly, and since [ADR 0154](../../../docs/adr/0154-goal-owner-criterion-authoring.md) a Metic MAY write a `done_when_criteria` row for a goal they own or manage. What needs an Archon is a VERSION-level criterion (no `goal_id`), one in a goal you don't hold, and — since [ADR 0250](../../../docs/adr/0250-strict-versioning-the-version-boundary-is-the-scope-gate.md) §6 (task 1003608) — **creating a version at all**: `version.create` returned to the Archon floor, because once the version boundary carries the scope gate, cutting a version is the way around it rather than authoring. ADR 0157 had briefly delegated it to Metic; it no longer is. The spec-draft (Phase 3) and the in-depth interview (Phase 4) run identically in Metic-mode — the only difference is the Phase-5 write (you file proposals, you don't seed tasks directly).
39
39
 
40
- **For each criterion proposal**, write `body_md` as a JSON object with this exact shape so the `POST /api/gds/inbox/:id/ratify` endpoint (V3.R31 / #252) can parse it cleanly:
40
+ **For each criterion proposal**, write `body_md` as a JSON object with this exact shape so the `POST /api/bongos/inbox/:id/ratify` endpoint (V3.R31 / #252) can parse it cleanly:
41
41
 
42
42
  ```json
43
43
  {
@@ -52,24 +52,24 @@ This mirrors GDS-V3 criterion C2 (`three-ranks-gate-everything`) and matches the
52
52
  **Net-new version (idea 425).** The Metic-mode path above assumes the target version *already exists* — its criterion proposals carry `suggested_version` (an FK to a `versions` row) and a `target_version` that must match `versions.id`. **A Metic cannot create one:** `version.create` is **Archon-floored** ([ADR 0250](../../../docs/adr/0250-strict-versioning-the-version-boundary-is-the-scope-gate.md) §6, task 1003608 — ADR 0157 had briefly lowered it to Metic and that is reversed). So `POST /versions` returns `403` and the Metic has no valid FK to point at. Ask an Archon to cut the version — or, when that is not available, run the session in Metic-mode as usual through Phases 1–4 and in Phase 5 file the proposals like this instead:
53
53
 
54
54
  1. **OMIT `suggested_version` on every proposal row.** It is an FK to a version row that doesn't exist yet; leaving it set would fail the constraint (or worse, attach the proposal to the wrong existing version). Leave it `null`/absent.
55
- 2. **Keep `target_version` INSIDE the criterion-proposal `body_md` JSON as plain text** (the version's intended id/slug, e.g. `"V4"`). It is *not* validated as an FK there — it's a label the Archon reads at ratify time. Once the Archon creates the real version row, the proposal is ratifiable as-is: `POST /api/gds/inbox/:id/ratify` resolves `target_version` against the now-existing `versions.id`.
55
+ 2. **Keep `target_version` INSIDE the criterion-proposal `body_md` JSON as plain text** (the version's intended id/slug, e.g. `"V4"`). It is *not* validated as an FK there — it's a label the Archon reads at ratify time. Once the Archon creates the real version row, the proposal is ratifiable as-is: `POST /api/bongos/inbox/:id/ratify` resolves `target_version` against the now-existing `versions.id`.
56
56
  3. **File ONE umbrella feature idea** (`kind='feature'`) that captures the whole net-new version in a single inbox row: the proposed version (id/slug + one-line theme), its goals, and a seed spec (the agreed criteria + the brainstormed task list). This is the thing an Archon picks up to actually create the version, then ratify the criterion proposals against it. One umbrella idea — not one idea per task — keeps the net-new version reviewable as a single unit.
57
57
 
58
58
  Tell the Metic plainly: *"This deployment still gates version creation above Metic, so I've filed your criteria as proposals (with the version name kept as text inside each) plus one umbrella idea describing the whole version. Once someone who clears that gate creates the version row, any Metic+ builder ratifies these against it — your karma and attribution carry through."*
59
59
  4. **If `rank` lowercases to `archon`** → proceed in **Archon-mode**: full session, Phase 5 writes the migration + tasks + dependencies + done_when_criteria atomically. This is the flow described below.
60
60
  5. **If `rank` is absent** (the `/me` response has no `rank` field — only possible against a deployment where the three-rank model hasn't shipped yet): treat the session as Archon-mode, exactly as `/idea-triage` does in its pre-rank passthrough mode. Note in the session log that the gate ran in pre-rank passthrough mode.
61
61
 
62
- > The gate is **belt-and-braces**: the server already rejects `POST /api/gds/tasks`, `POST /tasks/:id/dependencies`, and `POST /done-when/:id/satisfy` with `403 permission_forbidden` for sub-Metic callers (all three are metic-floored — `task.create`, `task.dependency.manage`, `criterion.satisfy` — so a Metic makes these writes directly, as the Metic-mode step above says), and `POST /api/gds/inbox` with `kind='criterion-proposal'` is gated to Metic+ (so a Xenos can't slip a criterion proposal in via raw curl). This frontmatter + check is the *intent surfaced to the operator*; the server is the *enforcement*. The skill stops early so a Xenos doesn't walk through a whole session only to hit 403s on every write in Phase 5.
62
+ > The gate is **belt-and-braces**: the server already rejects `POST /api/bongos/tasks`, `POST /tasks/:id/dependencies`, and `POST /done-when/:id/satisfy` with `403 permission_forbidden` for sub-Metic callers (all three are metic-floored — `task.create`, `task.dependency.manage`, `criterion.satisfy` — so a Metic makes these writes directly, as the Metic-mode step above says), and `POST /api/bongos/inbox` with `kind='criterion-proposal'` is gated to Metic+ (so a Xenos can't slip a criterion proposal in via raw curl). This frontmatter + check is the *intent surfaced to the operator*; the server is the *enforcement*. The skill stops early so a Xenos doesn't walk through a whole session only to hit 403s on every write in Phase 5.
63
63
 
64
64
  ## The session — five phases
65
65
 
66
66
  ### Phase 1 — Set the table
67
67
 
68
- 1. **Confirm the target version.** Pull `GET /api/gds/public/versions`. If the user didn't name one, list versions in `status='planning'` and ask which.
68
+ 1. **Confirm the target version.** Pull `GET /api/bongos/public/versions`. If the user didn't name one, list versions in `status='planning'` and ask which.
69
69
  2. **Pull what's already queued for that version:**
70
- - `GET /api/gds/tasks?version=<id>` — every task already bound to the version
71
- - `GET /api/gds/inbox` (filter `suggested_version=<id>` or `status=open` if no suggested-version filter is supported by the route)
72
- - `GET /api/gds/versions/<id>/done-when` — any criteria already seeded
70
+ - `GET /api/bongos/tasks?version=<id>` — every task already bound to the version
71
+ - `GET /api/bongos/inbox` (filter `suggested_version=<id>` or `status=open` if no suggested-version filter is supported by the route)
72
+ - `GET /api/bongos/versions/<id>/done-when` — any criteria already seeded
73
73
  3. **Surface the signal back to the user** as a compact summary:
74
74
  - N tasks already queued, grouped by kind
75
75
  - M open ideas tagged for this version
@@ -81,7 +81,7 @@ This is where the user sees what they're shaping. Do not skip this — criteria
81
81
  4. **Rescope — carry achieved goals forward (ADR 0086 §6 / BV1.R64).** If this version succeeds a prior one, pull the prior version's **achieved** goals and decide, per goal, "previous or new":
82
82
 
83
83
  ```
84
- node scripts/gds/api.js GET "/api/gds/goals?version=<prev>&status=achieved"
84
+ node scripts/gds/api.js GET "/api/bongos/goals?version=<prev>&status=achieved"
85
85
  ```
86
86
 
87
87
  - **Carry forward** — the goal's objective continues into this version. Create the successor goal in Phase 5 with `succeeds_goal_id` pointing at the prior goal (`POST /goals` stamps the predecessor's `succeeded_by_goal_id`), then **archive the prior goal** (`POST /goals/:id/archive`). The lineage stays queryable.
@@ -270,13 +270,13 @@ Once the spec is finalized (Phase 4), **read `docs/specs/<ver>-<goal-slug>.md` a
270
270
  2. **Create the version's goals, then write the criteria migration.** Goals come first (ADR 0086) so the criteria can be parented under them:
271
271
  - **Goals** (via API — `POST /goals`; Archon-only when the scope includes a `protected` module). One per goal from Phase 2.5; **capture each returned goal id**.
272
272
  ```
273
- node scripts/gds/api.js POST /api/gds/goals --body '{"version_id":"<ver>","title":"...","scope_modules":["<key>", ...]}'
273
+ node scripts/gds/api.js POST /api/bongos/goals --body '{"version_id":"<ver>","title":"...","scope_modules":["<key>", ...]}'
274
274
  # carry-forward goal: add "succeeds_goal_id":<prior_goal_id>
275
275
  ```
276
276
  - **Criteria — the vector depends on whether the instance is LIVE ([ADR 0105](../../../docs/adr/0105-instance-seed-migrations-out-of-core.md)):**
277
- - **On a RUNNING instance (the normal case — planning a new goal/version on prod):** create each criterion via the **`POST /api/gds/versions/:id/done-when`** API (**Metic+ for a goal you own or manage — [ADR 0154](../../../docs/adr/0154-goal-owner-criterion-authoring.md); Archon for a version-level criterion, someone else's goal, or a shipped/frozen version**), passing `criterion_id` (a stable slug), `criterion_md`, `goal_id` (the goal from above), and optional `sort_order`. This is the ONLY vector that actually lands a NEW criterion on a live DB — a `done_when_criteria` INSERT in a CORE migration **fails the `selfhost-boot` gate** (scope-truth pollution), and one in `migrations/instance/` **silently no-ops on a normal deploy** (ADR 0105 applies instance seeds only under the owner opt-in `GDS_APPLY_INSTANCE_SEEDS=1`, a DR step). A duplicate `criterion_id` returns 409 — treat as "already seeded."
277
+ - **On a RUNNING instance (the normal case — planning a new goal/version on prod):** create each criterion via the **`POST /api/bongos/versions/:id/done-when`** API (**Metic+ for a goal you own or manage — [ADR 0154](../../../docs/adr/0154-goal-owner-criterion-authoring.md); Archon for a version-level criterion, someone else's goal, or a shipped/frozen version**), passing `criterion_id` (a stable slug), `criterion_md`, `goal_id` (the goal from above), and optional `sort_order`. This is the ONLY vector that actually lands a NEW criterion on a live DB — a `done_when_criteria` INSERT in a CORE migration **fails the `selfhost-boot` gate** (scope-truth pollution), and one in `migrations/instance/` **silently no-ops on a normal deploy** (ADR 0105 applies instance seeds only under the owner opt-in `GDS_APPLY_INSTANCE_SEEDS=1`, a DR step). A duplicate `criterion_id` returns 409 — treat as "already seeded."
278
278
  ```
279
- node scripts/gds/api.js POST /api/gds/versions/<ver>/done-when --body '{"criterion_id":"<slug>","criterion_md":"...","goal_id":<gid>}'
279
+ node scripts/gds/api.js POST /api/bongos/versions/<ver>/done-when --body '{"criterion_id":"<slug>","criterion_md":"...","goal_id":<gid>}'
280
280
  ```
281
281
  - **For a brand-new version scaffolded from scratch (DR / a fresh instance):** put the `INSERT INTO done_when_criteria` (with `goal_id`, `ON CONFLICT ... DO UPDATE`) in **`migrations/instance/<NN>_<ver_slug>_planning_seed.sql`** — and recreate the goal idempotently in the same file (the goal is a runtime row a replay won't have). Applies only under `GDS_APPLY_INSTANCE_SEEDS=1`.
282
282
  - **Migration** at `migrations/<NN>_<ver_slug>_planning_seed.sql` (CORE — platform-universal, non-scope-truth changes only): `UPDATE versions SET done_when = ...` and `UPDATE tasks` for existing-task priority + V##.R## title prefix (guarded by `WHERE title NOT LIKE 'V<ver>.R%'`). **Do NOT put versions/goals/`done_when_criteria` INSERTs here** — that's scope-truth and fails the `selfhost-boot` gate (ADR 0105).
@@ -290,11 +290,11 @@ Once the spec is finalized (Phase 4), **read `docs/specs/<ver>-<goal-slug>.md` a
290
290
 
291
291
  > **Seeding contract — validated on goal 1000045 (2026-07-16):** proof-tasks use `kind='verify'` (a deliverable that IS a verification; can't be prematurely confirmed), spikes `kind='spike'`; `POST /tasks` accepts `criterion_ids` + `goal_id` inline and disciplines include `ui`; there is **no `promoted_idea_id`** field on `POST /tasks` — mark a promoted idea via `PATCH /inbox/:id`; **descoping a criterion has no API** (done-when is create/satisfy/unsatisfy only) — remove the row via a direct DB delete (`ssh … "sudo -u postgres psql -d <db> -c \"DELETE FROM done_when_criteria WHERE id=…\""`) under the meta-task claim, capturing the SQL in its notes; and a seed script **must throttle + honor `429` `retry_after`** (per-IP rate limit) — add a base delay between calls and back off on 429, or a large seed dies halfway. A completed reference seed: `scripts/gds/<redacted>.js`.
292
292
  >
293
- > **Every seed script verifies its own criterion links — fail loudly on any mismatch, zero included (task 1003076, retro on goal 1000071).** The goal-1000071 seeder linked all 15 tasks to the WRONG criteria (a positional `"Cn"` token resolved against the whole VERSION's criterion order, not the goal's — learning 1000188) and still printed success; only a manual `GET /goals` rollup caught it, after the fact. Every seed script's `main()` must end by tallying the `criterion_ids` it actually POSTed per task, then calling `verifySeedCriteriaLinks` from [`scripts/gds/seed-verify-criteria.js`](../../../scripts/gds/seed-verify-criteria.js) — it fetches `GET /api/gds/goals/<id>`, diffs the returned `criteria[].linked_tasks` against that plan, and `exit(1)`s with a loud per-criterion diff on any mismatch (see `expectedCriterionCounts` + `verifySeedCriteriaLinks`). Reference implementation: `scripts/gds/<redacted>.js`. This is a script-level check, independent of whatever caused the mislink — it catches the *symptom* (a criterion silently under- or over-linked) whichever bug produces it.
293
+ > **Every seed script verifies its own criterion links — fail loudly on any mismatch, zero included (task 1003076, retro on goal 1000071).** The goal-1000071 seeder linked all 15 tasks to the WRONG criteria (a positional `"Cn"` token resolved against the whole VERSION's criterion order, not the goal's — learning 1000188) and still printed success; only a manual `GET /goals` rollup caught it, after the fact. Every seed script's `main()` must end by tallying the `criterion_ids` it actually POSTed per task, then calling `verifySeedCriteriaLinks` from [`scripts/gds/seed-verify-criteria.js`](../../../scripts/gds/seed-verify-criteria.js) — it fetches `GET /api/bongos/goals/<id>`, diffs the returned `criteria[].linked_tasks` against that plan, and `exit(1)`s with a loud per-criterion diff on any mismatch (see `expectedCriterionCounts` + `verifySeedCriteriaLinks`). Reference implementation: `scripts/gds/<redacted>.js`. This is a script-level check, independent of whatever caused the mislink — it catches the *symptom* (a criterion silently under- or over-linked) whichever bug produces it.
294
294
 
295
295
  4. **Apply the migration** (commit + push + deploy, or direct psql via SSH for hot-fix style).
296
296
 
297
- 5. **Run the seed script.** Verify exit code 0 — the seed's own final step (the Seeding contract's `verifySeedCriteriaLinks` call, above) already fails loudly if any criterion's linked task count doesn't match the plan, so a 0 exit means the links landed correctly, not just that the POSTs didn't error. Also spot-check totals via `GET /api/gds/public/progress` and `GET /api/gds/versions/<ver>/done-when`.
297
+ 5. **Run the seed script.** Verify exit code 0 — the seed's own final step (the Seeding contract's `verifySeedCriteriaLinks` call, above) already fails loudly if any criterion's linked task count doesn't match the plan, so a 0 exit means the links landed correctly, not just that the POSTs didn't error. Also spot-check totals via `GET /api/bongos/public/progress` and `GET /api/bongos/versions/<ver>/done-when`.
298
298
 
299
299
  6. **Promote the zero-dep layer to `ready` — scoped to the tasks you just seeded.** Every newly-seeded task lands `status='backlog'`. The auto-promotion trigger only fires when a *dependency* ships — so a task with zero deps has nothing to wait for and would sit unclaimable forever.
300
300
 
@@ -349,7 +349,7 @@ Once the spec is finalized (Phase 4), **read `docs/specs/<ver>-<goal-slug>.md` a
349
349
 
350
350
  If the query returns rows, surface them to the user verbatim:
351
351
 
352
- > "Heads up — these spikes sit at priority ≥ the top of your ready queue. They don't auto-promote (kind='spike', [ADR 0015](../../../docs/adr/0015-task-dependencies-and-auto-promotion.md)). If any gates downstream work, open it manually: `POST /api/gds/tasks/<id>/promote`"
352
+ > "Heads up — these spikes sit at priority ≥ the top of your ready queue. They don't auto-promote (kind='spike', [ADR 0015](../../../docs/adr/0015-task-dependencies-and-auto-promotion.md)). If any gates downstream work, open it manually: `POST /api/bongos/tasks/<id>/promote`"
353
353
 
354
354
  If the query returns nothing, stay silent. Don't volunteer info about lower-priority spikes — the next planning session or `/idea-triage` walk will handle those at the right moment.
355
355
 
@@ -365,10 +365,10 @@ runs on Windows/macOS/Linux.
365
365
 
366
366
  ```
367
367
  # Phase 1 — pull state
368
- node scripts/gds/api.js GET /api/gds/public/versions
369
- node scripts/gds/api.js GET "/api/gds/tasks?version=<id>"
370
- node scripts/gds/api.js GET /api/gds/inbox
371
- node scripts/gds/api.js GET /api/gds/versions/<id>/done-when
368
+ node scripts/gds/api.js GET /api/bongos/public/versions
369
+ node scripts/gds/api.js GET "/api/bongos/tasks?version=<id>"
370
+ node scripts/gds/api.js GET /api/bongos/inbox
371
+ node scripts/gds/api.js GET /api/bongos/versions/<id>/done-when
372
372
  ```
373
373
 
374
374
  Phase 5 writes use the same `POST /tasks`, `PATCH /inbox/:id` shape as `idea-triage` and `seed-v3-tasks.js`. Mirror those patterns rather than inventing new ones.