The loop¶
The skills compose into one end-to-end engineering loop: plan → break down → build → ship → track. Most days you only touch a few of them. This is the canonical walkthrough — concept and command for every phase.
Run /zsl:setup-zsl-superpowers once per repo before any of
this; from then on it's the loop:
flowchart LR
plan["`**Plan**
grill-me · grill-with-docs · to-prd`"]
breakdown["`**Break down**
to-issues · triage`"]
build["`**Build**
tdd-parallel · tdd · diagnose`"]
ship["`**Ship**
code-review · commit`"]
track["`**Track & close**
state machine · project board`"]
plan --> breakdown --> build --> ship --> track --> plan
classDef phase stroke:#3f51b5,stroke-width:1.5px,rx:6,ry:6;
class plan,breakdown,build,ship,track phase;
Each phase produces an artifact the next one consumes:
| Phase | Produces | Consumed by |
|---|---|---|
| Plan | A PRD issue on the tracker (or a .scratch/<NNN>-<feature-slug>/PRD.md) describing what you're building and why |
Break down |
| Break down | Vertical-slice sub-issues with [AFK\|HITL] <wave><letter> titles and Blocked by graphs, each triaged to a state |
Build |
| Build | Slice branches with red-green-refactor commits, each closing one sub-issue | Ship |
| Ship | A merged PR (or pushed commit) per slice, or one consolidated integration PR for an AFK fanout | Track |
| Track & close | Closed issues. The PRD parent auto-closes when its last child closes. | Next loop |
Loop skills vs the bands around it¶
Some skills sit on the loop arrow; others run across it, automate it overnight, or sit off it entirely.
flowchart TB
subgraph loop["📦 On the loop"]
direction LR
a["`**Plan**<br/>grill-me<br/>grill-with-docs<br/>to-prd`"] --> b["`**Break down**<br/>to-issues<br/>triage`"]
b --> c["`**Build**<br/>tdd-parallel<br/>tdd`"]
c --> d["`**Ship**<br/>git-branch<br/>commit<br/>code-review`"]
d --> e["`**Track**<br/>state machine`"]
e --> a
end
subgraph cross["🧭 Cross-cutting"]
direction LR
x1["diagnose<br/><i>bugs / perf</i>"]
x2["improve-codebase-architecture<br/><i>fight entropy</i>"]
x4["triage<br/><i>inbound issues</i>"]
end
subgraph overnight["🌙 Overnight (remote agents)"]
direction LR
n1["afk-fanout<br/><i>evening: schedule</i>"] --> n2["afk-worker<br/><i>overnight: run per-PRD</i>"]
n2 --> n3["morning-review<br/><i>morning: reconcile + merge</i>"]
end
subgraph offloop["✋ Off-loop"]
direction LR
o1["prototype<br/><i>throwaway exploration</i>"]
o2["handoff<br/><i>session compaction</i>"]
o3["timesheet<br/><i>standup notes</i>"]
o5["writing-great-skills<br/><i>meta</i>"]
end
cross -.-> loop
overnight -.->|"runs the Build→Ship→Track<br/>stretch unattended"| loop
One-time setup¶
/zsl:setup-zsl-superpowers
: Configure the issue tracker, triage label vocabulary, domain doc layout, and ship style for the repo. Run once before anything else.
Plan¶
flowchart LR
chat(["conversation<br/>with Claude"]) --> grill{{"/zsl:grill-me<br/>or<br/>/zsl:grill-with-docs"}}
grill -->|"shared language updated<br/>in CONTEXT.md + ADRs"| docs[("CONTEXT.md<br/>docs/adr/")]
grill --> prd{{"/zsl:to-prd"}}
prd -->|"synthesises chat → PRD"| tracker[("issue tracker<br/>or .scratch/")]
classDef skill fill:#e0e7ff,stroke:#3f51b5,color:#1e293b;
classDef artifact fill:#dcfce7,stroke:#16a34a,color:#1e293b;
class grill,prd skill
class docs,tracker artifact
/zsl:grill-me or /zsl:grill-with-docs
: Interview yourself to surface what you're actually building, until every branch of the decision tree is resolved. grill-with-docs also updates CONTEXT.md (the shared language) and ADRs (the decisions) inline — the lever that cuts agent verbosity over time.
/zsl:to-prd
: Synthesise that conversation into a PRD on the tracker. No interview — just packaging what you've already discussed.
The grilling step is the highest-leverage one
The most common failure mode in agent-coded software is misalignment — you think the agent knows what you want, then you see what it built. Five minutes here costs orders of magnitude less than re-doing work later. See Why these skills exist.
Break down¶
flowchart LR
prd[("PRD on tracker")] --> to_issues{{"/zsl:to-issues"}}
to_issues -->|"vertical-slice children<br/>with [AFK|HITL] <wave><letter> titles"| children[("N sub-issues<br/>labeled needs-triage")]
to_issues -.->|"relabels parent"| prd_tracking[("PRD → tracking")]
children --> triage{{"/zsl:triage<br/>(one per child)"}}
triage -->|"per child"| states[("ready-for-agent<br/>ready-for-human<br/>needs-info")]
classDef skill fill:#e0e7ff,stroke:#3f51b5,color:#1e293b;
classDef artifact fill:#dcfce7,stroke:#16a34a,color:#1e293b;
class to_issues,triage skill
class prd,children,prd_tracking,states artifact
/zsl:to-issues
: Break the PRD into vertical-slice sub-issues. Children are labeled needs-triage; the PRD parent is auto-relabeled to tracking.
The [AFK|HITL] <wave><letter> title format is the dependency
contract the rest of the loop consumes:
[AFK]— the agent can run it unattended.[HITL]— needs a manual action an agent can't perform (cleared by/zsl:human-itl, not a disguised decision).<wave>— serialisation level (wave 1 before wave 2).<letter>— parallelism within a wave (same wave = disjoint = runnable in parallel).
/zsl:triage
: Walk each child through the state machine to ready-for-agent (with an agent brief), ready-for-human, or needs-info. Skip triaging the PRD itself; you just wrote it.
Build¶
This is where the two TDD skills diverge — see Git branching for the full topology.
flowchart TB
sub["one ready-for-agent<br/>sub-issue"] --> choice{{"single slice or<br/>parallel fanout?"}}
choice -->|"single"| tdd["/zsl:tdd <num><br/>red→green→refactor<br/>one branch"]
choice -->|"multiple unblocked AFK"| parallel["/zsl:tdd-parallel <PRD><br/>worktree per slice<br/>wave-by-wave merges"]
bug["bug or perf regression"] --> diagnose["/zsl:diagnose<br/>repro → minimise →<br/>hypothesise → fix"]
classDef skill fill:#e0e7ff,stroke:#3f51b5,color:#1e293b;
class tdd,parallel,diagnose skill
/zsl:tdd-parallel <PRD>
: The full-auto pipeline from a PRD to a pushed integration PR. It fans out the unblocked [AFK] ready-for-agent children into parallel /zsl:tdd --no-ship sub-agents in worktrees, merges every slice branch onto the PRD branch in wave order with --no-ff, then runs two automated integration steps: 4a /zsl:code-review --auto against the merged tip, 4b /zsl:verify-coverage --auto to prove every user story has a test. Gaps found at 4b are filed as ready-for-agent and re-fanouted — the loop iterates until gap=0 or a circuit breaker fires (--max-coverage-rounds, default 3). On clean coverage, 4c delegates the commit to /zsl:commit, pushes, and opens one consolidated PR. Pre-flight (1d) refuses up front only if no slice is runnable or an in-scope story lacks an AC<n>: acceptance criterion. PR-style repos only. See the deep-dive.
/zsl:tdd <child>
: Single-issue red-green-refactor. Refuses if you point it at a container. Runs /zsl:code-review automatically between Refactor and Ship (step 5). On local-markdown trackers you can run it with no argument — it scans .scratch/, resolves each open issue's ## Blocked by against the issues/_done/ archive, and lets you pick from the unblocked ones.
How a slice routes by type¶
The [AFK|HITL] prefix isn't decoration — it decides which skill picks
the slice up. A slice is one of three things, and only two of them are
work:
flowchart TB
s["a slice from /zsl:to-issues"] --> q{"what does it need?"}
q -->|"agent can do it"| afk["[AFK]"]
q -->|"a manual action<br/>a human must perform"| man["[HITL]"]
q -->|"a decision / review<br/>(no manual action, no code)"| dec["mislabelled —<br/>a decision in disguise"]
afk --> tddp["/zsl:tdd-parallel<br/>fan out in worktrees"]
man --> hitl["/zsl:human-itl<br/>walk the human through it,<br/>record it, mark done"]
hitl --> unblock["dependent [AFK] slices unblock<br/>→ re-run /zsl:tdd-parallel"]
dec --> leak["process leak"]
leak --> grill["/zsl:grill-with-docs + ADR<br/>resolve upstream,<br/>then relabel the slice [AFK]"]
classDef good fill:#dcfce7,stroke:#16a34a,color:#1e293b;
classDef ok fill:#fef3c7,stroke:#d97706,color:#1e293b;
classDef bad fill:#fee2e2,stroke:#dc2626,color:#1e293b;
class afk,tddp,unblock,grill good
class man,hitl ok
class dec,leak bad
/zsl:human-itl <PRD>
: The serial, human-present counterpart to the fanout. It walks you through the [HITL] slices — the manual actions a coding agent can't perform (console clicks, credential rotation, sign-off) — records each as an audit-trail comment, and marks them done so the [AFK] slices Blocked by them unblock. /zsl:tdd-parallel defers open [HITL] slices into a [partial] PR rather than blocking; clear them with /zsl:human-itl, then re-run the fanout. It hard-refuses a slice that's really a decision in disguise — that belongs upstream in /zsl:grill-with-docs + an ADR.
Verify¶
/zsl:verify-coverage <PRD>
: Check every PRD ## User Stories entry against the implemented code via tests, not prose. Tier A maps each story to an existing passing behavioral test; Tier B generates one for the rest from the story's AC<n>: acceptance criteria, proves it non-vacuous by mutation, and runs it. Quarantines failing tests, auto-files genuine gaps as sub-issues, and writes a coverage receipt against the verified sha. Almost always chained automatically by /zsl:tdd-parallel step 4b (gaps filed as ready-for-agent, orchestrator loops on them); direct invocation is for auditing PRDs whose slices shipped elsewhere. There's no human-attestation lane — non-automatable stories are refused at /zsl:to-prd time, so visual/UX/external work splits into a separate PRD that doesn't go through /zsl:tdd-parallel.
flowchart TB
story["one PRD user story<br/>(carries AC criteria)"] --> q{"covered by a passing<br/>behavioral test today?"}
q -->|"yes"| ta["`**Tier A**<br/>map story → existing test`"]:::good
q -->|"no"| tb["`**Tier B**<br/>generate test from AC criteria<br/>· mutation-prove it goes RED<br/>· run it`"]:::ok
tb -->|"passes"| tba["covered<br/>(test added to suite)"]:::good
tb -->|"fails"| gap["`**Gap**<br/>auto-filed as ready-for-agent<br/>sub-issue · tdd-parallel loops`"]:::bad
classDef good fill:#dcfce7,stroke:#16a34a,color:#1e293b;
classDef ok fill:#fef3c7,stroke:#d97706,color:#1e293b;
classDef bad fill:#fee2e2,stroke:#dc2626,color:#1e293b;
Ship¶
Most of what looks like "ship" happens inside /zsl:tdd — by the time
you reach the ship step, the slice has already been red-green-refactored
and reviewed (step 5, between Refactor and Ship).
flowchart LR
branch["slice branch with<br/>red→green→refactor commits"] --> review{{"/zsl:code-review<br/>(inside /zsl:tdd step 5)"}}
review -->|"interactive: approval gate<br/>--auto: ≥80 auto-apply"| fixes_commit["review fixes<br/>committed via /zsl:commit"]
fixes_commit --> ship["/zsl:tdd step 6: ship it"]
ship -->|"PR-style"| pr[("PR opened<br/>Closes #<sub-task>")]
ship -->|"direct-push"| push[("commits pushed<br/>Closes in commit body")]
ship -->|"local-markdown"| mv[("Status: shipped<br/>git mv to _done/")]
classDef skill fill:#e0e7ff,stroke:#3f51b5,color:#1e293b;
class review,fixes_commit skill
/zsl:code-review
: A six-lens parallel scan (clean-code, CLAUDE.md compliance, git history, prior PR comments, inline comments, spec alignment against the originating PRD), 0–100 confidence-scored, dropping findings below 60. Runs automatically as /zsl:tdd step 5 (interactive, with an approval gate) or in --auto mode under /zsl:tdd --no-ship and /zsl:tdd-parallel step 4a. Also standalone before opening a PR by hand. See the code-review deep-dive.
/zsl:commit
: Clean, attribution-free commits — fully autonomous for session changes (no per-commit approval prompt). Explicit file lists, never git add -A; confirms only "other-origin" dirty files (modified outside this conversation) before including.
/zsl:commit-push-pr
: One-shot ship for a whole feature branch: pre-flight refuses on the default branch, delegates the commit to /zsl:commit, then git push -u, then opens the PR via gh. No force-push, no --no-verify, no Claude attribution.
/zsl:git-branch
: Create a correctly-prefixed branch (feature/, fix/, chore/…) before /zsl:tdd when you don't already have one.
Ship behaviour depends on docs/agents/ship-style.md (written by
/zsl:setup-zsl-superpowers). See
Git branching for the matrix.
Track & close¶
Every issue carries one category role (bug or enhancement) and one
state role:
stateDiagram-v2
direction LR
[*] --> needs_triage: created
needs_triage: needs-triage
needs_info: needs-info
ready_agent: ready-for-agent
ready_human: ready-for-human
tracking: tracking
wontfix: wontfix
done: closed
needs_triage --> needs_info: ask reporter
needs_info --> needs_triage: reporter replied
needs_triage --> ready_agent: agent brief written
needs_triage --> ready_human: needs human judgment
needs_triage --> tracking: /to-issues sliced it
needs_triage --> wontfix: declined
ready_agent --> done: PR merged
ready_human --> done: PR merged
tracking --> done: last child closed
wontfix --> done: closed with reason
note right of tracking
Auto-set by /to-issues.
Auto-closes when the last
child closes (GitHub) or
when you move the folder
to .scratch/_done/ (local).
end note
See /zsl:triage for transition policy and brief
templates. Where state lives, and how closure works, depends on the
backend you picked in /zsl:setup-zsl-superpowers:
GitHub project dashboard — state lives as labels on each issue and is
mirrored to the project board's Status field via the mapping in
docs/agents/project-board.md. /zsl:triage updates both. PR merge →
GitHub closes the child; last child closes → GitHub auto-closes the
tracking parent.
Local markdown files — state lives as a Status: line near the top of
each .md file under .scratch/<NNN>-<feature-slug>/, where <NNN> is a
3-digit feature number assigned at creation. Features can be addressed by
number alone — /zsl:triage 23 resolves to feature 023-* via glob.
Closure is folder-based, atomic with the slice commit, and nothing is
deleted:
- Close an issue → on ship,
/zsl:tddflips theStatus:line toshippedandgit mvs the issue file intoissues/_done/in the same commit as the code. - Close a feature → move the whole
.scratch/<NNN>-<feature-slug>/directory to.scratch/_done/<YYYYMMDD>-<NNN>-<feature-slug>/. There's no auto-close: when an issue's close empties the feature's openissues/,/zsl:tddprompts you to run the feature-levelgit mv(never automatic — you might still want to add a follow-up issue).
See the state machine page for the full transition policy.
Overnight (remote agents)¶
Everything above is the interactive loop. Once a PRD is sliced and
triaged, the Build → Ship → Track stretch can also run unattended
overnight — one dedicated remote claude.ai session per PRD, so several
/zsl:tdd-parallel runs happen in parallel without contending on a shared
checkout. Three skills, evening to morning:
/zsl:afk-fanout
: Evening, interactive. Shows the queue of tracking PRDs with ready-for-agent children; you pick which to run and in what order; it schedules one one-shot remote routine per PRD a fixed 2h apart.
/zsl:afk-worker
: What each routine fires (not invoked by hand). Runs unattended in its own clone, drives /zsl:tdd-parallel <num> --on-review-failure=continue --max 2, opens one integration PR, records its outcome on the afk-runs ledger.
/zsl:morning-review
: Morning, interactive. Reconciles the ledger into the canonical .scratch/ tracker, then walks you through the PRs to verify and merge, halted slices, and no-result PRDs. Never auto-merges; never deploys.
The enabler is /zsl:tdd-parallel's partial runs: a worker never
stalls on a human gate because open [HITL] slices are deferred into a
[partial] PR. See the Remote agents deep-dive
for the full design — one-session-per-PRD isolation, the 2h throttle, the
ledger, and the morning sweep.
Cross-cutting¶
These don't belong to a single phase — they run across the loop:
| Skill | When to reach for it |
|---|---|
/zsl:triage |
Inbound bug reports / feature requests, or re-evaluating stale issues — not just the children you sliced. |
/zsl:diagnose |
Hard bugs and performance regressions, whatever phase you're in. |
/zsl:improve-codebase-architecture |
Every few days, to fight entropy. Surfaces deepening opportunities informed by CONTEXT.md + ADRs. |
Cleanup¶
After children merge, manually run git worktree remove and git branch
-d to clean up the parallel-tdd worktrees and branches (the next
/zsl:tdd-parallel run also sweeps these in its pre-flight).
Catalogue at a glance¶
For the full per-skill descriptions and decision tree, see the Skills overview.
| Phase | Skill | What it does |
|---|---|---|
| Setup | setup-zsl-superpowers | One-time per-repo scaffold: tracker, label vocab, ship style |
| Plan | grill-with-docs | Interview + updates CONTEXT.md and ADRs |
| Plan | grill-me | Interview only (non-code) |
| Plan | to-prd | Conversation → PRD on tracker |
| Break down | to-issues | PRD → vertical-slice children with wave/letter dependency graph |
| Break down | triage | Walk each child through the state machine |
| Build | tdd | Single-issue red-green-refactor |
| Build | tdd-parallel | Worktree fanout + wave-ordered merges + one PR |
| Build | human-itl | Clear the [HITL] manual-action slices a PRD carries |
| Build | diagnose | Reproduce → minimise → hypothesise → fix |
| Verify | verify-coverage | PRD-story coverage via tests; gates the fanout's integration PR |
| Ship | git-branch | Branch with the prefix convention |
| Ship | commit | Explicit-file-list commits, autonomous for session changes |
| Ship | commit-push-pr | One-shot: commit → git push -u → gh pr create; refuses on the default branch |
| Ship | code-review | Six-lens parallel scan, 0–100 confidence (drops <60); interactive gate or --auto |
| Overnight | afk-fanout | Evening scheduler: queue tracking PRDs, one remote routine per PRD 2h apart |
| Overnight | afk-worker | Per-PRD remote executor: own clone, /tdd-parallel, one PR, ledger + Telegram |
| Overnight | morning-review | Reconcile the afk-runs ledger; surface PRs, halted slices, no-result PRDs |
| Cross-cut | improve-codebase-architecture | Find deepening opportunities |
| Off-loop | prototype | Throwaway exploration |
| Off-loop | handoff | Compact the current session into a tmp-dir handoff doc |
| Off-loop | timesheet, writing-great-skills | Productivity helpers |
See also¶
- Why these skills exist — the failure modes the loop is built to fix.
- The triage state machine — how issues move between states.
- Git branching — what the Build phase does to your git tree.
- Parallel TDD deep-dive · Code review deep-dive · Remote agents deep-dive.