Coach - Pairing - Claude
Launches Claude Code as a live pairing coach via tuple connect when Tuple Capture starts. Claude watches for pairing anti-patterns — backseat driving, quiet pair, silent driver, no shared goal, no swaps or breaks — and surfaces a one-line move when confident. When the call ends, it writes a retro (pairing-evaluation.md) with talk-time balance, timestamped anti-pattern quotes, what worked, and one thing to practice next session.
Launches Claude Code as a live pairing coach on your Tuple call when Capture starts.
When call-capture-started fires, this trigger opens your preferred terminal and runs tuple connect --harness claude "<coaching purpose>". Connect resolves the call state, gives Claude a context prompt, and points it at the live transcript — so Claude catches up on everything said so far, then watches the call as it happens as an active pairing coach.
What it does
tuple connect brings Claude into the call and tells it how to follow along. The COACH_PURPOSE string (set near the top of call-capture-started) steers Claude toward pairing-coach behavior on top of connect's base prompt:
During the call:
- Watches the live pairing dynamic for known anti-patterns: backseat driving, a quiet navigator, a silent driver, no shared goal set up front, grinding without swaps or breaks.
- Tracks lightweight session state: talk-time balance, who last spoke, whether a goal was stated, and how long since the last role swap or break.
- When confidence is high, surfaces a single one-line move the pair can make right now — printed to the terminal. Otherwise stays silent.
- Does not interrupt the call, does not post anywhere external.
When the call ends:
- Reads the full transcript and writes a retro to
pairing-evaluation.md:- How the session ran: shared goal? talk-time balance? swaps and breaks, or a grind?
- Anti-patterns that showed up, each named with a timestamped quote.
- What worked: up to 3 moves worth repeating.
- One thing to practice: the single highest-leverage change for the next session.
Tuning the coaching
The entire coaching framing lives in the COACH_PURPOSE variable near the top of call-capture-started. Edit it there to change what the coach watches for, how it intervenes, or what the retro covers — no other files need to change.
Choosing your terminal
By default the trigger opens your system's default handler for .command files. To force a specific terminal, set PREFERRED_TERM at the top of call-capture-started (or in the environment):
PREFERRED_TERM="iterm" # ghostty | iterm | alacritty | terminal
The terminal runs launch-coach-pairing-claude.command, whose #!/bin/zsh -li shebang sources your shell profile, so tuple and claude resolve from the same PATH you get in a normal terminal.
Prerequisites
- macOS
- Claude Code installed so
claudeworks in a new terminal - The
tupleCLI on your interactive shell PATH (withconnectandcapturesupport)- Install it from the Tuple app: its Capture settings have an Install button that links
tupleonto your PATH.
- Install it from the Tuple app: its Capture settings have an Install button that links
- Tuple Capture enabled for the call
Installation
Drop this directory into your Tuple triggers folder:
~/.tuple/triggers/coach-pairing-claude/
The trigger fires the next time call Capture starts.
How it works
call-capture-started supplies the call and recording IDs through environment variables, not
positional arguments. This trigger:
- Creates a working directory per start,
${TMPDIR:-/tmp}/tuple-coach-pairing-claude/<timestamp>-<pid>. - Shell-quotes both IDs into
trigger-context.sh, writesCOACH_PURPOSEto a sidecar file, and writes an executablelaunch-coach-pairing-claude.commandwrapper. - Opens it in your preferred terminal via
open(LaunchServices). No AppleScript and no direct binary launch, so it triggers no macOS accessibility prompt and no stray windows. - The wrapper starts a login-interactive zsh, sources the trigger context, and runs
tuple connect --harness claude "$COACH_PURPOSE". Connect selects the live current session; the exact trigger IDs remain available to the launched agent and its Tuple commands.
There is no dedup: each Capture start gets its own directory, so stopping and restarting Capture spawns a fresh coach while older ones keep running.
For local testing without opening a terminal, set COACH_PAIRING_CLAUDE_DRY_RUN=1; it writes the launcher and exits.
Acknowledgments
The pairing framework is drawn from Tuple's Pair Programming Guide (its antipatterns, styles, and session template) and from the wider practice, notably Birgitta Böckeler and Nina Siessegger's On Pair Programming and Llewellyn Falco's strong-style rule ("for an idea to go from your head into the computer it must go through someone else's hands").