Documentation

Run the panel in five minutes

atcr is one Go binary with three faces — a CLI, an MCP server, and a companion Agent Skill — all running on the same engine. It is local-first and bring-your-own-keys: nothing leaves your machine except the model calls you configure.

Install

Requires Go 1.25 or newer.

# 1. install the binary
go install github.com/samestrin/atcr/cmd/atcr@latest

# 2. scaffold .atcr/config.yaml + the editable persona files
atcr init

atcr init writes .atcr/config.yaml — the roster (which agents run, in which lane) plus project defaults such as payload_mode and fail_on — and drops the editable persona files under .atcr/personas/.

Configure providers

Providers and agents are defined in ~/.config/atcr/registry.yaml. Each provider is a base_url plus an api_key_env naming the environment variable that holds the key — resolved at invoke time and never written to disk:

# ~/.config/atcr/registry.yaml
providers:
  openrouter:
    base_url: https://openrouter.ai/api/v1
    api_key_env: OPENROUTER_API_KEY
agents:
  greta:
    provider: openrouter
    model: claude-sonnet-4.6
export OPENROUTER_API_KEY=sk-...

The roster in .atcr/config.yaml lists which of those agents actually run — add or remove an agent name to change who reviews. Resolution runs CLI flag > .atcr/config.yaml > registry.yaml > embedded default. A repo can also ship its own providers in .atcr/registry.yaml; because a project-defined provider could direct a key at an arbitrary endpoint, atcr gates them — run atcr trust to authorize one before any review will use it.

Verify with doctor

Before spending a real review, self-test every configured endpoint:

$ atcr doctor
AGENT    PROVIDER     MODEL                STATUS   SOURCE
greta    openrouter   claude-sonnet-4.6    ok       user
bruce    openrouter   gpt-4o               ok       user
kai      local        llama-3.3-70b        ok       project
# exit 0 — every agent has a working invocation path

review

Resolve the git range, build the payload, and fan it out to the roster. Zero arguments works on a feature branch — the range resolves against the default branch and the review id is recorded in .atcr/latest.

$ atcr review
→ range  main..HEAD  (4 files, 211 lines)
→ fan-out  5 panelists · parallel
 greta   3 findings
 bruce   2 findings
 kai     1 finding
 mira    2 findings
 otto    1 finding
→ wrote .atcr/reviews/r-4f2a/sources/

reconcile

Discover the per-agent sources, cluster by location, dedupe by similarity, and score confidence by agreement:

$ atcr reconcile
→ 9 raw findings → 6 clusters → 3 reconciled
 wrote reconciled/{findings.txt, findings.json, report.md}

report

Render the reconciled findings in whichever format you need. The same data, three views:

$ atcr report --format md
$ atcr report --format json
$ atcr report --format checklist

One-shot it. atcr review --fail-on high runs review, reconcile, and a severity gate in a single command — drop it in CI to block a merge on a confirmed high-severity finding.

scorecard

Every atcr reconcile run writes a normalized per-reviewer evaluation record as a byproduct — no flag needed (pass --no-scorecard to suppress it for one run). Read one run's record with atcr scorecard, or aggregate across runs with atcr leaderboard:

$ atcr scorecard
REVIEWER   MODEL               RAISED  CORROBORATED  SURVIVED  COST
greta      claude-sonnet-4.6   12      6             0.80      $0.04
bruce      gpt-4o              9       5             0.71      $0.03
# which model finds the most real bugs, at what cost

MCP server

Run the same engine as an MCP stdio server so an agent host can call it as a tool:

$ atcr serve

Agent Skill

The companion Agent Skill contributes the host model's own review as the +1 source — so even a single API key yields two or more independent sources and a working confidence signal.