Skip to main content

Adversarial journey framework — orchestrate multiple LLM peers through research, plan, and execute stages with file-trace peer review.

Project description

paircode

Multi-LLM peer review for your code, with file-traces on disk. One primary LLM (alpha, usually Claude Code) + any number of peer LLMs (Codex, Gemini, Ollama, …) running research / plan / execute / ask cycles with structured cross-review rounds stored entirely as Markdown on disk.

Born from 31 iterations of dual-LLM silent-agreement hunting on a real ML project. See diary/001-step-a-architecture.md for the origin story and diary/003-arch-b-pivot-grappling.md for the current (v0.11) team-lead architecture.

Install

pipx install paircode       # or: pip install --user paircode
paircode install            # registers /paircode in every detected LLM CLI

paircode install deploys /paircode into each LLM CLI it finds on your PATH:

CLI How it's installed What you get
Claude Code file-drop ~/.claude/commands/paircode.md /paircode slash command
Codex CLI codex marketplace add starshipagentic/paircode-codex /paircode slash command
Gemini CLI gemini extensions install github.com/starshipagentic/paircode-gemini --consent /paircode slash command

In Gemini you may need /commands reload the first time. In Codex the marketplace fetches on first use.

paircode delegates LLM subprocess invocation to cliworker — that's where speed flags, MCP strip tricks, skip-cache, and subscription-first fallback live. paircode adds the peer-review orchestration on top (file-traces, stages, rosters, convergence).

Use it

Inside any LLM CLI that has /paircode installed, just type:

/paircode "build a KISS PHQ-9 depression risk engine"

or

/paircode "review my auth middleware approach at src/auth/"
/paircode "plan the refactor" --peers codex,gemini
/paircode "get a second opinion on this PR" --peer gemini

The slash command's team-lead prompt (the LLM you're inside) reads your prompt, picks a stage (research | plan | execute | ask), fires peers, collects their markdown, iterates through review rounds until convergence, and writes consensus.md at the end. Everything lands under .paircode/ in your current project.

What ends up on disk

your-project/
  .paircode/
    JOURNEY.md                    # fleet log
    peers.yaml                    # roster: who's on the team
    peers/
      peer-a-codex/               # codex's persistent sandbox (code goes here)
      peer-b-gemini/               # gemini's persistent sandbox
    focus-01-<slug>/
      FOCUS.md                    # this focus's prompt + metadata
      research/
        alpha-v1.md ... alpha-vN.md
        peer-a-codex-v1.md ...
        reviews/round-01-peer-a-codex-critiques-alpha.md
        alpha-FINAL.md
        peer-a-codex-FINAL.md
        consensus.md              # team-lead synthesis (last thing written)
      plan/         (same shape)
      execute/      (same shape)
      ask/          (same shape)
    focus-02-<slug>/
      ...

Code vs. reports. Files inside focus-*/ are markdown reports (opinions, plans, critiques, summaries of work). Actual code lives elsewhere:

  • Peers code in their sandboxed workspaces at .paircode/peers/<peer-id>/ — persistent across focuses.
  • Alpha codes directly in the project root (the real repo) — alpha is the project.

Stages

Stage is picked by the team-lead LLM based on the prompt:

Stage When Typical prompt
research Explore new ground "build X", "find the right Y", "how should we approach Z"
plan Concrete implementation plan from prior research "plan the refactor based on focus-02"
execute Do the work from an existing plan "execute the plan at focus-02"
ask Get opinions on existing work "what does codex think of this PR", "review my approach at

The team lead can chain stages in one invocation: research → plan → execute → done. No hard round cap — the team lead converges when peers stop surfacing new signal.

Commands (the helper CLI)

Most users will only ever type paircode install and then use /paircode inside their LLM CLI. The binary's other commands are helpers the team-lead slash command calls on your behalf:

paircode                         print current .paircode/ state
paircode install                 register /paircode in every detected LLM CLI
paircode uninstall               remove /paircode from LLM CLIs (idempotent)
paircode ensure-scaffold         idempotent .paircode/ init + handshake (silent)
paircode focus new <slug>        create a new focus dir, print its path
paircode focus active            print the active focus path
paircode roster [--alpha <cli>] [--peer <id>] [--peers <id,id>]
                                 print peer ids, best-effort, never errors
paircode invoke <peer-id> "<prompt>" --out <path>
                                 fire one peer, write file-trace to --out
paircode converge <stage>        copy each participant's latest vN to *-FINAL.md

Model compatibility

CLI /paircode slash command Peer invocation Parallel peers? Status
Claude Code (claude) ✓ file-drop at ~/.claude/commands/paircode.md claude -p <prompt> ✓ via Agent tool + run_in_background=true stable
Codex (codex) ✓ via codex marketplace add codex exec <prompt> ✗ serial-only (codex constraint) stable
Gemini (gemini) ✓ via gemini extensions install gemini -p <prompt> ✗ serial-only (gemini constraint) stable
Ollama (ollama) — (local models, no slash-cmd host) ollama run <model> <prompt> n/a peer-only
Aider / others best-effort, PRs welcome planned

Peer roster is auto-detected at first install via paircode handshake (silent, called by ensure-scaffold). Edit .paircode/peers.yaml to customize.

Why this exists

See diary/001-step-a-architecture.md. Short version: running two LLMs adversarially surfaces silent-agreement bug classes that neither engine alone catches — cross-engine agreement is not the same as correctness when both engines share a blind spot.

See diary/003-arch-b-pivot-grappling.md for why v0.11 moved orchestration out of a Python driver and into the slash-command's team-lead LLM.

License

MIT. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

paircode-0.11.3.tar.gz (44.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

paircode-0.11.3-py3-none-any.whl (48.1 kB view details)

Uploaded Python 3

File details

Details for the file paircode-0.11.3.tar.gz.

File metadata

  • Download URL: paircode-0.11.3.tar.gz
  • Upload date:
  • Size: 44.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for paircode-0.11.3.tar.gz
Algorithm Hash digest
SHA256 4f49d2c8b35a313b2f908f78e5854fb028df8f303fd0a464f5a4b131f1bc58fa
MD5 73cdfac784f710e51e0a2a8dcc20fc0a
BLAKE2b-256 6a61a5ce9419e83c5e11007007d65e2188e9acf2ce4fea010bea804408f59c4d

See more details on using hashes here.

File details

Details for the file paircode-0.11.3-py3-none-any.whl.

File metadata

  • Download URL: paircode-0.11.3-py3-none-any.whl
  • Upload date:
  • Size: 48.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for paircode-0.11.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0f4def0bdb0a6e0dc66d086b39451ae1f627fbd709da3fea36c2b78c18157919
MD5 b37d309c481378124e9ba1ddc0f6ad91
BLAKE2b-256 ebd86faf5a879409f08d0cd69c104cc56cf90f935dce1fb6cbbd514bd472e0c1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page