Case File Protocol v0.1
A case file is a single JSON document. One run = one case file.
Top-level shape
{
"version": "0.1",
"question": "why did checkout fail around 3am?",
"model": { "provider": "anthropic", "name": "claude-sonnet-4-6", "temperature": 0.2 },
"logs_manifest": { "files": [...], "time_window": {...}, "total_rows": 72 },
"trajectory": [ /* Step[] */ ],
"report": { /* IncidentReport | null */ },
"termination_reason": "submitted", // or max_iterations, max_llm_calls, max_wall_clock, aborted, error
"usage": { "llm_calls": 7, "tool_calls": 6, "wall_clock_s": 42, "input_tokens": 18200, "output_tokens": 2100 },
"ground_truth": null // optional, for eval
}
EvidenceLine
Every evidence citation carries up to ±3 surrounding lines of context so the viewer can show what happened around the cited event without re-reading the source logs:
{
"event_id": "vault-rotate-stripe-2026-04-17T02:58:04Z",
"file": "logs/vault.log.jsonl",
"line": 3,
"ts": "2026-04-17T02:58:04Z",
"service": "vault",
"level": "info",
"text_redacted": "secret rotated old_version=6 new_version=7",
"context_before": [], // up to 3 redacted lines
"context_after": [], // up to 3 redacted lines
"why": "the rotation is the precipitating event",
"is_key": true
}
text_redacted and context_* have already been through the secret redactor. No raw
Bearer tokens, Stripe keys, AWS access keys, JWTs, or private keys should ever appear
in a case file.
Breaking changes
The version field is a string literal ("0.1"). Any change that alters field names,
types, required-ness, or meaning bumps this. The Python pydantic model and the TypeScript
zod schema in the viewer are kept in lock-step.