Provenance

Attribution traces

An attribution trace answers: which neurons drove each output token, and did they really? It runs as an async job against a traced inference and produces a graph plus a signed manifest.

How a trace is computed

  1. Decision tokens — the first 16 generated tokens, plus any later token where the model was unsure (top-1 vs top-2 logit margin under 1.0), capped at 32.
  2. Attribution — for each decision token, the direct contribution of every MLP neuron at the predicting position to that token's logit (direct-logit attribution, holding the final norm fixed). The top 24 become candidates. This step is an approximation: it ignores a neuron's indirect effects through later layers.
  3. Ablation — each candidate is zeroed in a re-run, and the actual change in the token's logit is recorded as ablation_delta. An edge is verified when |ablation_delta| ≥ 0.25. This is the measurement.

So every edge carries both numbers, and the viewer draws verified edges solid and attribution-only ("correlational") edges dashed.

Run one

# from a traced inference (re-send the exact text unless it was retained — it is checked against the hashes)
curl $API/v1/trace/traces -H "Authorization: Bearer $PRV_ACCOUNT_KEY" -H "Content-Type: application/json" \
  -d '{"trace_id": "trc_…", "messages": [...], "completion": "…"}'
# → 202 {"job_id": "tjob_…", "poll_url": "/v1/trace/jobs/tjob_…"}

curl $API/v1/trace/jobs/tjob_… -H "Authorization: Bearer $PRV_ACCOUNT_KEY"     # → status: completed
curl $API/v1/trace/traces/trc_… -H "Authorization: Bearer $PRV_ACCOUNT_KEY"   # → graph + manifest

Or send {"model": "…", "messages": [...]} without a trace_id: the job generates the completion (temperature 0), records the inference, then traces it. Message text rides the job only while it runs and is dropped from the job when it finishes. A finished job fires the trace.job_completed webhook.

The graph

{
  "method": "direct_logit_attribution+ablation",
  "verified_threshold": 0.25,
  "decision_tokens": [{ "position": 0, "token": "The", "logit": …, "margin": … }],
  "nodes": [{ "id": "L13.1053.pos", "layer": 13, "idx": 1053, "pole": "pos", "label": "max-activates on the token “tell”", "unexplained": false, "contributions": [...] }],
  "edges": [{ "source": "L13.1053.pos", "target": "tok:4", "contribution": 0.3764, "ablation_delta": 0.4947, "verified": true }],
  "timeline": [{ "position": 0, "nodes": ["…"] }]
}

Canary-set members are masked everywhere — even for you: they appear as opaque n_… ids with no layer, index or label, but with their measurements kept. In the viewer they sit in a hatched lane below the plot.

Share it

curl -X POST $API/v1/trace/traces/trc_…/share -H "Authorization: Bearer $PRV_ACCOUNT_KEY" -H "Content-Type: application/json" -d '{"mask":"public","expires_in":604800}'
# → {"token":"trs_…","share_url":"…/trace/share/trs_…"}  — the token is shown once
curl $API/v1/trace/share/trs_…     # public, keyless, CORS-open
curl -X DELETE $API/v1/trace/traces/trc_…/share -H "Authorization: Bearer $PRV_ACCOUNT_KEY"   # revoke

A public render contains the masked graph, readings, hashes and the manifest — never account ids, keys or message text. Numbers are rounded to 2 dp. mask: "account" renders your own account-private neurons in full for link holders; curated canary members stay masked either way.

A verified person can ask you to see the masked neurons on a share. You approve each request (or set auto), and they see the covered neurons in a watermarked, logged view. See neuron disclosure.

Pricing

trace_graph is metered when a job completes, after the monthly allowance (Developer 25, Growth 100). Share renders and manifest verification are free.

What a trace does not prove

It shows what computed the output. It does not show the output is correct, safe or true, and labels are approximations — the ablation deltas are what was measured.