From a0b7ee48fb25f02ee1e3a524df036fbe53164def Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Fri, 9 Oct 2026 01:42:46 -0400 Subject: [PATCH 1/5] feat(review): pilot one reviewer before a wide fan-out Before dispatching more than about 4 surfaces, /review:fanout dispatches one alone and confirms plan usage remains, so a usage limit cannot stop every reviewer at once mid-fan-out. Bumps review to 0.43.2. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VxGrZW26Qs1qeo3RFgmbvp --- plugins/review/.claude-plugin/plugin.json | 2 +- plugins/review/CHANGELOG.md | 6 ++++++ plugins/review/skills/fanout/SKILL.md | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/review/.claude-plugin/plugin.json b/plugins/review/.claude-plugin/plugin.json index dbd99499bf..8006de67d3 100644 --- a/plugins/review/.claude-plugin/plugin.json +++ b/plugins/review/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "review", - "version": "0.43.1", + "version": "0.43.2", "description": "Code-review toolkit: nine agents, read-only over the reviewed code, plus orchestration skills for the quality gate, fan-out, and enforceability audit (/review:audit-enforceability), a pull-request change digest with an interactive view (/review:explain-change), a fan-out sweep workflow (/review:fanout-sweep), and CI lane commands (/review:code-review, /review:security-review) for org reusable workflows.", "author": { "name": "Melodic Software", diff --git a/plugins/review/CHANGELOG.md b/plugins/review/CHANGELOG.md index 445b5e9b2a..a4a6d7e9b8 100644 --- a/plugins/review/CHANGELOG.md +++ b/plugins/review/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `review` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.43.2] - 2026-10-09 + +### Changed + +- **`/review:fanout` pilots one surface before a fan-out wider than about 4.** In either review mode it dispatches one surface alone and confirms plan usage remains before dispatching the rest, because a usage limit hit mid-fan-out stops every reviewer at once. Evidence: 3 fleet lockouts on one lane, about 8 hours lost. + ## [0.43.1] - 2026-10-07 ### Fixed diff --git a/plugins/review/skills/fanout/SKILL.md b/plugins/review/skills/fanout/SKILL.md index bf15ca9f49..c1d114504c 100644 --- a/plugins/review/skills/fanout/SKILL.md +++ b/plugins/review/skills/fanout/SKILL.md @@ -99,6 +99,8 @@ Otherwise resolve the review diff base ("Shared inputs") and confirm it yields a Either outcome spawns ZERO reviewers, a fan-out against an empty or wrong change set burns the whole roster to produce noise. The `fix` action is exempt: it consumes persisted findings and spawns no reviewers. +**Pilot a wide fan-out.** Before dispatching more than about 4 surfaces, in either review mode, dispatch one surface alone, wait for its return, and confirm plan usage remains (the return carries no usage-limit error, and any usage reading the session has shows room for the rest) before dispatching the others. A usage limit hit mid-fan-out stops every reviewer at once. + ## Step 1: Detect lifecycle tier (default mode) Read the pre-computed facts (the pre-flight gate above has already screened out unresolvable and empty change sets). Classify the change into a tier (thresholds + the judgment layer in [context/default-mode.md](context/default-mode.md)): From 989294fe2bab0cc584b839f7ae9956fed8017cb0 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Fri, 9 Oct 2026 08:56:35 -0400 Subject: [PATCH 2/5] fix(review): give run-everything mode a pilot path and point at the usage-limit rule Run-everything mode launches its whole roster in one Workflow call, so the pilot runs one slice on the main thread before the launch. The usage-limit consequence now points at the upstream section with an as-of date and recheck trigger instead of restating it. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VxGrZW26Qs1qeo3RFgmbvp --- plugins/review/CHANGELOG.md | 2 +- plugins/review/skills/fanout/SKILL.md | 6 +++++- plugins/review/skills/fanout/context/run-everything-mode.md | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/review/CHANGELOG.md b/plugins/review/CHANGELOG.md index a4a6d7e9b8..cee9c525cf 100644 --- a/plugins/review/CHANGELOG.md +++ b/plugins/review/CHANGELOG.md @@ -7,7 +7,7 @@ All notable changes to the `review` plugin are documented here. Format follows ### Changed -- **`/review:fanout` pilots one surface before a fan-out wider than about 4.** In either review mode it dispatches one surface alone and confirms plan usage remains before dispatching the rest, because a usage limit hit mid-fan-out stops every reviewer at once. Evidence: 3 fleet lockouts on one lane, about 8 hours lost. +- **`/review:fanout` pilots one surface before a fan-out wider than about 4.** In either review mode it dispatches one surface alone and confirms plan usage remains before dispatching the rest, because a usage limit reached mid-fan-out halts the rest of the roster. Run-everything mode pilots one slice on the main thread before the workflow launch, since the workflow dispatches its roster in one call. Evidence: 3 fleet lockouts on one lane, about 8 hours lost. ## [0.43.1] - 2026-10-07 diff --git a/plugins/review/skills/fanout/SKILL.md b/plugins/review/skills/fanout/SKILL.md index c1d114504c..1121b45e84 100644 --- a/plugins/review/skills/fanout/SKILL.md +++ b/plugins/review/skills/fanout/SKILL.md @@ -99,7 +99,11 @@ Otherwise resolve the review diff base ("Shared inputs") and confirm it yields a Either outcome spawns ZERO reviewers, a fan-out against an empty or wrong change set burns the whole roster to produce noise. The `fix` action is exempt: it consumes persisted findings and spawns no reviewers. -**Pilot a wide fan-out.** Before dispatching more than about 4 surfaces, in either review mode, dispatch one surface alone, wait for its return, and confirm plan usage remains (the return carries no usage-limit error, and any usage reading the session has shows room for the rest) before dispatching the others. A usage limit hit mid-fan-out stops every reviewer at once. +**Pilot a wide fan-out.** Before dispatching more than about 4 surfaces, in either review mode, dispatch one surface alone, wait for its return, and confirm plan usage remains (the return carries no usage-limit error, and any usage reading the session has shows room for the rest) before dispatching the others. In default mode the pilot is the first of the per-surface Agent-tool calls; in run-everything mode it is one slice run before the workflow launch ([context/run-everything-mode.md](context/run-everything-mode.md) step 5). Every surface draws on the same plan usage, so a limit reached mid-fan-out halts the rest of the roster; which runs wait for the reset and which fail is upstream's rule: + +- **Pointer**: [When a run hits your usage limit](https://code.claude.com/docs/en/workflows#when-a-run-hits-your-usage-limit) +- **As of**: 2026-10-09 +- **Recheck trigger**: that section changes which runs pause and which fail at a usage limit. ## Step 1: Detect lifecycle tier (default mode) diff --git a/plugins/review/skills/fanout/context/run-everything-mode.md b/plugins/review/skills/fanout/context/run-everything-mode.md index c58eb43a13..5114c4c212 100644 --- a/plugins/review/skills/fanout/context/run-everything-mode.md +++ b/plugins/review/skills/fanout/context/run-everything-mode.md @@ -12,6 +12,7 @@ Trigger: `$ARGUMENTS` is `run-everything` / `everything` / `all`. Distinct from 4. **Resolve the roster.** Run the discovery recipe in `leaf-roster.md` to get the slice list. 5. **Leaf fan-out.** If the gate failed, take the coverage-parity fallback. Otherwise: - **Roles.** When `/multi-agent:route` resolves in this session, invoke it as `/multi-agent:route all session=` and keep the `roles` object of the JSON it prints. When it does not resolve, omit `args.roles`, and say once in the report that enabling the multi-agent plugin makes this routing configurable; the workflow's built-in fallbacks then apply. When the reviewed change set touches the team layer (`docs/conventions/multi-agent.md` or `.claude/multi-agent.yaml`), also omit `args.roles` and say so in `## Surfaces`: the change under review must not choose the models that review it. + - **Pilot.** The workflow launches its whole roster in one call, so when `slices` is non-empty, pilot outside it (SKILL.md "Pilot a wide fan-out"): dispatch one slice alone on the main thread as `review:brief-reviewer`, with the slice prompt the workflow would send, and confirm usage remains. Then launch with that slice removed from `slices`, add its output to the orchestrator outputs for step 6's Stage 0, and list it in the `## Surfaces` `Ran` entry. - **Launch** `Workflow({ name: "review:fanout-sweep", args: { diffBase, slices, roles, maxConcurrent } })`: `diffBase` is the step-2 base, `slices` the step-4 slice names, `roles` the map above, and `maxConcurrent` an optional integer wave size (clamped to 1-16, default 4). - The workflow returns `diffBase`, `records`, `raw`, `nulls`, `ran` and `roles` (the variants it used). An `error` return (`missing-diff-base` or `bad-diff-base`, with a `next` hint) means nothing was dispatched: fix the input and launch again. 6. **Normalize main-thread.** Gather the Workflow's extracted leaf records + the raw orchestrator outputs; run Stage 0 on the orchestrator outputs (the Workflow only extracted the leaf branch), then Stages 1–4 of `findings-normalization.md` over the combined record set. Reconcile per surface against the Workflow's `raw` array: any surface whose raw output is non-empty but yielded zero extracted records gets Stage 0 re-run main-thread on that raw text; whatever still fails to parse goes verbatim into `## Unparsed`. Partial extraction never silently drops a surface. From 7533dd81db8805c63c21e2bed94b271f655318c7 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Fri, 9 Oct 2026 08:58:07 -0400 Subject: [PATCH 3/5] fix(review): point the Agent-tool pilot at the session usage-limit section Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VxGrZW26Qs1qeo3RFgmbvp --- plugins/review/skills/fanout/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/review/skills/fanout/SKILL.md b/plugins/review/skills/fanout/SKILL.md index 1121b45e84..de3e13a37e 100644 --- a/plugins/review/skills/fanout/SKILL.md +++ b/plugins/review/skills/fanout/SKILL.md @@ -101,9 +101,9 @@ Either outcome spawns ZERO reviewers, a fan-out against an empty or wrong change **Pilot a wide fan-out.** Before dispatching more than about 4 surfaces, in either review mode, dispatch one surface alone, wait for its return, and confirm plan usage remains (the return carries no usage-limit error, and any usage reading the session has shows room for the rest) before dispatching the others. In default mode the pilot is the first of the per-surface Agent-tool calls; in run-everything mode it is one slice run before the workflow launch ([context/run-everything-mode.md](context/run-everything-mode.md) step 5). Every surface draws on the same plan usage, so a limit reached mid-fan-out halts the rest of the roster; which runs wait for the reset and which fail is upstream's rule: -- **Pointer**: [When a run hits your usage limit](https://code.claude.com/docs/en/workflows#when-a-run-hits-your-usage-limit) +- **Pointer**: Agent-tool surfaces, [Wait for a usage limit to reset](https://code.claude.com/docs/en/interactive-mode#wait-for-a-usage-limit-to-reset); workflow leaves, [When a run hits your usage limit](https://code.claude.com/docs/en/workflows#when-a-run-hits-your-usage-limit) - **As of**: 2026-10-09 -- **Recheck trigger**: that section changes which runs pause and which fail at a usage limit. +- **Recheck trigger**: either section changes which sessions or runs wait and which stop or fail at a usage limit. ## Step 1: Detect lifecycle tier (default mode) From 24309ccae7f86fc7bb3fa72e9611e2ea18cc7a9f Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Fri, 9 Oct 2026 09:09:24 -0400 Subject: [PATCH 4/5] fix(review): state only the pilot decision and leave limit behavior to the pointer Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VxGrZW26Qs1qeo3RFgmbvp --- plugins/review/skills/fanout/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/review/skills/fanout/SKILL.md b/plugins/review/skills/fanout/SKILL.md index de3e13a37e..1a078efc91 100644 --- a/plugins/review/skills/fanout/SKILL.md +++ b/plugins/review/skills/fanout/SKILL.md @@ -99,7 +99,7 @@ Otherwise resolve the review diff base ("Shared inputs") and confirm it yields a Either outcome spawns ZERO reviewers, a fan-out against an empty or wrong change set burns the whole roster to produce noise. The `fix` action is exempt: it consumes persisted findings and spawns no reviewers. -**Pilot a wide fan-out.** Before dispatching more than about 4 surfaces, in either review mode, dispatch one surface alone, wait for its return, and confirm plan usage remains (the return carries no usage-limit error, and any usage reading the session has shows room for the rest) before dispatching the others. In default mode the pilot is the first of the per-surface Agent-tool calls; in run-everything mode it is one slice run before the workflow launch ([context/run-everything-mode.md](context/run-everything-mode.md) step 5). Every surface draws on the same plan usage, so a limit reached mid-fan-out halts the rest of the roster; which runs wait for the reset and which fail is upstream's rule: +**Pilot a wide fan-out.** Before dispatching more than about 4 surfaces, in either review mode, dispatch one surface alone, wait for its return, and confirm plan usage remains (the return carries no usage-limit error, and any usage reading the session has shows room for the rest) before dispatching the others. In default mode the pilot is the first of the per-surface Agent-tool calls; in run-everything mode it is one slice run before the workflow launch ([context/run-everything-mode.md](context/run-everything-mode.md) step 5). What a session, its agents and a workflow run do at a usage limit is upstream's rule: - **Pointer**: Agent-tool surfaces, [Wait for a usage limit to reset](https://code.claude.com/docs/en/interactive-mode#wait-for-a-usage-limit-to-reset); workflow leaves, [When a run hits your usage limit](https://code.claude.com/docs/en/workflows#when-a-run-hits-your-usage-limit) - **As of**: 2026-10-09 From 33070573ff7b69f660685765bfb9b1bc01d51ad9 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Fri, 9 Oct 2026 09:36:21 -0400 Subject: [PATCH 5/5] chore(review): convert the hand bump to a changelog fragment Main moved review to changelog-fragment mode, so the 0.43.2 bump and CHANGELOG entry become .changes/review/feat-review-fanout-pilot-412a3560.md and the release PR sets the version. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VxGrZW26Qs1qeo3RFgmbvp --- .changes/review/feat-review-fanout-pilot-412a3560.md | 7 +++++++ plugins/review/.claude-plugin/plugin.json | 2 +- plugins/review/CHANGELOG.md | 6 ------ 3 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 .changes/review/feat-review-fanout-pilot-412a3560.md diff --git a/.changes/review/feat-review-fanout-pilot-412a3560.md b/.changes/review/feat-review-fanout-pilot-412a3560.md new file mode 100644 index 0000000000..420ea66ebb --- /dev/null +++ b/.changes/review/feat-review-fanout-pilot-412a3560.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- **`/review:fanout` pilots one surface before a fan-out wider than about 4.** In either review mode it dispatches one surface alone and confirms plan usage remains before dispatching the rest, because a usage limit reached mid-fan-out halts the rest of the roster. Run-everything mode pilots one slice on the main thread before the workflow launch, since the workflow dispatches its roster in one call. Evidence: 3 fleet lockouts on one lane, about 8 hours lost. diff --git a/plugins/review/.claude-plugin/plugin.json b/plugins/review/.claude-plugin/plugin.json index 8006de67d3..dbd99499bf 100644 --- a/plugins/review/.claude-plugin/plugin.json +++ b/plugins/review/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "review", - "version": "0.43.2", + "version": "0.43.1", "description": "Code-review toolkit: nine agents, read-only over the reviewed code, plus orchestration skills for the quality gate, fan-out, and enforceability audit (/review:audit-enforceability), a pull-request change digest with an interactive view (/review:explain-change), a fan-out sweep workflow (/review:fanout-sweep), and CI lane commands (/review:code-review, /review:security-review) for org reusable workflows.", "author": { "name": "Melodic Software", diff --git a/plugins/review/CHANGELOG.md b/plugins/review/CHANGELOG.md index cee9c525cf..445b5e9b2a 100644 --- a/plugins/review/CHANGELOG.md +++ b/plugins/review/CHANGELOG.md @@ -3,12 +3,6 @@ All notable changes to the `review` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. -## [0.43.2] - 2026-10-09 - -### Changed - -- **`/review:fanout` pilots one surface before a fan-out wider than about 4.** In either review mode it dispatches one surface alone and confirms plan usage remains before dispatching the rest, because a usage limit reached mid-fan-out halts the rest of the roster. Run-everything mode pilots one slice on the main thread before the workflow launch, since the workflow dispatches its roster in one call. Evidence: 3 fleet lockouts on one lane, about 8 hours lost. - ## [0.43.1] - 2026-10-07 ### Fixed