paired-session

paired-session is a skill for Claude Code, Codex from NYTC69/review-loop. It costs 0 tokens per session (2,900 once invoked), scanned A, original, Apache-2.0.

An opt-in workflow for planning, implementing, independently reviewing, and delivering a change with a second working session. It uses a dedicated Git worktree, which is a separate working directory for the same repository.

In plain words
What is it for?
It helps coordinate a planned coding task, run implementation and review roles, determine the project's test command, and deliver the result through a controlled workflow.
Why use it?
It separates the work and review stages while protecting unrelated local changes in the main checkout.

Skill for Claude CodeCodex

Written for Claude Code and Codex: shipped in a Claude Code plugin, but also reads $CODEX_HOME. Also seen: positional $N argument; mentions Claude Code; installed under .agents/ (shared by several agents).

Part of the review-loop plugin — 6 skills, 12 agents shipped together

Good fit It helps coordinate a planned coding task, run implementation and review roles, determine the project's test command, and deliver the result through a controlled workflow.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/nytc69/review-loop/paired-session
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add NYTC69/review-loop --skill paired-session
Clone the repo
git clone --depth 1 https://github.com/NYTC69/review-loop

Made for: Claude Code, Codex.

Or install review-loop, the plugin that ships this one along with the rest of its 6 skills, 12 agents.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for paired-session

README.md
[![agentmods](https://agentmods.dev/badge/skills/nytc69/review-loop/paired-session/github.svg)](https://agentmods.dev/skills/nytc69/review-loop/paired-session)
Your own site
<a href="https://agentmods.dev/skills/nytc69/review-loop/paired-session"><img src="https://agentmods.dev/badge/skills/nytc69/review-loop/paired-session/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for paired-session

Your own site · 80×15
<a href="https://agentmods.dev/skills/nytc69/review-loop/paired-session"><img src="https://agentmods.dev/badge/skills/nytc69/review-loop/paired-session.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 0 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,900 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00000 $0.02900
Opus 5.5 $0.00000 $0.01160
Sonnet 5.5 $0.00000 $0.00580
Haiku 4.5 $0.00000 $0.00290

Measured 7d ago against content hash d28ed92829d1, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

paired-session scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.agents/skills/paired-session/SKILL.md · 155 lines

How it starts

The opening of the file, as written. The whole thing — 155 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Paired-session workflow (Codex)

First, before any stage A check or question, read <support-root>/docs/protocol/loading.md and load the shared entry contract (docs/protocol/paired-session-entry.md) as its own command, cwd in the user's workspace. The bundle must stay out of the product worktree (FIELD-18): first print a fresh bundle directory as its own command, python3 -c 'import os, tempfile, uuid; print(os.path.join(os.path.realpath(tempfile.gettempdir()), f"review-loop-protocol-{os.getuid()}", uuid.uuid4().hex[:12]))', then write that printed directory out literally as <bundle-dir>:

python3 <support-root>/scripts/read_protocol.py --runtime codex --stage entry-paired-session --output <bundle-dir>/protocol-codex-entry-paired-session.md

Resolve <support-root> to this plugin, not the task workspace. After exit 0, read the complete output file in bounded chunks and follow it; a missing, unreadable or incompletely read file is a failed stage A check, reported as stage A failure: cannot load the shared entry contract (<reason>). After compaction, reload it the same way when no coordinator command is running; while one is running, read <support-root>/docs/protocol/paired-session-entry.md directly (the stage is that whole file), which writes nothing to the workspace. This file adds only the Codex host rules:

  • Legacy pointer: none (the legacy workflow was removed in v2.13.0). Long-command execution failure: a declined or ungranted outside-sandbox approval: HOLD with the reason, on every entry and invocation (nothing falls back).
  • Outside-sandbox execution: the coordinator spawns provider CLIs and writes to $CODEX_HOME outside the product workspace; execute each invocation below with the host's full filesystem/network permission, outside the current Codex sandbox, and never inside the sandbox.
  • Long-command form: every invocation that can dispatch model turns (permission-probe, run, resume, reject --expect) starts with a short nonblocking yield (about 1 second); then poll its returned command-session id until it completes. Do not cancel it or launch a duplicate while it is active, except for the lifecycle-mode backstop, which ends the polled command session.
  • Detached commands: with --detach, wait until the printed pid has exited (the printed record path then reads "exited" with the exit code), then read the last line of its log and status --brief. A successful permission probe stays ACTIVE; a report run ends in REPORTED. A probe's result is RUN_DIR/permission-probe.json; end the detached command only with stop (paired_session/docs/detach.md).
  • Run directory: $CODEX_HOME/state/paired-session/runs/<task id>, created by the first invocation, which writes the work item there. Resolve PLUGIN_ROOT again inside each invocation. Write launcher logs under the run root's logs/ ($CODEX_HOME/state/paired-session/logs/), not next to the run dir. Read a launcher log's last lines only when a polled command ends without its final coordinator line (the shared contract's Work item section).
  • Default (efficient): no permission probe; the first invocation below starts the run. Strict: replace run in the first invocation with permission-probe (same arguments, without --stop-after-plan), then start the run with the second invocation.

First invocation (setup, then run; strict: permission-probe):

set -eu
export CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
stage_a() { echo "stage A failure: $1"; exit 3; }
test -d "$CODEX_HOME" || stage_a "CODEX_HOME $CODEX_HOME is not an existing directory"
VERSION="$(codex plugin list --json --marketplace review-loop-marketplace | python3 -c 'import json,sys; d=json.load(sys.stdin); rows=[p for p in d.get("installed",[]) if p.get("pluginId")=="review-loop@review-loop-marketplace" and p.get("enabled")]; assert len(rows)==1, "review-loop plugin must be installed and enabled exactly once"; print(rows[0]["version"])')" || stage_a "review-loop plugin is not installed and enabled exactly once"
python3 -c 'import re,sys; v=sys.argv[1]; m=re.fullmatch(r"(\d+)\.(\d+)\.(\d+)(\.\d+)*", v); msg=None if m and tuple(map(int, m.groups()[:3])) >= (2, 10, 0) else ("installed review-loop %s predates the paired-session lifecycle (2.10.0)" % v if m else "cannot parse installed review-loop version %r" % v); msg and print("stage A failure: " + msg); sys.exit(3 if msg else 0)' "$VERSION" || exit 3
echo "VERSION=$VERSION"
PLUGIN_ROOT="$CODEX_HOME/plugins/cache/review-loop-marketplace/review-loop/$VERSION"
test -x "$PLUGIN_ROOT/bin/paired-session" || stage_a 'paired-session executable missing from installed plugin'
WORKSPACE='/absolute/path/to/the-selected-dedicated-worktree'
WORKSPACE="$(cd "$WORKSPACE" && pwd -P)" || stage_a 'selected workspace does not exist'
test "$(git -C "$WORKSPACE" rev-parse --show-toplevel)" = "$WORKSPACE" || stage_a 'selected workspace is not a Git worktree root'
TASK_ID="$(python3 -c 'import uuid; print(uuid.uuid4())')"
RUN_DIR="$CODEX_HOME/state/paired-session/runs/$TASK_ID"
WORKITEM="$RUN_DIR/WORKITEM.md"
mkdir -p "$RUN_DIR" || stage_a 'cannot create the run directory'
cat > "$WORKITEM" <<'PAIRED_SESSION_WORKITEM' || stage_a 'cannot write the work item'
[Write the user's approved goal, acceptance criteria, scope, and verification here.]
PAIRED_SESSION_WORKITEM
echo "RUN_DIR=$RUN_DIR"
TEST_COMMAND='[verified project command, or the exact value from the profile]'
"$PLUGIN_ROOT/bin/paired-session" run \
  --workspace "$WORKSPACE" --workitem "$WORKITEM" --run-dir "$RUN_DIR" \
  --test-command "$TEST_COMMAND" --lifecycle-mode on

Read the full file on GitHub · 155 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 7d ago Changed · +16 lines d28ed92829d1
  2. 12d ago Changed · +4 lines 00173e159075
  3. 15d ago Changed · -1 lines f8cd41dca4f2
  4. 16d ago Changed · +18 lines 8f501b9f1278
  5. 17d ago Changed · +31 lines 2f6879c14518
  6. 19d ago Changed 767cc06fffce
  7. 23d ago First seen · 87 lines · 0 tokens per session scan A c86b1c4511e6

Subscribe to this mod's changes

paired-session is a skill published in the GitHub repository NYTC69/review-loop (3 stars, last pushed today), licensed Apache-2.0. It costs nothing until one of its globs matches a file; then it loads 2,900 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-30.

Related

Other skills, from other repositories

ship-it-or-fix-it

Oracle-frozen Builder and independent-Judge convergence cycle. Load ONLY when the operator explicitly sets Governance Dial G2 for the task, or explicitly names this skill or an active work unit already running it. Never auto-activate on task class, such as security, auth, or payments. If a task seems to warrant G2 and…

Ezra144israel/governed-agent-skills · 98 tokens

test-verification

Requires behavioral, failure-path, and durable-seam evidence for tests and review. Use when writing tests, reviewing test coverage, assessing behavioral test quality, or accepting high-risk behavior on test evidence.

Ezra144israel/governed-agent-skills · 43 tokens

socratic-review

Socratic code review and refactoring session — whether it's your own code, a teammate's PR, or something you inherited. Leads you to see the issues through questions, names smells and moves precisely, then closes with a concrete plan.

thoughtbot/rails-consultant · 51 tokens

simplify

Reduce the complexity of existing code without changing behavior - deep nesting, long functions, dead code, unclear names, the wrong abstraction. Use after a feature works but reads heavier than it should, or to clean up code written under time pressure. Pass --aggressive to reshape a working feature into the form it…

vanducng/skills · 127 tokens

prior-art

Discover how a codebase already handles a specific concern — search broadly, find every instance, and assess consistency. The "how does this app do X?" tool.

thoughtbot/rails-consultant · 36 tokens

code-review

Review code with a sharp, encouraging voice - inline GitHub PR comments + a tight summary. Supports PR (default), pending changes, commit hash, and codebase modes. Encodes an opinionated review style: severity-prefixed, concise, actionable, no fluff. Pass --refactor for the local reuse/slop lens (never posts). For the…

vanducng/skills · 99 tokens