Skip to content

Shipped agents

Six read-only subagents — tools: Read, Grep, Glob, Bash in the Claude Code bundle, subagent: true in the .agents bundle — none of them edit anything, and none of them gate you directly. What ships is each agent's default rendering: /ticket:init regenerates its role, project focus and researched knowledge for your stack, while its contract — what it is given, what it must return, what it may never do — stays exactly as documented on these pages (see Generated agents). Each returns a verdict that the calling session weighs; only the main session ever acts on a finding. Alongside the research agents init generates for your project (see Getting started § Step 0), these ship with every bundle: one wires into /ticket:new (and /ticket:refine's resume path), the other five into /ticket:pick.

Agent Stage Role Blocking?
nfr-analyst Creation (once) Derives the ticket's non-functional requirements before scope is locked Feeds the step 2.5 grilling
challenger Plan (once) Stress-tests the drafted plan before you approve it Feeds the Plan gate
code-reviewer Every loop round Reviews the diff against the plan, architecture, conventions Blocking
test-adequacy-reviewer Every loop round Checks whether new tests would actually fail on a revert Blocking
code-challenger Every loop round Attacks the route the code actually took Advisory
code-simplifier Every loop round Proposes behavior-preserving simplifications Advisory
flowchart TD
    Ticket["Draft ticket"] --> NFR["nfr-analyst"]
    NFR --> Grill{"Grilling<br/>(step 2.5)"}
    Grill --> Section["'## Non-functional requirements'<br/>each one + its verification"]
    Section --> Plan["Draft plan"]

    Plan --> Challenger["challenger"]
    Challenger --> Gate{"Plan gate"}
    Gate -->|approved| Loop["Implementation loop"]

    Loop --> Diff["Diff for this round"]
    Diff --> CR["code-reviewer<br/>(blocking)"]
    Diff --> TAR["test-adequacy-reviewer<br/>(blocking)"]
    Diff --> CC["code-challenger<br/>(advisory)"]
    Diff --> CS["code-simplifier<br/>(advisory)"]

    CR --> Eval{"Evaluate"}
    TAR --> Eval
    CC --> Eval
    CS --> Eval
    Eval -->|blocking finding| Replan["Re-plan"]
    Eval -->|advisory folded in| Iterate["Next round"]
    Eval -->|clean| Done(["Done → review"])

code-reviewer and test-adequacy-reviewer are the default blocking checkers, configured via review.agents in config.yaml — projects can register extra checkers (a11y, security…) without touching the command, and init can generate one from the checker kind when a hard requirement (an nfr.budgets entry, a compliance rule) calls for it. nfr-analyst, challenger, code-challenger, and code-simplifier are fixed and always on; project advisors (the advisor kind) can join them through review.plan_advisors and review.advisors — see Advisors and checkers. Every reply is checked with te agent reply-check before it is weighed (The reply check). Every agent also works standalone against any described work, plan, or diff, outside the commands.

Why no NFR agent in the loop. The non-functional work is front-loaded on purpose. At creation the failure mode is omission — a requirement nobody stated, which nobody can check later — and catching that needs a specialist. By the time the loop runs, the requirement is written on the ticket with its verification named, so the failure mode is compliance against a written list, which code-reviewer and test-adequacy-reviewer already handle. A project whose dimension genuinely can't be judged by a generalist reading a diff registers its own checker in review.agents.

See also

  • /ticket:pick — the implementation loop these agents run inside