feat(effort): wire phase shifts in the 13 orchestrators and the handover writer

This commit is contained in:
bastien
2026-09-28 19:44:22 +02:00
parent 4a450ea6bc
commit 3c58160d0c
15 changed files with 64 additions and 0 deletions
+2
View File
@@ -225,6 +225,7 @@ Store `DEPLOYED_URL` for STEP 7. If empty, ask user during STEP 6.
---
## STEP 3 — BASELINE AUDITS (parallel)
First: `Skill(effort-medium)` (effort-shift: dispatch span starts).
Goal: capture `SCORE_*_BEFORE` so the client doc shows the delta.
@@ -261,6 +262,7 @@ the gate.
this pipeline (initial audits, fix-loop re-dispatches, commit-change,
web-validate) carries `model: "fable"` — the child hosts gated orchestration
on the pipeline's behalf; it must never inherit the session model.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
For web projects, dispatch in **a single message with two parallel Agent calls** (each with `model: "fable"`):
+10
View File
@@ -63,6 +63,16 @@ has "lib/effort-shift.md" 'Skill(effort-max)'
has "lib/effort-shift.md" 'never inside a dispatched agent'
has "lib/model-gate.md" 'lib/effort-shift.md'
# ── 6) orchestrator wiring (spec D4)
for s in feat hotfix bugfix ship-feature init-project onboard tour code-clean seo geo harden web-validate audit-delta; do
has "skills/$s/SKILL.md" 'lib/effort-shift.md'; has "skills/$s/SKILL.md" 'Skill(effort-medium)'; done
has "agents/client-handover-writer.md" 'lib/effort-shift.md'; has "agents/client-handover-writer.md" 'Skill(effort-medium)'
for s in feat hotfix bugfix; do has "skills/$s/SKILL.md" 'Skill(effort-high)'; done
for s in ship-feature init-project onboard code-clean audit-delta; do has "skills/$s/SKILL.md" 'Skill(effort-xhigh)'; done
for s in seo geo harden web-validate; do has "skills/$s/SKILL.md" 'Skill(effort-high)'; done
for s in feat hotfix bugfix ship-feature init-project; do has "skills/$s/SKILL.md" 'Skill(effort-low)'; done
has "skills/feat/SKILL.md" 'effort-shift: nested commit-change'
# ── summary (later tasks insert their locks ABOVE this line)
printf 'effort-routing census: %d pass, %d fail\n' "$pass" "$fail"
[ "$fail" -eq 0 ]
+3
View File
@@ -29,6 +29,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
Audit only what changed since the last run, on the axes the user picks.
Per axis: **audit → approval gate → fix → re-verify → marker update**,
@@ -169,6 +170,7 @@ Then show the user the same compact table inline.
### 3b-bis. CHALLENGE THE PROPOSALS (before the gate)
`Skill(effort-xhigh)` first (effort-shift: reflection resumes).
This axis' findings + proposed fixes are a proposal set worth attacking before
the human gate. Persist THIS axis' finding list (not the whole append-only
report) to `.claude/tasks/plans/<date>-<axis>-<HHMM>.md`, then run
@@ -254,6 +256,7 @@ Then offer to capitalize (per CLAUDE.md): recurring finding patterns →
below on the same delta (the SAST is a deterministic floor, the reasoned
pass covers what grep/rules miss):
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="security-auditor", description="audit-delta security — semgrep SAST",
prompt="MODE: audit\nSCOPE: <delta file list>\nREPORT: .claude/audits/.audit-delta-semgrep.md\nFollow agents/security-auditor.md exactly. Pinned rulesets, no login. Write ONLY to REPORT. End with REPORT_WRITTEN: <path>.")
```
+5
View File
@@ -26,6 +26,7 @@ allowed-tools:
MODEL GATE (blocking): run `$HOME/.claude/lib/model-gate.md` BEFORE any
step below. Verdict `small` → STOP — print the gate's remedy, end the
turn, dispatch nothing.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
## REQUEST
$ARGUMENTS
@@ -123,6 +124,7 @@ RISK: <low/medium — what could go wrong>
bug report left open → one batch of questions, before STEP 3b. The trivial
fast-path is not exempt: a 1-line fix with a visible choice still asks.
`Skill(effort-high)` first (effort-shift: reflection resumes).
## STEP 3b — CHALLENGE THE FIX PLAN (before the contract)
Unless the fix is the trivial 1-2 line case STEP 3 already fast-paths, the
DIAGNOSIS + FIX PLAN is a reflection worth attacking before it hardens into a
@@ -157,6 +159,7 @@ branch it's a no-op (commit in place). Never `finish`.
Dispatch the executor — sonnet by frontmatter pin, do not override:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="bugfixer")
prompt: "CONTRACT: <path from STEP 3.5>
DIAGNOSIS: <ROOT CAUSE + EVIDENCE from STEP 3>
@@ -278,6 +281,8 @@ A bugfix with an understood root cause is almost always worth one entry:
If the bug was trivial and the root cause not transferable → skip with `CAPITALIZE: trivial, skip`.
`Skill(effort-low)` first (effort-shift: bookkeeping tail).
**Then commit the memory** — follow `$HOME/.claude/lib/capitalize-commit.md`: it
surgically commits what capitalize just wrote (`.claude/memory` + `.claude/tasks`
only, never `git add -A`) as one `chore(memory)` commit, reports the memory-commit
+3
View File
@@ -26,6 +26,7 @@ allowed-tools:
MODEL GATE (blocking): run `$HOME/.claude/lib/model-gate.md` BEFORE any
step below. Verdict `small` → STOP — print the gate's remedy, end the
turn, dispatch nothing.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
## TARGET
$ARGUMENTS
@@ -120,6 +121,7 @@ TOTALS: <N blocking, N warn, N info>
If no issues found: report clean state and stop.
`Skill(effort-xhigh)` first (effort-shift: reflection resumes).
## STEP 3b — CHALLENGE THE SCOPE (before approval)
The STEP 3 report is the proposed cleanup scope — worth attacking before the
human approves it. It is still inline, so FIRST persist it to
@@ -173,6 +175,7 @@ is approved, stop — no dispatch.
2. **Dispatch the executor** — sonnet by frontmatter pin, do not override:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="code-cleaner")
prompt: "SCOPE: .claude/audits/CODE-CLEAN-SCOPE.md
APPROVED: <the approved item list, incl. any per-item exported-symbol clears>
+6
View File
@@ -26,6 +26,7 @@ allowed-tools:
MODEL GATE (blocking): run `$HOME/.claude/lib/model-gate.md` BEFORE any
step below. Verdict `small` → STOP — print the gate's remedy, end the
turn, dispatch nothing.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
## REQUEST
$ARGUMENTS
@@ -122,6 +123,7 @@ request left open → one batch of questions BEFORE dispatching; answers land
in the contract's CLARIFICATIONS `[gated]` and in the plan. A choice that
surfaces only during execution comes back as `NEED-DECISION` (STEP 3).
`Skill(effort-high)` first (effort-shift: reflection resumes).
## STEP 1b — CHALLENGE THE PLAN (before branching)
The STEP 1 plan is a reflection worth attacking before a branch is spent on it.
Persist it to `.claude/tasks/plans/<date>-<slug>-<HHMM>.md`, then run
@@ -144,6 +146,7 @@ branch it's a no-op (commit in place). Never `finish`.
Dispatch the executor — sonnet by frontmatter pin, do not override:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="feater")
prompt: "CONTRACT: <path from STEP 0.7>
PLAN: <the STEP 1 checklist + approach bullets + edge cases, verbatim>
@@ -200,6 +203,7 @@ test), consider splitting into 2-3 atomic commits grouped by logical
unit — or run `/commit-change` on the pending work (it dispatches the
commit-changer (propose opus / apply sonnet, BDR-077); never inline-load the bare agent, it is now a
propose/apply executor).
Then `Skill(effort-high)` (effort-shift: nested commit-change loaded at low; reload feat's level).
Print summary:
```
@@ -250,6 +254,8 @@ Always append a 1-line entry to today's heading in `.claude/memory/journal.md`.
If no substantive capture candidate → skip with `CAPITALIZE: nothing to log`.
`Skill(effort-low)` first (effort-shift: bookkeeping tail).
**Then commit the memory** — follow `$HOME/.claude/lib/capitalize-commit.md`: it
surgically commits what capitalize just wrote (`.claude/memory` + `.claude/tasks`
only, never `git add -A`) as one `chore(memory)` commit, reports the memory-commit
+4
View File
@@ -29,6 +29,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
Dispatches the `geo-analyzer` subagent (audit + fix bundle), then applies
the bundle from THIS main loop at **L1** — same shape as `/web-validate`
@@ -46,6 +47,7 @@ every phase (LRN-126). Clean `.audit/geo-signals-<RUNID>.md` after apply.
**A — collect (sonnet):**
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="geo-analyzer", model="sonnet")
prompt: "MODE: collect
RUNID: <RUNID>
@@ -83,6 +85,7 @@ Do NOT apply any fix and do NOT dispatch any sub-agent — /geo applies
your bundle."
```
`Skill(effort-high)` first (effort-shift: reflection resumes).
## STEP 1b — CHALLENGE THE FIX BUNDLE (advisory, before apply)
The analyzer returned a `## FIX BUNDLE` — worth attacking before any edit lands.
**Skip if intervention mode = conservative** (nothing is applied). Else persist the
@@ -115,6 +118,7 @@ intent, not header wording: **AUTO** = no-confirmation items (G1–G4/G6);
For each AUTO item, dispatch its `applier` at L1, passing the item verbatim:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="hotfixer") # or "feater" per the item's applier
prompt: "<paste the bundle item: files, concern, current, expected,
framework note + shared-file discipline>.
+3
View File
@@ -29,6 +29,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
This skill orchestrates a narrow-scope hardening audit: TLS + security
headers + redirects + canonical + custom 404 + server configs. It
@@ -260,6 +261,7 @@ seo-analyzer will run in parallel.
Spawn a single seo-analyzer subagent with an explicit IN/OUT scope list.
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(
subagent_type="seo-analyzer",
description="harden — narrow-scope web hardening audit",
@@ -519,6 +521,7 @@ Extract the score and critical-alert count from `.claude/audits/HARDEN.md` for t
---
`Skill(effort-high)` first (effort-shift: reflection resumes).
## STEP 2b — CHALLENGE THE FIX BUNDLE (MODE=fix only, advisory)
Skip if MODE=audit (no bundle exists). Else, before the STEP 3 gate, harden the bundle:
extract the `## 8. Fix bundle` section from HARDEN.md to
+5
View File
@@ -24,6 +24,7 @@ allowed-tools:
MODEL GATE (blocking): run `$HOME/.claude/lib/model-gate.md` BEFORE any
step below. Verdict `small` → STOP — print the gate's remedy, end the
turn, dispatch nothing.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
## REQUEST
$ARGUMENTS
@@ -93,6 +94,7 @@ point. Run it ONLY when the settled fix touches control flow or behaviour — an
off-by-one, a wrong operator/variable, a behaviour-changing config value, or a
missing import that alters execution. In doubt → it is probably a `/bugfix`.
`Skill(effort-high)` first (effort-shift: reflection resumes).
For a logic fix: persist the STEP 1 located fix (root cause + the exact edit) to
`.claude/tasks/plans/<date>-<slug>-<HHMM>.md`, then run
`$HOME/.claude/lib/challenge-plan.md` with `PLAN` = that file, `KIND` =
@@ -136,6 +138,7 @@ mentioned: STOP and ask `"working tree dirty: stash and continue, or abort?"`.
Dispatch the executor — sonnet by frontmatter pin, do not override:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="hotfixer")
prompt: "CONTRACT: <path from STEP 1.7>
LOCATED: <file(s) found in STEP 1 + the confirmed root cause>
@@ -233,6 +236,8 @@ Always append a 1-line entry to today's heading in `.claude/memory/journal.md` (
**Language rule**: the journal line and any proposed BLK/LRN entries are ALWAYS written English AND caveman — fragments, articles dropped, code/IDs/quoted errors verbatim — per CLAUDE.md "Memory registries" (Always English, always caveman).
`Skill(effort-low)` first (effort-shift: bookkeeping tail).
**Then commit the memory** — follow `$HOME/.claude/lib/capitalize-commit.md`: it
surgically commits what capitalize just wrote (`.claude/memory` + `.claude/tasks`
only, never `git add -A`) as one `chore(memory)` commit, reports the memory-commit
+5
View File
@@ -14,6 +14,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
## REQUEST
$ARGUMENTS
@@ -183,6 +184,7 @@ implemented on a `feature/*` branch off `develop` (STEP 8).
Invoke `writing-plans` (vendored superpowers skill) with BRIEF + skeleton.
Granular tasks (2-5 min each), exact file paths, TDD: tests before code.
`Skill(effort-xhigh)` first (effort-shift: reflection resumes).
## STEP 6b — CHALLENGE THE PLAN (before the gate)
Before the human sees the implementation plan, harden it. Run
`$HOME/.claude/lib/challenge-plan.md` with `PLAN` = the plan STEP 6 wrote under
@@ -209,6 +211,7 @@ Approve and start? (yes / request changes)
Changes → back to STEP 6. Approved → continue.
## STEP 8 — IMPLEMENT
First: `Skill(effort-medium)` (effort-shift: dispatch span starts).
Start the MVP feature branch off develop, then implement on it:
```bash
bash "$HOME/.claude/lib/gitflow.sh" start feature mvp
@@ -311,6 +314,8 @@ articles dropped, code/IDs/quoted errors verbatim — per CLAUDE.md "Memory
registries" (Always English, always caveman). The gate may mirror the user's
language; entries must not.
`Skill(effort-low)` first (effort-shift: bookkeeping tail).
**Then commit the memory** — follow `$HOME/.claude/lib/capitalize-commit.md`: it
surgically commits the approved founding decisions (`.claude/memory` +
`.claude/tasks` only, never `git add -A`) as one `chore(memory)` commit, BEFORE
+3
View File
@@ -14,6 +14,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
## REQUEST
$ARGUMENTS
@@ -91,6 +92,7 @@ STOP. La réponse détermine si STEP 1 tourne une fois (A) ou N fois (C) ou avec
## STEP 2 — BASELINE CONFIG (onboarder agent)
`Skill(effort-medium)` first (effort-shift: dispatch span starts).
Dispatch `Agent(subagent_type="onboarder")` (pin sonnet — BDR-077 : config
templating = exécution, plus jamais inline sur le modèle de session). Un
BLOCAGE (clé manquante, CLAUDE.md existant) revient en rapport — l'agent ne
@@ -890,6 +892,7 @@ Vérifier que les 4 fichiers `.claude/audits/ONBOARD_REPORT.md`, `.claude/audits
---
`Skill(effort-xhigh)` first (effort-shift: reflection resumes).
## STEP 7b — CHALLENGE THE PROPOSALS (before the human gate)
The 4 audit files are on disk; `AUDIT_PROPOSALS.md` is the artifact worth
attacking before the human spends a gate on it. Run
+4
View File
@@ -30,6 +30,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
This skill orchestrates TWO specialist agents running in parallel, then
merges their output into a single `.claude/audits/SEO.md` report. It is the main
@@ -324,6 +325,7 @@ templating.
**PHASE A — collect (both domains, one message):**
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="seo-analyzer", model="sonnet")
prompt: """
MODE: collect
@@ -507,6 +509,7 @@ write GEO.md/SEO.md — /seo applies your bundle in STEP 1.5 and merges
the reports."
```
`Skill(effort-high)` first (effort-shift: reflection resumes).
## STEP 1b — CHALLENGE THE FIX BUNDLE (advisory, before apply)
Both envelopes now carry a `## FIX BUNDLE` — worth attacking before any edit lands.
**Skip if intervention mode = conservative** (nothing is applied). Else persist both
@@ -555,6 +558,7 @@ The two bundles may touch the same shared template (meta vs JSON-LD). Apply
For each AUTO item, dispatch its `applier` at L1, passing the item verbatim:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="hotfixer") # or "feater" per the item's applier
prompt: "<paste the bundle item: files, concern, current, expected,
framework note + shared-file discipline>.
+5
View File
@@ -14,6 +14,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
## REQUEST
$ARGUMENTS
@@ -123,6 +124,7 @@ every VISIBLE / PUBLIC NAME / SCOPE choice the plan settles that neither the
request nor the STEP 1 brainstorm settled (check the contract's CLARIFICATIONS
first) → one batch before STEP 2b; answers append to the contract `[gated]`.
`Skill(effort-xhigh)` first (effort-shift: reflection resumes).
## STEP 2b — CHALLENGE THE PLAN (adversarial, before the gate)
Before the human sees the plan, harden it. Run `$HOME/.claude/lib/challenge-plan.md`:
- `PLAN` = the plan STEP 2 wrote under `docs/superpowers/plans/`
@@ -170,6 +172,7 @@ judges the diff against this ENRICHED contract, not the STEP 0e seed — so a
criterion the design introduced is verified, not lost.
## STEP 4 — IMPLEMENT
First: `Skill(effort-medium)` (effort-shift: dispatch span starts).
Start the feature branch off develop, then implement on it:
```bash
bash "$HOME/.claude/lib/gitflow.sh" start feature <name>
@@ -268,6 +271,8 @@ Feature shipped implies at least one design decision worth capturing. Run this B
If nothing substantive to log → print `CAPITALIZE: nothing substantive to log` and skip.
`Skill(effort-low)` first (effort-shift: bookkeeping tail).
**Then commit the memory** — follow `$HOME/.claude/lib/capitalize-commit.md`: it
surgically commits what capitalize just wrote (`.claude/memory` + `.claude/tasks`
only, never `git add -A`) as one `chore(memory)` commit, reports the memory-commit
+2
View File
@@ -30,6 +30,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
One pipeline per project: **security → clean → re-verify → reconcile →
doc → convergence re-audit**, looping until a full pass applies zero new
@@ -86,6 +87,7 @@ Model discipline (the user-fixed invariant behind this mode):
Runner dispatch, one per project:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="general-purpose",
description="tour runner — <project basename>",
prompt="Read ~/.claude/skills/tour/SKILL.md and execute STEP 1 → STEP 3
+4
View File
@@ -28,6 +28,7 @@ Run `$HOME/.claude/lib/model-gate.md`. Reflection here (planning, audit
judgment, loop decisions) requires Fable/Opus. Verdict `small` → STOP: the
gate prints the remedy; end the turn — no later step, no dispatch. Nominal
(big) path is silent.
EFFORT SHIFTS: follow `$HOME/.claude/lib/effort-shift.md` (BDR-NEXT): medium when a dispatch span starts, own level before challenge synthesis, low at the bookkeeping tail, max at escalation.
This skill orchestrates a narrow-scope standards audit :
@@ -179,6 +180,7 @@ Spawn a single `validator-analyzer` subagent with explicit scope and
collected context :
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(
subagent_type="validator-analyzer",
description="validate — W3C HTML + CSS + WCAG audit",
@@ -252,6 +254,7 @@ grep -c '^### \[Critique\]' .claude/audits/VALIDATE.md
---
`Skill(effort-high)` first (effort-shift: reflection resumes).
## STEP 2b — CHALLENGE THE FIX BUNDLE (MODE=fix only, advisory)
Skip if MODE=audit (no bundle exists). Else, before the STEP 3 gate, harden the bundle:
extract the `## 5. Fix bundle` section from VALIDATE.md to
@@ -310,6 +313,7 @@ Options :
share files:
```
Skill(effort-medium) # effort-shift: dispatch span starts
Agent(subagent_type="hotfixer")
prompt: "<paste the file-group's bundle items: file, issue, current,
expected fix>.