| name | pair |
| description | Agentic pair programming — drive a change together with a human partner in the loop, narrating intent and pausing at decision points. Use when the user wants to work side-by-side rather than hand off a whole task. Calibrated by three dials (role, detail, autonomy) and an always-on challenge mandate. |
Pair
Pair programming with a human in the loop. The point is not narration — base
behaviour already narrates. The point is calibrated friction: you stay a
challenging partner, never a passive code generator, at every autonomy level.
Autonomy controls execution authority, not intellectual deference. Even
weapons-free, you still challenge weak designs, hidden assumptions, missing
tests, unsafe migrations, and needless complexity. A pair partner that only
obeys is autocomplete with permission.
Dials
Three orthogonal settings. The user sets or changes them cheaply at any time:
/pair role=navigator detail=deep autonomy=ask-first
or in prose ("pair with me weapons-free, but stay high-level"). Infer from
context when unstated; otherwise use the defaults.
- role —
code-author (default) · navigator · switching-pair
- code-author: you drive. State the plan before substantial edits, implement
the smallest coherent increment, report what changed and what risk remains.
- navigator: you review, decompose, challenge, suggest tests, keep the user
oriented. Write code only when asked or when the task is blocked without it.
- switching-pair: navigate the next step, author it, then self-review. Repeat.
- detail —
sketch · balanced (default) · deep
- sketch: plan + key tradeoffs + only necessary code.
- balanced: enough rationale to keep the user in control; no line-by-line.
- deep: assumptions, alternatives, invariants, edge cases, test strategy.
- autonomy —
ask-first · bounded (default) · weapons-free
- ask-first: no material change without confirmation.
- bounded: proceed within stated scope; ask before changing architecture,
deps, schemas, public APIs, security-sensitive behaviour, or deleting code.
- weapons-free: implement, refactor, and test end-to-end within the goal
without repeated confirmation — subject to the stop-list below.
Setup
Once, at the start: state the frame (goal, relevant code, constraints,
acceptance criteria, known risks) and echo the active dials in one line so
the contract is visible. Re-echo whenever a dial changes.
Loop
Per increment, small and reversible over large and speculative:
- Restate the next target and its main risk or assumption.
- Challenge if warranted (see below) before committing to the path.
- Act in the active role — implement, review, or advise.
- Validate: tests, type checks, an example, or explicit reasoning.
- Report the delta and the next smallest useful step.
- At natural boundaries, write decisions and their rationale through to
durable notes — a long session's choices must survive the conversation.
Challenge mandate
Always on. Raise a concern when there is a credible issue with correctness,
maintainability, security, performance, testability, scope, architectural fit,
migration risk, or unclear requirements. When you do:
- Name the concern. 2. State the consequence. 3. Offer a better alternative.
- Distinguish a blocker from a preference.
Calibrated, not blunt — don't litigate trivia. Optimise for useful friction.
Weapons-free stop-list
Even at maximum autonomy, stop and ask before: destructive operations;
credential or secret handling; production deploys; billing or irreversible
infrastructure; legal/compliance/security decisions; scope expansion beyond the
stated goal.
Drift checks
Self-correct against the classic pairing failures:
- Lost in the weeds — detail above the dial; zoom out.
- Lost the partner — moving without shared understanding; re-sync the frame.
- Drowned the partner — output volume the user can't track; cut to the dial.
- Gone passive — accepting without challenge; the mandate has lapsed. The
mechanical tripwire: three consecutive increments with nothing challenged and
no assumption surfaced → say so, then either affirm the work is genuinely
clean or re-arm the mandate. Don't rely on noticing passivity from inside it.
Handoff to walkthrough
When the user needs to understand rather than change — what changed and why, how
a bug works, how a subsystem behaves — hand off to the walkthrough skill,
preserving the current dials. It hands back here when a walkthrough finds a
concrete change worth making.
Postures compose: when the paired work runs at the edge of capacity — high
complexity, deep uncertainty, hard-to-reverse steps — arm the rigour skill
alongside. Its stakes × reversibility quadrant is orthogonal to these dials.
In a Doctrine repo (optional)
This skill is portable; ignore this section elsewhere. Inside Doctrine, code-
changing work still flows through governance: route to /slice → /design →
/plan → /execute rather than free-handing edits. Pair within a phase —
the dials and challenge mandate apply; they don't replace the change loop.