The inspector

Every fan-out leaves a receipt. Each peer’s tokens, dollars, latency, and raw text are written into the per-exchange trace at finalize time, and the inspector is the surface that lets you read them. The inspector is where you go to answer “why did this turn cost what it cost,” “which peer wrote the words I’m reading,” and “what did the others say that didn’t make it in.” It is the audit layer on top of consensus.

Opening the inspector

Press ⌘⇧I from anywhere in the chat window. The inspector slides in as a third column on the right; press the same shortcut again to dismiss it. There is also a toolbar button in the main view that does the same thing, and a “Toggle Inspector” entry in the View menu — the keyboard shortcut is what you’ll reach for most often.

The inspector is per-exchange, and it follows the newest turn on its own — the one streaming, or the last one that finished. Pivoting to an older turn takes an explicit action: View trace in that answer’s action row (alongside Copy and Regenerate) selects that exchange, opening the inspector if it was closed. Clicking a citation link in the answer text, or a provider pill in its SOURCES row, does the same and lands on that peer’s card. Plain body text is not a pivot target, though — clicking a turn at large leaves the inspector where it was. Conversations keep their traces — closing and reopening a session brings them back, and they survive a Polycode restart because they live in the same local store as the chat itself.

The consensus overview card

The top of a finished trace is the consensus overview card — a Polycode halo, a “Consensus reached” label, and two mono caption lines:

4/4 answered · 1240ms
1 split · 1 solo · Σ $0.0104

The first line is attendance: how many dispatched peers returned a successful response, and the total fan-out time — the slowest peer’s latency, since fan-out is parallel and the round ends when the last peer settles.

The second line is what the panel did. 1 split · 1 solo counts the claims in the answer the panel diverged on and the claims only one side spoke to (No splits when there were none of either). Σ $0.0104 is the aggregate for the whole exchange, folding in every peer plus the synthesis lane, and every round when a debate ran; · N unpriced is appended when some models carry no listed pricing.

The agreement bar

Beneath the captions is a three-segment bar, and beneath that its legend:

50% uncontested · 25% split · 25% solo   ⓘ

This measures agreement, not attendance — the two are different numbers and the card shows both. Each sentence or list item of the synthesized answer is classified from its own citations: uncontested where the answer cites nobody, split where it cites two or more sides, solo where it cites one. The ⓘ states the rule in the app:

Uncontested sentences carry no citation, because synthesis never cites universal agreement. A split cites two or more sides. A solo cites one side.

The segments read left to right in that order. A sentence that only acknowledges an unavailable provider (“Gemini timed out before returning”) is a status note and is left out of the percentages entirely, so a provider failing never inflates the agreement figure.

Fan-out and consensus walks through the rule and its limits; disagreement and adoption covers what you can do with a split once you’ve found one.

While a fan-out is still running there is no consensus card at all — the top of the trace is the live primary-lane card, whose status chip walks through queued, TTFT Nms, synthesizing…, and ready as the round progresses. The consensus card appears once the whole exchange finalizes.

Provider Trace⌘⇧I
Per-provider trace
A
Anthropic
Claude Sonnet 4.6
streaming · usage pending
streaming
queued
O
OpenAICritic
GPT-4o
streaming · usage pending
streaming
TTFT 210ms
G
Gemini
Gemini 2.5 Pro
streaming · usage pending
streaming
…
Apple Intelligence
Apple System Language Model
streaming · usage pending
streaming
TTFT 95ms
Inspector while a fan-out is in flight

Per-provider trace cards

Below the header, one trace card per peer. Each card carries the provider logo, the model name, and a tiny chip on the right summarizing status and latency.

Provider Trace⌘⇧I
Consensus reached
4/4 answered · 1240ms
1 split · 1 solo · Σ $0.0104
50% uncontested · 25% split · 25% soloi
Per-provider trace
A
Anthropic
Claude Sonnet 4.6
✓ 1240ms
First tok
280ms
Total
1240ms
In / Out
847 / 412
Cost
$0.0024
O
OpenAICritic
GPT-4o
✓ 1100ms
First tok
210ms
Total
1100ms
In / Out
847 / 489
Cost
$0.0031
CopyDiff vs answerUse as answer
G
Gemini
Gemini 2.5 Pro
✓ 860ms
First tok
330ms
Total
860ms
In / Out
847 / 376
Cost
$0.0008
Apple Intelligence
Apple System Language Model
✓ 420ms
First tok
95ms
Total
420ms
In / Out
847 / 312
Cost
Free
Inspector after a four-peer fan-out finishes

The primary peer — the one whose synthesis you’re reading in the chat — is marked with a crown and a heavier border. That visual cue answers “whose words am I actually reading” without needing to cross-reference the synthesis prompt or the provider list.

The 4-stat grid

Each finalized trace card carries a 2×2 stat grid:

  • First tok — how long until this peer started streaming. The live-feel number. Captured from the first .textDelta chunk the peer emitted; held in a lock-protected per-peer store and stamped onto the response at finalize time.
  • Total — how long until this peer finished. The wallclock latency.
  • In / Out — token counts as reported by the provider.
  • Cost — dollars for this peer’s call, computed at exchange time from the model’s listed pricing × the tokens used. The figure is locked in when the exchange runs; later pricing changes don’t retroactively rewrite it. A model with no listed pricing renders —; an on-device model renders Free.

Cells render as monospaced numbers so trace cards line up cleanly when you’re comparing two peers side by side. A peer that never streamed (timeout, cancel, no chunks) renders First tok as — — graceful degradation for the cases where a real value doesn’t exist.

Drilling into one peer

Each card carries a Full response disclosure — click it to read that peer’s complete text. A peer that called a tool gets a second, independent TOOLS (N) disclosure below the body: it’s on the card whether or not the text is expanded, it opens and closes on its own, and it auto-opens when a call failed (its header then appends · N failed). The crown on the primary’s card marks which peer’s words ended up in the synthesized reply, so “whose answer am I reading” is answerable from the trace alone.

If two peers disagreed, you no longer have to find that by expanding cards and comparing prose. A Where the panel split section sits between the overview card and the trace stack, with a card per contested claim naming the sides and quoting each one — and hovering a finished card reveals Copy, Diff vs answer, and Use as answer. All of that is covered in disagreement and adoption. The full response well remains the place to read a peer’s argument unmediated and at length.

Roles and rounds

Two things a mode can change show up on the trace cards.

A Critic is labelled. A mode can give any panel member the Critic role, which asks it to argue the strongest case against the likely consensus and name failure modes while still giving a complete answer. Its trace card — and its side of any split card — carries a Critic chip, so an outlying reply reads as the role doing its job rather than as a provider being wrong. The primary is always a Panelist and never carries a chip.

A debate round is disclosed. With Rounds set to Debate, every peer runs twice: it sees the other peers’ first drafts (labelled Draft A, Draft B, … with no provider names attached) and revises once before synthesis. On a finished debate exchange each card’s final is its round-2 reply, and the superseded draft sits under a Round 1 draft disclosure with its own latency, tokens, and cost.

Provider Trace⌘⇧I
Consensus reached
4/4 answered · 1240ms
1 split · 1 solo · Σ $0.0158
50% uncontested · 25% split · 25% soloi
Per-provider trace
A
Anthropic
Claude Sonnet 4.6
✓ 1240ms
First tok
280ms
Total
1240ms
In / Out
847 / 412
Cost
$0.0024
▸Round 1 draft
1120ms · 847 / 388 tok · $0.0021
O
OpenAICritic
GPT-4o
✓ 1100ms
First tok
210ms
Total
1100ms
In / Out
847 / 489
Cost
$0.0031
▸Round 1 draft
980ms · 847 / 402 tok · $0.0026
CopyDiff vs answerUse as answer
G
Gemini
Gemini 2.5 Pro
✓ 860ms
First tok
330ms
Total
860ms
In / Out
847 / 376
Cost
$0.0008
▸Round 1 draft
820ms · 847 / 361 tok · $0.0007
Apple Intelligence
Apple System Language Model
✓ 420ms
First tok
95ms
Total
420ms
In / Out
847 / 312
Cost
Free
▸Round 1 draft
395ms · 847 / 298 tok · Free
A finished debate exchange — each card's round-2 final disclosing the round-1 draft it superseded

Every round is a billed call, so both rounds count toward the aggregate Σ and toward Settings → Usage. That is why a debate exchange costs roughly twice a single pass, and why its Σ is not the sum of the visible finals.

While the extra round is in flight the overview card says so — the title becomes Debate in progress and the caption reads Debate round · N revising in place of the attendance line, with no counts and no bar, because no finalized rows exist yet.

Tool calls live in the trace

When a peer calls a tool — a built-in file tool or an MCP tool — the call shows up inline on that peer’s card under the TOOLS (N) disclosure: the tool name, a best-effort target path lifted from the call’s arguments, and a single trailing status. The statuses are mutually exclusive, not stacked. A call that ran shows its latency (412ms); a repeat call served from the answer’s execution cache shows cached instead — the work ran once, and this row joined the shared result. A call that errored shows failed (412ms) (or failed · cached). A call that never produced a result shows pending, running, or — if you denied it — rejected, with no latency. The tools and approvals article covers the approval model end-to-end; this section here just notes that the audit trail lives in the inspector, attributed per peer, so “which peer called what tool, and how did that call end” is a single click away.

Per-exchange, not per-session

A common confusion: the inspector is per-turn, not per-conversation. The trace data lives on the exchange record, so an inspector pane bound to turn 3 of a conversation shows turn 3’s fan-out — point it at turn 7 and you see turn 7’s. Receipts travel with the conversation history; deleting a conversation deletes its traces.

What’s next

  • Fan-out and consensus — the math behind the numbers the inspector reports.
  • Disagreement and adoption — the split cards, the compare sheet, and adopting a peer’s reply as the answer.
  • Tools and approvals — how tool calls show up inline in trace cards and how to manage the approvals that govern them.
  • FAQ — short answers to the questions inspector traces often raise.