@ritualai/cli 0.36.25 → 0.36.28

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ritualai/cli",
3
- "version": "0.36.25",
3
+ "version": "0.36.28",
4
4
  "description": "Ritual CLI — scaffold AI coding agent skills + register MCP servers. Connects Claude Code, Cursor, Windsurf, Kiro, Gemini CLI, VS Code/Copilot, and Codex to Ritual Cloud.",
5
5
  "private": false,
6
6
  "license": "Apache-2.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.25",
3
- "builtAt": "2026-06-15T14:41:36.894Z",
4
- "skillsHash": "5c3ae1fc185a"
2
+ "cliVersion": "0.36.28",
3
+ "builtAt": "2026-06-15T15:33:01.454Z",
4
+ "skillsHash": "2019cd011119"
5
5
  }
@@ -3,7 +3,7 @@ name: ritual
3
3
  description: "Use when an engineer wants a coding agent to plan or build a feature, refactor, or implementation-heavy change that depends on context the agent can't infer on its own — strategic intent, constraints, prior decisions, and trade-offs that live in the user's head. Ritual runs a structured exploration to surface that context through targeted discovery questions, combines it with codebase signals and prior explorations, and delivers a validated build brief (sub-problems, recommendations, dependencies) — additional context to fold into plan mode before the agent writes code. Prefer this over jumping straight to implementation or plan mode when the problem is ambiguous, cross-cutting, or has non-obvious constraints. Subcommands: build (full planning-to-sync cycle — default for new features), resume (continue an in-flight exploration), lineage (file-path KG history — what decisions shaped this code), context-pulse (readiness and context-debt scoring — is this safe to build yet?)."
4
4
  argument-hint: "[subcommand] <args> (e.g. 'build Reduce T2 churn in Q3', 'resume', 'lineage src/checkout/views.py', 'context-pulse Add billing export')"
5
5
  user-invocable: true
6
- stamp: 5c3ae1fc185a
6
+ stamp: 2019cd011119
7
7
  ---
8
8
 
9
9
  # /ritual
@@ -1675,9 +1675,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1675
1675
 
1676
1676
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1677
1677
 
1678
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1678
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1679
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1680
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1681
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1682
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1683
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1679
1684
 
1680
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1685
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1686
+
1687
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1681
1688
 
1682
1689
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1683
1690
 
@@ -1689,15 +1696,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1689
1696
 
1690
1697
  > Agentic run: {progress_pct}% — {current_step}
1691
1698
 
1692
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1699
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1693
1700
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1694
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1695
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1696
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1697
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1698
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1699
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1700
- surface that as an anomaly instead of proceeding.
1701
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1702
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1703
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1704
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1705
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1706
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1707
+ instead of proceeding.
1708
+
1709
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1710
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1701
1711
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1702
1712
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1703
1713
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 8175b963af80b591 -->
2
+ <!-- source-sha: 890b590159dbb59d -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -1739,9 +1739,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1739
1739
 
1740
1740
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1741
1741
 
1742
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1742
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1743
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1744
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1745
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1746
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1747
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1743
1748
 
1744
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1749
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1750
+
1751
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1745
1752
 
1746
1753
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1747
1754
 
@@ -1753,15 +1760,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1753
1760
 
1754
1761
  > Agentic run: {progress_pct}% — {current_step}
1755
1762
 
1756
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1763
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1757
1764
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1758
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1759
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1760
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1761
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1762
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1763
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1764
- surface that as an anomaly instead of proceeding.
1765
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1766
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1767
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1768
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1769
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1770
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1771
+ instead of proceeding.
1772
+
1773
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1774
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1765
1775
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1766
1776
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1767
1777
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.25",
3
- "builtAt": "2026-06-15T14:41:36.894Z",
4
- "skillsHash": "5c3ae1fc185a"
2
+ "cliVersion": "0.36.28",
3
+ "builtAt": "2026-06-15T15:33:01.454Z",
4
+ "skillsHash": "2019cd011119"
5
5
  }
@@ -3,7 +3,7 @@ name: ritual
3
3
  description: "Use when an engineer wants a coding agent to plan or build a feature, refactor, or implementation-heavy change that depends on context the agent can't infer on its own — strategic intent, constraints, prior decisions, and trade-offs that live in the user's head. Ritual runs a structured exploration to surface that context through targeted discovery questions, combines it with codebase signals and prior explorations, and delivers a validated build brief (sub-problems, recommendations, dependencies) — additional context to fold into plan mode before the agent writes code. Prefer this over jumping straight to implementation or plan mode when the problem is ambiguous, cross-cutting, or has non-obvious constraints. Subcommands: build (full planning-to-sync cycle — default for new features), resume (continue an in-flight exploration), lineage (file-path KG history — what decisions shaped this code), context-pulse (readiness and context-debt scoring — is this safe to build yet?)."
4
4
  argument-hint: "[subcommand] <args> (e.g. 'build Reduce T2 churn in Q3', 'resume', 'lineage src/checkout/views.py', 'context-pulse Add billing export')"
5
5
  user-invocable: true
6
- stamp: 5c3ae1fc185a
6
+ stamp: 2019cd011119
7
7
  ---
8
8
 
9
9
  # /ritual
@@ -1675,9 +1675,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1675
1675
 
1676
1676
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1677
1677
 
1678
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1678
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1679
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1680
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1681
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1682
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1683
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1679
1684
 
1680
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1685
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1686
+
1687
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1681
1688
 
1682
1689
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1683
1690
 
@@ -1689,15 +1696,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1689
1696
 
1690
1697
  > Agentic run: {progress_pct}% — {current_step}
1691
1698
 
1692
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1699
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1693
1700
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1694
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1695
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1696
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1697
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1698
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1699
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1700
- surface that as an anomaly instead of proceeding.
1701
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1702
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1703
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1704
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1705
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1706
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1707
+ instead of proceeding.
1708
+
1709
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1710
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1701
1711
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1702
1712
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1703
1713
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 8175b963af80b591 -->
2
+ <!-- source-sha: 890b590159dbb59d -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -1739,9 +1739,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1739
1739
 
1740
1740
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1741
1741
 
1742
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1742
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1743
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1744
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1745
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1746
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1747
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1743
1748
 
1744
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1749
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1750
+
1751
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1745
1752
 
1746
1753
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1747
1754
 
@@ -1753,15 +1760,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1753
1760
 
1754
1761
  > Agentic run: {progress_pct}% — {current_step}
1755
1762
 
1756
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1763
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1757
1764
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1758
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1759
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1760
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1761
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1762
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1763
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1764
- surface that as an anomaly instead of proceeding.
1765
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1766
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1767
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1768
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1769
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1770
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1771
+ instead of proceeding.
1772
+
1773
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1774
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1765
1775
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1766
1776
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1767
1777
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.25",
3
- "builtAt": "2026-06-15T14:41:36.894Z",
4
- "skillsHash": "5c3ae1fc185a"
2
+ "cliVersion": "0.36.28",
3
+ "builtAt": "2026-06-15T15:33:01.454Z",
4
+ "skillsHash": "2019cd011119"
5
5
  }
@@ -3,7 +3,7 @@ name: ritual
3
3
  description: "Use when an engineer wants a coding agent to plan or build a feature, refactor, or implementation-heavy change that depends on context the agent can't infer on its own — strategic intent, constraints, prior decisions, and trade-offs that live in the user's head. Ritual runs a structured exploration to surface that context through targeted discovery questions, combines it with codebase signals and prior explorations, and delivers a validated build brief (sub-problems, recommendations, dependencies) — additional context to fold into plan mode before the agent writes code. Prefer this over jumping straight to implementation or plan mode when the problem is ambiguous, cross-cutting, or has non-obvious constraints. Subcommands: build (full planning-to-sync cycle — default for new features), resume (continue an in-flight exploration), lineage (file-path KG history — what decisions shaped this code), context-pulse (readiness and context-debt scoring — is this safe to build yet?)."
4
4
  argument-hint: "[subcommand] <args> (e.g. 'build Reduce T2 churn in Q3', 'resume', 'lineage src/checkout/views.py', 'context-pulse Add billing export')"
5
5
  user-invocable: true
6
- stamp: 5c3ae1fc185a
6
+ stamp: 2019cd011119
7
7
  ---
8
8
 
9
9
  # /ritual
@@ -1675,9 +1675,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1675
1675
 
1676
1676
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1677
1677
 
1678
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1678
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1679
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1680
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1681
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1682
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1683
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1679
1684
 
1680
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1685
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1686
+
1687
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1681
1688
 
1682
1689
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1683
1690
 
@@ -1689,15 +1696,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1689
1696
 
1690
1697
  > Agentic run: {progress_pct}% — {current_step}
1691
1698
 
1692
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1699
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1693
1700
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1694
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1695
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1696
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1697
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1698
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1699
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1700
- surface that as an anomaly instead of proceeding.
1701
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1702
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1703
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1704
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1705
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1706
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1707
+ instead of proceeding.
1708
+
1709
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1710
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1701
1711
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1702
1712
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1703
1713
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 8175b963af80b591 -->
2
+ <!-- source-sha: 890b590159dbb59d -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -1739,9 +1739,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1739
1739
 
1740
1740
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1741
1741
 
1742
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1742
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1743
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1744
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1745
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1746
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1747
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1743
1748
 
1744
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1749
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1750
+
1751
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1745
1752
 
1746
1753
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1747
1754
 
@@ -1753,15 +1760,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1753
1760
 
1754
1761
  > Agentic run: {progress_pct}% — {current_step}
1755
1762
 
1756
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1763
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1757
1764
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1758
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1759
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1760
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1761
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1762
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1763
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1764
- surface that as an anomaly instead of proceeding.
1765
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1766
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1767
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1768
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1769
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1770
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1771
+ instead of proceeding.
1772
+
1773
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1774
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1765
1775
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1766
1776
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1767
1777
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.25",
3
- "builtAt": "2026-06-15T14:41:36.894Z",
4
- "skillsHash": "5c3ae1fc185a"
2
+ "cliVersion": "0.36.28",
3
+ "builtAt": "2026-06-15T15:33:01.454Z",
4
+ "skillsHash": "2019cd011119"
5
5
  }
@@ -3,7 +3,7 @@ name: ritual
3
3
  description: "Use when an engineer wants a coding agent to plan or build a feature, refactor, or implementation-heavy change that depends on context the agent can't infer on its own — strategic intent, constraints, prior decisions, and trade-offs that live in the user's head. Ritual runs a structured exploration to surface that context through targeted discovery questions, combines it with codebase signals and prior explorations, and delivers a validated build brief (sub-problems, recommendations, dependencies) — additional context to fold into plan mode before the agent writes code. Prefer this over jumping straight to implementation or plan mode when the problem is ambiguous, cross-cutting, or has non-obvious constraints. Subcommands: build (full planning-to-sync cycle — default for new features), resume (continue an in-flight exploration), lineage (file-path KG history — what decisions shaped this code), context-pulse (readiness and context-debt scoring — is this safe to build yet?)."
4
4
  argument-hint: "[subcommand] <args> (e.g. 'build Reduce T2 churn in Q3', 'resume', 'lineage src/checkout/views.py', 'context-pulse Add billing export')"
5
5
  user-invocable: true
6
- stamp: 5c3ae1fc185a
6
+ stamp: 2019cd011119
7
7
  ---
8
8
 
9
9
  # /ritual
@@ -1675,9 +1675,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1675
1675
 
1676
1676
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1677
1677
 
1678
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1678
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1679
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1680
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1681
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1682
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1683
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1679
1684
 
1680
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1685
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1686
+
1687
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1681
1688
 
1682
1689
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1683
1690
 
@@ -1689,15 +1696,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1689
1696
 
1690
1697
  > Agentic run: {progress_pct}% — {current_step}
1691
1698
 
1692
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1699
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1693
1700
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1694
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1695
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1696
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1697
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1698
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1699
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1700
- surface that as an anomaly instead of proceeding.
1701
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1702
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1703
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1704
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1705
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1706
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1707
+ instead of proceeding.
1708
+
1709
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1710
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1701
1711
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1702
1712
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1703
1713
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 8175b963af80b591 -->
2
+ <!-- source-sha: 890b590159dbb59d -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -1739,9 +1739,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1739
1739
 
1740
1740
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1741
1741
 
1742
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1742
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1743
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1744
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1745
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1746
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1747
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1743
1748
 
1744
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1749
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1750
+
1751
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1745
1752
 
1746
1753
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1747
1754
 
@@ -1753,15 +1760,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1753
1760
 
1754
1761
  > Agentic run: {progress_pct}% — {current_step}
1755
1762
 
1756
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1763
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1757
1764
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1758
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1759
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1760
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1761
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1762
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1763
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1764
- surface that as an anomaly instead of proceeding.
1765
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1766
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1767
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1768
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1769
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1770
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1771
+ instead of proceeding.
1772
+
1773
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1774
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1765
1775
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1766
1776
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1767
1777
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.25",
3
- "builtAt": "2026-06-15T14:41:36.894Z",
4
- "skillsHash": "5c3ae1fc185a"
2
+ "cliVersion": "0.36.28",
3
+ "builtAt": "2026-06-15T15:33:01.454Z",
4
+ "skillsHash": "2019cd011119"
5
5
  }
@@ -3,7 +3,7 @@ name: ritual
3
3
  description: "Use when an engineer wants a coding agent to plan or build a feature, refactor, or implementation-heavy change that depends on context the agent can't infer on its own — strategic intent, constraints, prior decisions, and trade-offs that live in the user's head. Ritual runs a structured exploration to surface that context through targeted discovery questions, combines it with codebase signals and prior explorations, and delivers a validated build brief (sub-problems, recommendations, dependencies) — additional context to fold into plan mode before the agent writes code. Prefer this over jumping straight to implementation or plan mode when the problem is ambiguous, cross-cutting, or has non-obvious constraints. Subcommands: build (full planning-to-sync cycle — default for new features), resume (continue an in-flight exploration), lineage (file-path KG history — what decisions shaped this code), context-pulse (readiness and context-debt scoring — is this safe to build yet?)."
4
4
  argument-hint: "[subcommand] <args> (e.g. 'build Reduce T2 churn in Q3', 'resume', 'lineage src/checkout/views.py', 'context-pulse Add billing export')"
5
5
  user-invocable: true
6
- stamp: 5c3ae1fc185a
6
+ stamp: 2019cd011119
7
7
  ---
8
8
 
9
9
  # /ritual
@@ -1675,9 +1675,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1675
1675
 
1676
1676
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1677
1677
 
1678
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1678
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1679
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1680
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1681
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1682
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1683
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1679
1684
 
1680
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1685
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1686
+
1687
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1681
1688
 
1682
1689
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1683
1690
 
@@ -1689,15 +1696,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1689
1696
 
1690
1697
  > Agentic run: {progress_pct}% — {current_step}
1691
1698
 
1692
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1699
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1693
1700
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1694
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1695
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1696
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1697
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1698
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1699
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1700
- surface that as an anomaly instead of proceeding.
1701
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1702
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1703
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1704
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1705
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1706
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1707
+ instead of proceeding.
1708
+
1709
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1710
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1701
1711
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1702
1712
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1703
1713
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 8175b963af80b591 -->
2
+ <!-- source-sha: 890b590159dbb59d -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -1739,9 +1739,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1739
1739
 
1740
1740
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1741
1741
 
1742
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1742
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1743
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1744
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1745
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1746
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1747
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1743
1748
 
1744
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1749
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1750
+
1751
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1745
1752
 
1746
1753
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1747
1754
 
@@ -1753,15 +1760,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1753
1760
 
1754
1761
  > Agentic run: {progress_pct}% — {current_step}
1755
1762
 
1756
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1763
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1757
1764
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1758
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1759
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1760
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1761
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1762
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1763
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1764
- surface that as an anomaly instead of proceeding.
1765
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1766
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1767
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1768
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1769
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1770
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1771
+ instead of proceeding.
1772
+
1773
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1774
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1765
1775
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1766
1776
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1767
1777
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  {
2
- "cliVersion": "0.36.25",
3
- "builtAt": "2026-06-15T14:41:36.894Z",
4
- "skillsHash": "5c3ae1fc185a"
2
+ "cliVersion": "0.36.28",
3
+ "builtAt": "2026-06-15T15:33:01.454Z",
4
+ "skillsHash": "2019cd011119"
5
5
  }
@@ -3,7 +3,7 @@ name: ritual
3
3
  description: "Use when an engineer wants a coding agent to plan or build a feature, refactor, or implementation-heavy change that depends on context the agent can't infer on its own — strategic intent, constraints, prior decisions, and trade-offs that live in the user's head. Ritual runs a structured exploration to surface that context through targeted discovery questions, combines it with codebase signals and prior explorations, and delivers a validated build brief (sub-problems, recommendations, dependencies) — additional context to fold into plan mode before the agent writes code. Prefer this over jumping straight to implementation or plan mode when the problem is ambiguous, cross-cutting, or has non-obvious constraints. Subcommands: build (full planning-to-sync cycle — default for new features), resume (continue an in-flight exploration), lineage (file-path KG history — what decisions shaped this code), context-pulse (readiness and context-debt scoring — is this safe to build yet?)."
4
4
  argument-hint: "[subcommand] <args> (e.g. 'build Reduce T2 churn in Q3', 'resume', 'lineage src/checkout/views.py', 'context-pulse Add billing export')"
5
5
  user-invocable: true
6
- stamp: 5c3ae1fc185a
6
+ stamp: 2019cd011119
7
7
  ---
8
8
 
9
9
  # /ritual
@@ -1675,9 +1675,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1675
1675
 
1676
1676
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1677
1677
 
1678
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1678
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1679
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1680
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1681
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1682
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1683
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1679
1684
 
1680
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1685
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1686
+
1687
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1681
1688
 
1682
1689
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1683
1690
 
@@ -1689,15 +1696,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1689
1696
 
1690
1697
  > Agentic run: {progress_pct}% — {current_step}
1691
1698
 
1692
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1699
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1693
1700
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1694
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1695
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1696
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1697
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1698
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1699
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1700
- surface that as an anomaly instead of proceeding.
1701
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1702
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1703
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1704
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1705
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1706
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1707
+ instead of proceeding.
1708
+
1709
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1710
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1701
1711
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1702
1712
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1703
1713
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.
@@ -1,5 +1,5 @@
1
1
  <!-- GENERATED from references/build-flow.md by apps/cli/scripts/generate-lite-flow.js — DO NOT EDIT. -->
2
- <!-- source-sha: 8175b963af80b591 -->
2
+ <!-- source-sha: 890b590159dbb59d -->
3
3
 
4
4
  # /ritual lite — fast build (generated; do not edit)
5
5
 
@@ -1739,9 +1739,16 @@ Pick whichever fits the user's flow — they're equivalent in content. Do not in
1739
1739
 
1740
1740
  <!-- skill-options:no-gate-change: adds a convergence note at the top of the rec-wait — both answerers (local coding agent vs Ritual server) poll get_recommendations_preview until ≥1 rec; the only difference is who produced the answers. No new pause gate or Step header; the run/pause gate + its options are unchanged. -->
1741
1741
 
1742
- **Both answerers converge here — once the run is underway, poll until recommendations exist.** The job from this point on is the SAME regardless of who produced the answers: poll `mcp__ritual__get_recommendations_preview(exploration_id)` until it returns **at least one recommendation**, then continue to Step 9. The *only* difference between the two paths is the **answerer** — the **local coding agent** (you, when repo-linked) vs **Ritual's server agentic run** — and that only changes how you reach this wait (agent-answered → straight to the rec poll; server → poll the run to `COMPLETED` first, then the recs). Never render the Step 9 landing, and never call `accept_recommendations`, from a zero-rec read.
1742
+ <!-- skill-options:no-gate-change: Step 8.1 rec-wait polls get_exploration_status.recommendationsStatus (not_started|generating|ready|empty|failed); on `failed` it offers retry_recommendations (re-enqueues rec-gen only). Render-only signal + an offered action, no pause/option/Step-header change. -->
1743
+ **Both answerers converge here — once the run is underway, poll until recommendations are READY.** The job from this point on is the SAME regardless of who produced the answers. **Poll the authoritative signal: `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus`.** It removes the guesswork that bit us before — it is unambiguous:
1744
+ - `not_started` / `generating` → **keep polling.** A zero `recommendationCount` here is NORMAL — generation is enqueued/in flight, NEVER a "miss." (Older servers may omit the field; if `recommendationsStatus` is absent, fall back to polling `get_recommendations_preview` until ≥1.)
1745
+ - `ready` → recommendations exist. Fetch them (`get_recommendations_preview`) and continue to Step 9.
1746
+ - `empty` → generation FINISHED with genuinely zero recs (rare, real terminal state). Surface it plainly — do NOT render a fake Step 9 landing, do NOT re-run.
1747
+ - `failed` → generation exhausted its auto-retries (terminal). Surface it with the one-line `recommendationsError` if present, and **offer to retry** — on a `yes`, call `mcp__ritual__retry_recommendations(exploration_id)` (re-enqueues ONLY rec-gen on the existing answers; status returns to `generating`, resume polling). Do NOT call `start_agentic_run` (that re-answers the whole exploration) and do NOT auto-retry without asking.
1743
1748
 
1744
- **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll go straight to the recommendation wait: poll `mcp__ritual__get_recommendations_preview(exploration_id)` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it returns **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing and never call `accept_recommendations` from a zero-rec read; if 10+ min pass with zero rows, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1749
+ The *only* difference between the two answerer paths — **local coding agent** (you, repo-linked) vs **Ritual's server agentic run**is how you reach this wait (agent-answered straight to the status poll; server poll the run to `COMPLETED` first, then the status). Never render the Step 9 landing, and never call `accept_recommendations`, from anything but `ready`.
1750
+
1751
+ **Agent-answered path (default):** you already wrote + `submit_all_answers`'d, so there's no agentic run to poll — go straight to the recommendation wait: poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` (`Bash sleep 20` per iteration, a "still generating recommendations…" line every ~3 polls) until it reads `ready`, then fetch + continue to Step 9. `generating` → keep polling; `empty` → genuine zero-rec terminal; NEVER render the Step 9 landing or call `accept_recommendations` from anything but `ready`; if 10+ min pass still `generating`, surface it as an anomaly. (Skip the `get_agentic_run` polling below — that's the server-fallback path.)
1745
1752
 
1746
1753
  **Server fallback path** (you called `start_agentic_run`): poll `mcp__ritual__get_agentic_run(run_id)` using `references/async-polling.md`: **`Bash sleep 20` (constant 20 — matches Spark's 20s agentic cadence; never escalate)** per iteration, then a fresh status call. Even if the run takes 2+ minutes, the sleep value stays a constant 20; the harness blocks chained-shorter-sleeps-at-increasing-N just like it blocks `sleep ≥ 30`, but a fixed `20` is non-escalating and under 30 → guard-safe. Agentic runs CAN exceed 5 min for large explorations — if you see status still running past ~5 min of polling, switch to the `Monitor` + `until <check>; do sleep 2; done` pattern from `references/async-polling.md` § Long waits.
1747
1754
 
@@ -1753,15 +1760,18 @@ Then print progress only when `progress_pct` or `current_step` changes, or every
1753
1760
 
1754
1761
  > Agentic run: {progress_pct}% — {current_step}
1755
1762
 
1756
- When `status` is `COMPLETED`: **wait for recommendation ROWS before Step 9.** The run reporting
1763
+ When `status` is `COMPLETED`: **wait for `recommendationsStatus: ready` before Step 9.** The run reporting
1757
1764
  `completed` does NOT mean recommendations exist yet — rec generation is a separate queued job that
1758
- lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12:
1759
- an agent rendered "0 recommendations across 0 categories" and vacuously proceeded). Poll
1760
- `mcp__ritual__get_recommendations_preview(exploration_id)` on the standard cadence (`Bash sleep 20`
1761
- per iteration, "still generating recommendations…" line every ~3 polls) until the preview returns
1762
- **at least one recommendation**, then continue to Step 9. NEVER render the Step 9 landing — and
1763
- never call `accept_recommendations` — from a zero-rec read. If 10+ minutes pass with zero rows,
1764
- surface that as an anomaly instead of proceeding.
1765
+ lands MINUTES later (the 2026-06-05 premature-accept incident class; observed again live 2026-06-12
1766
+ and 2026-06-15). Poll `mcp__ritual__get_exploration_status(exploration_id).recommendationsStatus` on
1767
+ the standard cadence (`Bash sleep 20` per iteration, "still generating recommendations…" line every
1768
+ ~3 polls): `generating` keep polling; `ready` continue to Step 9; `empty` → genuine zero-rec
1769
+ terminal, surface it. NEVER render the Step 9 landing — and never call `accept_recommendations` —
1770
+ from anything but `ready`. If 10+ minutes pass still `generating`, surface that as an anomaly
1771
+ instead of proceeding.
1772
+
1773
+ <!-- skill-options:no-gate-change: Step 8.1 adds a load-bearing clause closing the "zero-rec = generation miss → re-run / reroute" loophole; tightens the existing wait-for-rows rule only — no pause, option, or Step header added or changed. -->
1774
+ **A zero-rec read is NEVER a "generation miss," and re-running is NOT a recovery (load-bearing).** The run reporting `completed` only means *answering* finished — recommendation synthesis is a SEPARATE async job that may still be in flight, so zero rows means **not yet**, never **failed**. Do NOT relabel it a "generation miss" / "the synthesizer came back empty" / "0 recommendations" and act on that: do NOT call `start_agentic_run` again to "regenerate" (the answers are already committed — a re-run re-answers the whole exploration from scratch, burns a full pipeline, and can double-generate), and do NOT propose "routing around" synthesis by building a plan from the raw discovery answers. Just keep polling `get_exploration_status.recommendationsStatus` until `ready` (or `empty` — the rare genuine terminal). The synthesizer is almost never the problem — being early in the async window (`generating`) is. The ONLY escalation, and only after the 10-min ceiling still `generating`, is to surface it as an anomaly and offer `/ritual status` or the web app — never an automatic re-run, never a reroute.
1765
1775
  When `status` is `COMPLETED_WITH_ERRORS`: tell the user, then apply the same wait-for-rows rule — partial recommendations may still be useful.
1766
1776
  When `status` is `FAILED`: surface the error message, ask if they want to retry (`start_agentic_run` again with same exploration_id) or stop.
1767
1777
  When `status` is `PAUSED_FOR_REVIEW` (product/design answer-review mode only): continue to Step 8.5.