The panel

Nine reviewers. Nine lenses.

The default roster ships with atcr init as nine editable persona files. Each one reviews the same diff through a different focus and emits findings in the same pipe-delimited format — so the reconciler can cluster them by what they found, not who found it.

bruce

Generalist correctness
  • Inverted conditions, off-by-one, wrong operator
  • Ignored returns and swallowed errors
  • Code that does not do what its name promises
Canonical finding
HIGH|store/cache.go:88|Get returns stale entry after Invalidate|delete the key inside the same lock as Invalidate|correctness|20

greta

Algorithmic correctness
  • Boundary conditions: first/last, empty, overflow
  • Loop termination, invariants, accumulators
  • Numeric overflow, float comparison, div-by-zero
Canonical finding
HIGH|merge/cluster.go:51|window comparison uses < so delta-3 lands outside the cluster|use <= for the inclusive ±3 window|correctness|10

kai

Architecture & design
  • Boundary violations and upward imports
  • Hidden coupling and shared mutable state
  • The cost of the next change
Canonical finding
MEDIUM|internal/report/render.go:30|renderer reads reconcile internals directly|consume the exported findings.json schema instead|correctness|25

mira

Production feasibility
  • Missing timeouts, unbounded retries
  • Partial failures and resource exhaustion
  • What the 3am pager sees
Canonical finding
HIGH|client/http.go:61|no timeout on provider call|derive a per-call context with a deadline from config|performance|15

otto

Readability & idiom
  • Names that mislead the next maintainer
  • Structure that hides intent
  • Fighting the language instead of using it
Canonical finding
MEDIUM|util/slug.go:14|sanitize() also truncates and lowercases|split into sanitize/truncate/lower or rename to normalizeSlug|style|10

dax

Tests & error paths
  • Untested failure branches
  • Vacuous assertions that prove nothing
  • Over-mocked fixtures hiding real behavior
Canonical finding
HIGH|parse/stream_test.go:1|no test feeds a malformed header|add a case with an unknown version header expecting a hard error|testing|20

idiomatic

Go idioms & conventions
  • Swallowed errors and lost error wrapping
  • Leaked goroutines, missing cancellation
  • Interface abuse and stdlib reinvention
Canonical finding
HIGH|parse/num.go:14|error from strconv.Atoi discarded, bad input silently becomes 0|check and return the error instead of ignoring it|error|15

sentinel

Security & injection
  • Injection: SQL, command, template
  • Broken auth and predictable tokens
  • Leaked secrets and insecure defaults
Canonical finding
CRITICAL|store/users.go:42|user input concatenated into SQL query enables injection|use a parameterized query with placeholders|injection|20

tracer

Performance & resource
  • N+1 queries and unbatched calls
  • Unbounded caches and leaked resources
  • Accidental O(n²) and hot-path allocation
Canonical finding
HIGH|store/orders.go:88|query inside range loop issues one DB call per row (N+1)|batch the ids into a single WHERE id IN (...) query|n+1|25

The roster is yours. Personas are plain markdown files in .atcr/personas/. Edit a focus, change a model binding, drop one, or add your own — a Redis concurrency specialist for one PR, a protobuf reviewer for another. The reconciler does not care how many panelists there are; it only cares which findings overlap.

Why heterogeneous

Different models miss different things.

A panel of one model run nine times still has one model's blind spots. atcr binds personas to different models and providers on purpose: when two independent models — not two prompts — catch the same bug, that agreement is the confidence signal the reconciler scores.