Fix Pool — findings→fixes pooler
One coordinator session + N human testing slots produce a stream of freshly-filed
issues. This skill turns the coordinator into the drain: poll → triage → dispatch
→ report, on a loop, with hard throttles. Capture stays with the testers (they
have the context); pickup is centralized here (dedup + sequencing live in one
place).
Invocation
/fix-pool arm [--interval 10m] [--max-agents 3] [--since <ISO|now>]
/fix-pool status
/fix-pool drain # stop polling; let in-flight fix agents finish
Resolve config first
Read the task-manager adapter per _shared/adapters/{tracker.kind}.md (resolved
from .claude/project.yml / project-context). All issue reads/links go through
the adapter — never a hardcoded API. State file: .claude/.fix-pool-state.json
(last_poll_iso, seen_ids[], dispatched{id→agent,pr}, held[]). Not
committed.
Arm (the loop)
On arm, record the baseline timestamp (--since, default now) and start a
polling cycle every --interval (default 10m) using the session's
wake/scheduling mechanism (background monitor or ScheduleWakeup — whatever the
harness provides; never a foreground sleep).
Each cycle:
Poll — adapter: issues created since last_poll_iso in the configured
team/project (include tester-session-filed and manually-filed; exclude issues
this session created itself unless labeled for the pool). Self-filter is
mandatory in the poll query or first triage step — the hub files tickets
too, and without it the pool re-triages its own output (observed live,
2026-07-17). Track hub-created ids in the state file and drop them on sight.
Also drop issues whose domain an ACTIVE sibling workstream owns (e.g. a
migration terminal's own ledger ticket) — that's a HOLD with a named owner,
not a dispatch.
Triage each new issue (read title+body, check seen_ids):
| Verdict |
Criteria |
Action |
AUTO-FIX |
Clear repro + scope is test-only, docs, or a small UI/logic fix; no schema, no auth/security semantics, no design decision |
Dispatch a fix agent (worktree, own branch, PR to the integration branch, never merges) |
INVESTIGATE |
Real defect, root cause unclear |
Dispatch an investigate agent: repro + root cause + proposed fix posted as an issue comment; fix only if the cause turns out AUTO-FIX-class |
HOLD |
Schema/migration, security posture, product/design decision, or anything one-way-door |
Add to held[]; surface in the next report; never auto-built |
DUP |
Matches an open issue/known finding |
Link via adapter comment; no work |
Throttle — at most --max-agents fix/investigate agents in flight
(check TaskList); excess stays queued in order. New dispatches only as slots
free.
Report — one short message per cycle only when something changed:
new findings by verdict, dispatches started, PRs ready, held items. Silent
cycles stay silent.
Hard rules
- PR-only. Pool agents never merge. Merges/deploys happen at operator break
points — a deploy mid-test invalidates the testers' ground truth.
- No schema pushes, ever. Migration-class findings are always
HOLD.
- Surface mutex. Never dispatch a fix touching a surface an active testing
slot is walking (the operator names the active surfaces at arm time, or the
walkthrough epics define them); queue until that slot completes.
- Dedup before dispatch. Two findings, one root cause → one agent, both
issues linked.
- Honest triage beats fast triage. If AUTO-FIX vs HOLD is unclear, it's
HOLD. A wrong auto-fix during a test session poisons two things at once.
Drain
drain: stop the poll loop, let in-flight agents finish and open their PRs,
emit a final consolidated report: all findings routed, PRs awaiting merge,
held items needing operator rulings. The pool is not drained until every
finding has a disposition.
1---2name: fix-pool3description: Findings→fixes pooler for a coordinator session. Polls the task manager for new issues (walkthrough/tester-filed or manual), triages each (auto-fix / investigate / hold-for-operator / duplicate), and dispatches throttled background fix agents that stop at PR. Use when a build-hub session runs alongside human testing slots and new findings should flow into the builder workflow without the operator relaying them. Arm with `/fix-pool arm`, check `/fix-pool status`, stop with `/fix-pool drain`.4---56# Fix Pool — findings→fixes pooler78One coordinator session + N human testing slots produce a stream of freshly-filed9issues. This skill turns the coordinator into the drain: poll → triage → dispatch10→ report, on a loop, with hard throttles. Capture stays with the testers (they11have the context); pickup is centralized here (dedup + sequencing live in one12place).1314## Invocation1516```17/fix-pool arm [--interval 10m] [--max-agents 3] [--since <ISO|now>]18/fix-pool status19/fix-pool drain # stop polling; let in-flight fix agents finish20```2122## Resolve config first2324Read the task-manager adapter per `_shared/adapters/{tracker.kind}.md` (resolved25from `.claude/project.yml` / project-context). All issue reads/links go through26the adapter — never a hardcoded API. State file: `.claude/.fix-pool-state.json`27(`last_poll_iso`, `seen_ids[]`, `dispatched{id→agent,pr}`, `held[]`). Not28committed.2930## Arm (the loop)3132On `arm`, record the baseline timestamp (`--since`, default now) and start a33polling cycle every `--interval` (default 10m) using the session's34wake/scheduling mechanism (background monitor or ScheduleWakeup — whatever the35harness provides; never a foreground sleep).3637Each cycle:38391. **Poll** — adapter: issues created since `last_poll_iso` in the configured40 team/project (include tester-session-filed and manually-filed; exclude issues41 this session created itself unless labeled for the pool). **Self-filter is42 mandatory in the poll query or first triage step** — the hub files tickets43 too, and without it the pool re-triages its own output (observed live,44 2026-07-17). Track hub-created ids in the state file and drop them on sight.45 Also drop issues whose domain an ACTIVE sibling workstream owns (e.g. a46 migration terminal's own ledger ticket) — that's a HOLD with a named owner,47 not a dispatch.482. **Triage each new issue** (read title+body, check `seen_ids`):4950 | Verdict | Criteria | Action |51 |---|---|---|52 | `AUTO-FIX` | Clear repro + scope is test-only, docs, or a small UI/logic fix; no schema, no auth/security semantics, no design decision | Dispatch a fix agent (worktree, own branch, PR to the integration branch, **never merges**) |53 | `INVESTIGATE` | Real defect, root cause unclear | Dispatch an investigate agent: repro + root cause + proposed fix posted as an issue comment; fix only if the cause turns out AUTO-FIX-class |54 | `HOLD` | Schema/migration, security posture, product/design decision, or anything one-way-door | Add to `held[]`; surface in the next report; never auto-built |55 | `DUP` | Matches an open issue/known finding | Link via adapter comment; no work |56573. **Throttle** — at most `--max-agents` fix/investigate agents in flight58 (check TaskList); excess stays queued in order. New dispatches only as slots59 free.604. **Report** — one short message per cycle **only when something changed**:61 new findings by verdict, dispatches started, PRs ready, held items. Silent62 cycles stay silent.6364## Hard rules6566- **PR-only.** Pool agents never merge. Merges/deploys happen at operator break67 points — a deploy mid-test invalidates the testers' ground truth.68- **No schema pushes, ever.** Migration-class findings are always `HOLD`.69- **Surface mutex.** Never dispatch a fix touching a surface an active testing70 slot is walking (the operator names the active surfaces at arm time, or the71 walkthrough epics define them); queue until that slot completes.72- **Dedup before dispatch.** Two findings, one root cause → one agent, both73 issues linked.74- **Honest triage beats fast triage.** If AUTO-FIX vs HOLD is unclear, it's75 HOLD. A wrong auto-fix during a test session poisons two things at once.7677## Drain7879`drain`: stop the poll loop, let in-flight agents finish and open their PRs,80emit a final consolidated report: all findings routed, PRs awaiting merge,81held items needing operator rulings. The pool is not drained until every82finding has a disposition.