sim_receipt
Run a seeded scenario and get back the result PLUS a signed run receipt: an Ed25519 certificate over (model id, scenario, result hash, service revision) and the inputs the engine recorded for this run: inputs.modelDigest (the model after params), method, hours, samples, realizations and seed as run (with the scenario argument's defaults filled in, and samples at the engine's 60 when unset or below 2), marking (the scenario's overrides), rates (each constant rate the engine ran at; a delayed transition, and one running a schedule, has none), schedule, solver (entry point and options) and engine (go-pflow version from build info, "unknown" when the build carries none, and Go version). evidenceLevel is bound at issue; only POST /api/receipts/verify can report replayed, which it computes from its own re-run, and a scenario-run receipt never reaches proved. A receipt over the 1,048,576-byte body /api/receipts/verify reads (compact JSON) is refused before the run rather than issued (the inputs repeat each override, so a scenario overriding every rate of a very wide model can reach it), and so is engine: "ode": the continuous engine is not bit-reproducible, so its result hash could not be checked; take the receipt on the discrete engine. Anyone can check it two ways — verify the signature offline against the embedded public key (proves this service reported this result), and POST it to /api/receipts/verify (no auth) to replay the run and confirm the result hash reproduces (proves the run is reproducible, not invented); when what the engine reads now differs from the recorded inputs it names the changed keys in inputsChanged, with the new record in inputsNow. The current signing key is at GET /api/receipts/key. Reproducibility is the bottom rung of the trust ladder receipts build: play the model, check the anchors, re-run the seed, verify the certificate. The result is the engine's own form, the one POST /api/models/{id}/scenario returns: contended is the unsplit list with each entry's kind (only conserved and bounded are shortages; queue means the work had not arrived, and state that the model was in another phase of its cycle), not sim_scenario's split into contended, waitingForWork and neverFired, because the result hash covers the result exactly as returned. Costs 1 token from your account's compute bucket.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | model id to run | |
| scenario | No | scenario JSON (hours, samples, seed, marking, rates, schedule, summary — the same shape sim_scenario takes); sim_scenario's defaults (hours 8, realizations 16, seed 20260809) fill whatever is omitted, and the receipt's scenario records the filled-in values so its replay reproduces this run. The result hash covers the result as returned, so a summary: true scenario certifies the summarized form and replays to it |