Run record
One persona working through one scenario against one preview. The runner writes it and the reviewer completes it.
The run record is the source of truth for everything else. The results board is built from run records. The telemetry exporter reads run records and maps them to traces, metrics and logs. The schema is schema/run-record.schema.json in the repository, with its $id at https://dummyrun.dev/schema/run-record/v1.json. The eight synthetic examples in examples/runs/ validate against it in CI, and examples/generate-runs.py writes more for dashboards that need history.
Fields
One persona working through one scenario against one preview. Written by the runner, completed by the reviewer. Every table below comes from schema/run-record.schema.json, version 1. A field marked required must be present.
Top level
| Field | Type | Meaning |
|---|---|---|
batch | string | Optional ID grouping runs started together |
browserrequired | object | |
ended_atrequired | string (date-time) | |
findingsrequired | array of object | |
idrequired | string | Run ID: date, then a slug Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9-]+$ |
outcomerequired | one of completed, blocked, errored, budget_exhausted | completed: the persona finished its job. blocked: the app stopped it. errored: the harness failed. budget_exhausted: it ran out of steps or tokens |
personarequired | object | |
providerrequired | object | |
scenariorequired | object | |
schema_versionrequired | constant 1 | |
started_atrequired | string (date-time) | |
stepsrequired | array of object | |
targetrequired | object | |
usagerequired | object |
persona
| Field | Type | Meaning |
|---|---|---|
devicerequired | one of desktop, tablet, phone | |
idrequired | string | Pattern ^[a-z0-9-]+$ |
rolerequired | string | The app role the persona signs in with |
scenario
| Field | Type | Meaning |
|---|---|---|
idrequired | string | Pattern ^[a-z0-9-]+$ |
titlerequired | string |
target
| Field | Type | Meaning |
|---|---|---|
adapterrequired | string | Target adapter name, such as url or github-deployments |
base_urlrequired | string (uri) | |
commit | string | Pattern ^[0-9a-f]{7,40}$ |
environmentrequired | string | Preview ID, such as pr-42 |
provider
| Field | Type | Meaning |
|---|---|---|
kindrequired | string | vertex-gemini, anthropic, openai-compatible, azure-foundry |
modelrequired | string | |
regionrequired | string | Region the model ran in, or global |
browser
| Field | Type | Meaning |
|---|---|---|
namerequired | one of chrome, firefox | |
versionrequired | string |
usage
| Field | Type | Meaning |
|---|---|---|
cost_usd | number | |
input_tokensrequired | integer | |
model_callsrequired | integer | |
output_tokensrequired | integer |
steps, each item
| Field | Type | Meaning |
|---|---|---|
a11y_violations | integer | |
actionrequired | one of look, visit, click, fill, type, select, press, back, scroll, wait, a11y, screenshot, finish | |
atrequired | string (date-time) | |
console_errors | integer | |
duration_msrequired | integer | |
nrequired | integer | |
note | string | What the persona said about this step |
screenshot | string | Path relative to the run record |
status | integer | HTTP status of the page after the action |
target | string | Selector, label or URL the action used |
url | string | Page URL after the action |
findings, each item
| Field | Type | Meaning |
|---|---|---|
evidencerequired | one of measured, code, sourced, inferred | |
idrequired | string | Stable fingerprint, the same across runs that hit the same problem Pattern ^[a-z0-9-]+$ |
kindrequired | one of bug, permission, friction, accessibility, question | |
severityrequired | one of blocker, major, minor, info | |
stepsrequired | array of integer | |
titlerequired | string | |
verdictrequired | one of confirmed, rejected, pending | The reviewer's verdict |
An example record
This is examples/runs/2026-10-17-lin-contributor-008.json, one of the eight synthetic records in the repository. The persona lin-contributor checked a payment status in Inkwell on a tablet. The reviewer confirmed one permission finding and left one question pending.
Show the record (163 lines of JSON)
{
"schema_version": 1,
"id": "2026-10-17-lin-contributor-008",
"batch": "2026-10-17-pr-41",
"started_at": "2026-10-17T13:52:56.000Z",
"ended_at": "2026-10-17T13:54:03.183Z",
"persona": {
"id": "lin-contributor",
"role": "contributor",
"device": "tablet"
},
"scenario": {
"id": "check-payment",
"title": "Check a payment status"
},
"target": {
"adapter": "url",
"environment": "pr-41",
"base_url": "https://pr-41.inkwell.example",
"commit": "6e05e3e"
},
"provider": {
"kind": "anthropic",
"model": "claude-sonnet-5-5",
"region": "global"
},
"browser": {
"name": "firefox",
"version": "146.0"
},
"outcome": "completed",
"steps": [
{
"n": 1,
"at": "2026-10-17T13:52:56.000Z",
"action": "select",
"duration_ms": 4264,
"url": "https://pr-41.inkwell.example/issues",
"status": 200,
"console_errors": 0,
"target": "Assign to"
},
{
"n": 2,
"at": "2026-10-17T13:53:04.663Z",
"action": "click",
"duration_ms": 4204,
"url": "https://pr-41.inkwell.example/drafts",
"status": 200,
"console_errors": 0,
"target": "Title"
},
{
"n": 3,
"at": "2026-10-17T13:53:12.946Z",
"action": "select",
"duration_ms": 1340,
"url": "https://pr-41.inkwell.example/drafts",
"status": 200,
"console_errors": 0,
"target": "Submit"
},
{
"n": 4,
"at": "2026-10-17T13:53:18.659Z",
"action": "click",
"duration_ms": 3242,
"url": "https://pr-41.inkwell.example/drafts",
"status": 200,
"console_errors": 0,
"target": "Comment"
},
{
"n": 5,
"at": "2026-10-17T13:53:26.976Z",
"action": "look",
"duration_ms": 2924,
"url": "https://pr-41.inkwell.example/issues",
"status": 200,
"console_errors": 0,
"screenshot": "screens/008-05.png"
},
{
"n": 6,
"at": "2026-10-17T13:53:34.594Z",
"action": "type",
"duration_ms": 2631,
"url": "https://pr-41.inkwell.example/payments",
"status": 200,
"console_errors": 0,
"target": "Comment"
},
{
"n": 7,
"at": "2026-10-17T13:53:39.958Z",
"action": "look",
"duration_ms": 2891,
"url": "https://pr-41.inkwell.example/issues",
"status": 200,
"console_errors": 0,
"screenshot": "screens/008-07.png"
},
{
"n": 8,
"at": "2026-10-17T13:53:48.432Z",
"action": "visit",
"duration_ms": 1464,
"url": "https://pr-41.inkwell.example/issues",
"status": 200,
"console_errors": 0
},
{
"n": 9,
"at": "2026-10-17T13:53:54.110Z",
"action": "click",
"duration_ms": 1458,
"url": "https://pr-41.inkwell.example/payments",
"status": 200,
"console_errors": 0,
"target": "Assign to"
},
{
"n": 10,
"at": "2026-10-17T13:53:59.117Z",
"action": "finish",
"duration_ms": 1030,
"url": "https://pr-41.inkwell.example/reviews",
"status": 200,
"console_errors": 0
}
],
"findings": [
{
"id": "payment-status-wording",
"kind": "question",
"severity": "info",
"title": "The payment status 'settled' is unclear to a contributor",
"steps": [
5
],
"evidence": "inferred",
"verdict": "pending"
},
{
"id": "contributor-sees-rates-table",
"kind": "permission",
"severity": "major",
"title": "A contributor can open the rates table for all writers",
"steps": [
7
],
"evidence": "code",
"verdict": "confirmed"
}
],
"usage": {
"model_calls": 11,
"input_tokens": 62986,
"output_tokens": 3102,
"cost_usd": 0.2355
}
}