# Bench request envelope

OpenRouter bench envelope (temperature 0, seed, json_schema name=prescription_rows, strict:false, usage.include). Production interpretPrescription is Base44 InvokeLLM({prompt, response_json_schema}) with model omitted, then sane() drops declined rows. Same RULES string; different envelope.

## OpenRouter POST (what the ledger measured)

```
POST https://openrouter.ai/api/v1/chat/completions
{
  "model": "<per run>",
  "temperature": 0,
  "seed": "<per run>",
  "usage": { "include": true },
  "response_format": {
    "type": "json_schema",
    "json_schema": { "name": "prescription_rows", "schema": <schema.json>, "strict": false }
  },
  "messages": [{ "role": "user", "content": RULES + "\n\nINPUT:\nL0: …" }]
}
```

## Reconstruct one call

1. `prompt.md` — RULES (once).
2. `context/<corpus_id>.json` — full `messages[0].content` for that transcript.
3. `schema.json` — SCHEMA.
4. `data/models/<slug>.json` — model, seed, tokens, cost, latency, expected vs actual.

Prompt text was not stored in the ledger; it is reconstructed with `extractInterpretConstants` + `inputToLines` from worktree SHA in `data/meta.json`.
