diff --git a/CAPABILITIES.md b/CAPABILITIES.md index f23ae086bf..e9353b06de 100644 --- a/CAPABILITIES.md +++ b/CAPABILITIES.md @@ -275,6 +275,7 @@ improvising or retrying when something is off. | Teach over MCP: an agent does a new task once through OpenAdapt; the run is read back, compiled and admitted (a person confirms the record check; the agent admits only under a person-signed policy), and becomes a tool it calls with no model calls. Web, and Windows, macOS, Linux, RDP and Citrix with a person approving each save | On main ([#1335](https://github.com/OpenAdaptAI/OpenAdapt/pull/1335)) | Synthetic (MockMed over MCP, and through the real RDP and Citrix backends) | `openadapt-agent serve --teach`, [packages/agent](packages/agent/README.md#teach-a-new-workflow-from-your-agent) | | Turn a read-only browser task into a tool for the coding agent you already use: `openadapt setup` registers the MCP server and a skill in Claude Code, Cursor, Codex and Gemini CLI (idempotent, `--dry-run`, `--undo`); the agent does the task once through `teach_start`/`teach_act`/`teach_finish`, the task must end in a download, the file is checked (columns, a column between two inputs or equal to one, fewest rows), the compiled steps are replayed once with no model, and the agent gets a `taught_` tool that downloads a checked file with new inputs. The browser sends no POST, PUT, PATCH or DELETE and stays on one site; a compiled run stops when a control is missing, matches more than one element, or is relabelled | On main ([#1502](https://github.com/OpenAdaptAI/OpenAdapt/pull/1502)) | Real headless Chromium on the local example portal (scripted MCP client, in CI); a real Claude Code agent taught the export from the guide's prompt and called the tool with new dates (2026-10-24, one run) | `openadapt setup`, `openadapt-agent serve --teach-browser`, [FIRST_TOOL.md](packages/flow/docs/FIRST_TOOL.md) | | Verify any agent's own writes: `openadapt verify` reads the system of record before and after a write, against a contract the operator owns (REST, FHIR, SQL, GraphQL), and returns a verified receipt (`openadapt.effect-receipt/v1`) or a refusal (`REFUTED`, `UNCERTAIN`), never an unverified success. Python SDK (`openadapt.verify`, which is `openadapt_flow.verifier`: `begin_write`, `verify_write`, `verified_write`) wraps a write in any agent framework; the MCP server (`openadapt verify serve`) offers `verify_begin`, `verify_check` and `verify_recheck` to any MCP client | On main ([#1589](https://github.com/OpenAdaptAI/OpenAdapt/pull/1589)) | Synthetic (MockMed's fault server over real HTTP: correct write, wrong record, not saved, saved twice, unreadable store) | `openadapt verify`, [VERIFY_WRITES.md](packages/flow/docs/VERIFY_WRITES.md) | +| See what your own agent gets wrong, with no risk: `openadapt shadow` is a loopback pass-through proxy beside the agent. It checks each write against the system of record (FHIR through `ensure_record`; SQL through the verifier's whole-database frame), checks each `CONFIRMED` again later, and writes `report.html` and `report.json`. It never blocks, changes or resends a write; the only delay is the read before a write (at most `hold_ms`) | [#1678](https://github.com/OpenAdaptAI/OpenAdapt/pull/1678) | Real app (Medplum 5.2.8, 37 cases through a fault proxy: scripted agent 18 of 18 harms caught, 0 correct writes refuted; Claude Sonnet 5.5 9 of 9 caught, 4 correct but corrected writes refuted; 0 writes by the shadow; 15 to 25 ms median added per write; setup 76.5 s machine time, 3 decisions); real app, SQL mode (Dolibarr 21 on MariaDB 11.4, 13 cases: 8 of 8 harms caught, 5 of 5 correct writes confirmed, 292 ms median added); synthetic (SQLite) | `openadapt shadow`, [SHADOW_MODE.md](packages/flow/docs/SHADOW_MODE.md), [SHADOW_RESULTS.md](packages/flow/benchmark/fhir_medplum/public/SHADOW_RESULTS.md) | | Skill cache for framework agents: an agent in any framework does a browser task through compile-agent's harness as plain tools (`BrowserTools`); when the system of record shows exactly the task's record and the operator confirms the checks, the run is canaried, admitted and emitted as an MCP server. A repeat of the same task (instruction, record, app, contract, environment) calls that tool instead of the agent: no model calls, the program's checks and this task's record check on every run, eviction after a failed run | On main | Synthetic (MockMed, LangGraph on `claude-sonnet-5-5`, 3 trials, repeats on the same record: run 1 6 model calls and $0.022; runs 2 to 10 27/27 VERIFIED, 0 model calls, 7.8 s median); Trac 1.6: run 1 verified, not admitted | `openadapt_flow.integrations.agents.skills`, [benchmark/skill_cache](packages/flow/benchmark/skill_cache/README.md) | | Verified write tools for agent frameworks: `verified(tool, contract=...)` wraps a Claude Agent SDK, OpenAI Agents SDK, LangGraph or CrewAI write tool in one line. The contract and any values the operator pins come from the operator, never the agent's arguments; the store is read before and after; the agent gets a receipt or a refusal, and a refused write is held instead of retried | On main | Synthetic (each framework's own agent loop with a scripted model, writing through the example app's order form over real HTTP: verified save, a save the app drops, a save it keeps twice); one real-model run per framework, opt-in | `openadapt_flow.integrations.agents`, extras `claude-agent-sdk`, `openai-agents`, `langgraph` (CrewAI: install `crewai` beside it); [AGENT_FRAMEWORKS.md](packages/flow/docs/AGENT_FRAMEWORKS.md) | | Teach a browser write as a verified tool: with write contracts (`serve --teach-browser --contracts DIR`), the agent teaches a save once; run 1 is verified in the system of record before the `taught_` tool exists, and every call makes the write and returns a verified receipt or a refusal. Sign-in values come from the server's environment and never reach the agent or the program. Controls in named iframes are found through their frame | On main ([#1589](https://github.com/OpenAdaptAI/OpenAdapt/pull/1589)) | Synthetic (the example app's sign-in and order form in headless Chromium over MCP: verified save, a save the app drops, a save it keeps twice) | `openadapt-agent serve --teach-browser --contracts`, [VERIFY_WRITES.md](packages/flow/docs/VERIFY_WRITES.md#teach-a-write-as-a-tool) | @@ -423,6 +424,7 @@ A test fails when a command has no file or this list is out of date. **Guard an agent you already run:** - `guard`: Attaches to the agent's own Chromium over CDP, holds each save until the right record is on screen, reads it back, and hands a verified run to the teach dir. +- `shadow`: Shadow a FHIR or HTTP agent: check each write against the system of record without blocking it, and report. diff --git a/llms-full.txt b/llms-full.txt index 64d75e9fde..e86b08513c 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -672,6 +672,7 @@ improvising or retrying when something is off. | Teach over MCP: an agent does a new task once through OpenAdapt; the run is read back, compiled and admitted (a person confirms the record check; the agent admits only under a person-signed policy), and becomes a tool it calls with no model calls. Web, and Windows, macOS, Linux, RDP and Citrix with a person approving each save | On main ([#1335](https://github.com/OpenAdaptAI/OpenAdapt/pull/1335)) | Synthetic (MockMed over MCP, and through the real RDP and Citrix backends) | `openadapt-agent serve --teach`, [packages/agent](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/agent/README.md#teach-a-new-workflow-from-your-agent) | | Turn a read-only browser task into a tool for the coding agent you already use: `openadapt setup` registers the MCP server and a skill in Claude Code, Cursor, Codex and Gemini CLI (idempotent, `--dry-run`, `--undo`); the agent does the task once through `teach_start`/`teach_act`/`teach_finish`, the task must end in a download, the file is checked (columns, a column between two inputs or equal to one, fewest rows), the compiled steps are replayed once with no model, and the agent gets a `taught_` tool that downloads a checked file with new inputs. The browser sends no POST, PUT, PATCH or DELETE and stays on one site; a compiled run stops when a control is missing, matches more than one element, or is relabelled | On main ([#1502](https://github.com/OpenAdaptAI/OpenAdapt/pull/1502)) | Real headless Chromium on the local example portal (scripted MCP client, in CI); a real Claude Code agent taught the export from the guide's prompt and called the tool with new dates (2026-10-24, one run) | `openadapt setup`, `openadapt-agent serve --teach-browser`, [FIRST_TOOL.md](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/flow/docs/FIRST_TOOL.md) | | Verify any agent's own writes: `openadapt verify` reads the system of record before and after a write, against a contract the operator owns (REST, FHIR, SQL, GraphQL), and returns a verified receipt (`openadapt.effect-receipt/v1`) or a refusal (`REFUTED`, `UNCERTAIN`), never an unverified success. Python SDK (`openadapt.verify`, which is `openadapt_flow.verifier`: `begin_write`, `verify_write`, `verified_write`) wraps a write in any agent framework; the MCP server (`openadapt verify serve`) offers `verify_begin`, `verify_check` and `verify_recheck` to any MCP client | On main ([#1589](https://github.com/OpenAdaptAI/OpenAdapt/pull/1589)) | Synthetic (MockMed's fault server over real HTTP: correct write, wrong record, not saved, saved twice, unreadable store) | `openadapt verify`, [VERIFY_WRITES.md](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/flow/docs/VERIFY_WRITES.md) | +| See what your own agent gets wrong, with no risk: `openadapt shadow` is a loopback pass-through proxy beside the agent. It checks each write against the system of record (FHIR through `ensure_record`; SQL through the verifier's whole-database frame), checks each `CONFIRMED` again later, and writes `report.html` and `report.json`. It never blocks, changes or resends a write; the only delay is the read before a write (at most `hold_ms`) | [#1678](https://github.com/OpenAdaptAI/OpenAdapt/pull/1678) | Real app (Medplum 5.2.8, 37 cases through a fault proxy: scripted agent 18 of 18 harms caught, 0 correct writes refuted; Claude Sonnet 5.5 9 of 9 caught, 4 correct but corrected writes refuted; 0 writes by the shadow; 15 to 25 ms median added per write; setup 76.5 s machine time, 3 decisions); real app, SQL mode (Dolibarr 21 on MariaDB 11.4, 13 cases: 8 of 8 harms caught, 5 of 5 correct writes confirmed, 292 ms median added); synthetic (SQLite) | `openadapt shadow`, [SHADOW_MODE.md](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/flow/docs/SHADOW_MODE.md), [SHADOW_RESULTS.md](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/flow/benchmark/fhir_medplum/public/SHADOW_RESULTS.md) | | Skill cache for framework agents: an agent in any framework does a browser task through compile-agent's harness as plain tools (`BrowserTools`); when the system of record shows exactly the task's record and the operator confirms the checks, the run is canaried, admitted and emitted as an MCP server. A repeat of the same task (instruction, record, app, contract, environment) calls that tool instead of the agent: no model calls, the program's checks and this task's record check on every run, eviction after a failed run | On main | Synthetic (MockMed, LangGraph on `claude-sonnet-5-5`, 3 trials, repeats on the same record: run 1 6 model calls and $0.022; runs 2 to 10 27/27 VERIFIED, 0 model calls, 7.8 s median); Trac 1.6: run 1 verified, not admitted | `openadapt_flow.integrations.agents.skills`, [benchmark/skill_cache](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/flow/benchmark/skill_cache/README.md) | | Verified write tools for agent frameworks: `verified(tool, contract=...)` wraps a Claude Agent SDK, OpenAI Agents SDK, LangGraph or CrewAI write tool in one line. The contract and any values the operator pins come from the operator, never the agent's arguments; the store is read before and after; the agent gets a receipt or a refusal, and a refused write is held instead of retried | On main | Synthetic (each framework's own agent loop with a scripted model, writing through the example app's order form over real HTTP: verified save, a save the app drops, a save it keeps twice); one real-model run per framework, opt-in | `openadapt_flow.integrations.agents`, extras `claude-agent-sdk`, `openai-agents`, `langgraph` (CrewAI: install `crewai` beside it); [AGENT_FRAMEWORKS.md](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/flow/docs/AGENT_FRAMEWORKS.md) | | Teach a browser write as a verified tool: with write contracts (`serve --teach-browser --contracts DIR`), the agent teaches a save once; run 1 is verified in the system of record before the `taught_` tool exists, and every call makes the write and returns a verified receipt or a refusal. Sign-in values come from the server's environment and never reach the agent or the program. Controls in named iframes are found through their frame | On main ([#1589](https://github.com/OpenAdaptAI/OpenAdapt/pull/1589)) | Synthetic (the example app's sign-in and order form in headless Chromium over MCP: verified save, a save the app drops, a save it keeps twice) | `openadapt-agent serve --teach-browser --contracts`, [VERIFY_WRITES.md](https://github.com/OpenAdaptAI/OpenAdapt/blob/main/packages/flow/docs/VERIFY_WRITES.md#teach-a-write-as-a-tool) | @@ -820,6 +821,7 @@ A test fails when a command has no file or this list is out of date. **Guard an agent you already run:** - `guard`: Attaches to the agent's own Chromium over CDP, holds each save until the right record is on screen, reads it back, and hands a verified run to the teach dir. +- `shadow`: Shadow a FHIR or HTTP agent: check each write against the system of record without blocking it, and report. diff --git a/openadapt/cli.py b/openadapt/cli.py index dccb57cbef..6c046d70a9 100644 --- a/openadapt/cli.py +++ b/openadapt/cli.py @@ -1435,6 +1435,27 @@ def verify_ledger_release( click.echo(f"{key} released by {by} (found {found})") +@main.command( + "shadow", + context_settings={"ignore_unknown_options": True, "allow_extra_args": True}, +) +@click.pass_context +def shadow(command_ctx: click.Context) -> None: + """Check each write your agent makes against the system of record. + + Never blocks or changes a write; writes report.html and report.json. + Every argument passes to `openadapt flow shadow`; its options are listed + by `openadapt flow shadow --help`. + """ + if "shadow" not in _flow_verbs(): + click.echo( + "Error: the installed openadapt-flow has no shadow command.", err=True + ) + click.echo("Upgrade with: pip install --upgrade openadapt", err=True) + sys.exit(2) + _run_flow(["shadow", *command_ctx.args]) + + @main.command( "agent", context_settings={ diff --git a/packages/flow/CHANGELOG.md b/packages/flow/CHANGELOG.md index 879ed736a2..fd1f789ebd 100644 --- a/packages/flow/CHANGELOG.md +++ b/packages/flow/CHANGELOG.md @@ -19,6 +19,8 @@ ### Features +- Shadow mode: `openadapt shadow` runs beside an agent you already have, as a loopback pass-through proxy, and checks each write it makes against the system of record (`CONFIRMED`, `REFUTED`, `UNCERTAIN`). It never blocks, changes or resends a write; the only delay is the read before a write, at most `hold_ms`, measured per write. FHIR writes are checked by `ensure_record.verify_ensure` and SQL writes by `verifier.begin_write`/`verify_write` with the whole-database frame. Each `CONFIRMED` is checked again later (`recheck_s`, or the contract's `recheck_after_s`), and a late `REFUTED` gets its own line in `report.html` and `report.json`. `verify_ensure` takes `declared`: resources of other writes the caller saw, judged on their own ([#1678](https://github.com/OpenAdaptAI/OpenAdapt/pull/1678)). + - The whole-database frame (`frame.database`) and its recheck now work on PostgreSQL (`dialect: postgresql`). The snapshot is one read-only repeatable-read transaction over every schema but the system ones. Every column type is read as text by a declared rule, in a session pinned to UTC and exact float output: `numeric` at full precision (with its stored scale when it has no declared one), floats exactly, `bytea` as hex, `json` as stored and `jsonb` canonical, arrays, ranges, enums, domains, `uuid`, network, time, `interval`, `money`, bit, `xml`, text-search and geometric types. A table without a primary key is keyed by the whole row, with duplicates counted. A column type without a rule, a table the account can't read in full (no `SELECT`, row-level security), a foreign table and an unreadable sequence are refused unless the allow-list skips them with a reason. A sequence a column owns is that table's counter, and a counter set back counts as a change; any other sequence is compared as a one-row table. Large objects are read by the SHA-256 of their content. `frame.database.schemas` means the same as on MySQL (each must be visible, and every visible schema is read); a schema is left out only by an `allow_tables` entry `.*` with `mode: skip` and a reason. - A lost update now stops the run. `frame.versions` names a read of the target's versions (HAPI's `hfj_res_ver`, a version column, or an app's action-history table) and, where the app records one, the author of each version. The verifier reads them before and after the write; a version of a pre-existing target by anyone other than the agent, or more than one version step when no author is read, refutes the frame. A versions read that fails, a target with no version, or a version with no author leaves the frame not checked. The receipt holds counts and a problem code (`evidence.frame.versions`). Contracts without `frame.versions` keep their digests. diff --git a/packages/flow/benchmark/fhir_medplum/public/SHADOW_RESULTS.md b/packages/flow/benchmark/fhir_medplum/public/SHADOW_RESULTS.md new file mode 100644 index 0000000000..f6dd3860e0 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/SHADOW_RESULTS.md @@ -0,0 +1,162 @@ +# Shadow mode on live Medplum + +Shadow mode (`openadapt shadow`, [SHADOW_MODE.md](../../../docs/SHADOW_MODE.md)) +ran beside two agents on the 37 cases of this benchmark, on 2026-10-31. The +agent wrote through the shadow, then through the fault proxy, then to +Medplum 5.2.8: + +``` +agent -> shadow (checks, never blocks) -> fault proxy (breaks writes) -> Medplum +``` + +So the shadow saw what the agent sent, and Medplum held what the faults made +of it. The end-state oracle (`oracle.py`) decided what really happened in +each case. Runner: `shadow_run.py`. Data: `results/shadow/`. + +## What it caught + +| | Scripted agent | Claude Sonnet 5.5 (Agent SDK) | +|---|---:|---:| +| Harmful end states | 18 | 9 | +| Caught at the check (REFUTED) | 17 | 8 | +| Caught on the recheck (REFUTED later) | 1 | 1 | +| Missed | 0 | 0 | +| Correct writes CONFIRMED (check and recheck) | 13 | 18 | +| Correct writes REFUTED | 0 | 4 | +| Writes that never landed: UNCERTAIN | 2 | 1 | +| Writes seen, in checks | 33 in 33 | 42 in 32 | + +- **The recheck** caught A10 for both agents. In A10, the fault proxy adds a + second allergy with the agent's own credential after the agent has + answered and the first check has passed. The recheck runs over the window + since the first check. In the benchmark it runs as soon as the case ends, + before the next case empties the server, so each recheck window holds one + case. No run here used the command's 300 s default, and none measured a + recheck whose window spans several tasks; `SHADOW_MODE.md` says what such + a window does. +- **Claude's 4 correct writes REFUTED** are the benchmark's own 4 hard + cases: A04, A05, AP03 and AP11. In each, the fault proxy saved the record + as a different patient, substance or slot, and Claude fixed it with one PUT. + The end state is right. The record was the wrong one for a while, so the + verifier sends it to a person. The report files it under "saved as another + record first, then corrected". `README.md` describes the same 4 cases for + the benchmark's own verifier arm. +- **UNCERTAIN, never CONFIRMED,** for a write that didn't land. P11: the + server refused it. P13: a reply said "created" and nothing was saved; the + Claude agent retried P11 and its retry landed. + +How they landed wrong, as the report groups them (scripted agent): a value +differs from what the agent sent (9), another record changed (4), saved more +than once (3), holds a value the agent didn't send (1), changed after the +check (1). + +## It adds no writes and doesn't change them + +- Medplum's audit trail shows **0** creates, updates or deletes by the + shadow's read credential in either run. +- In every case, the fault proxy received exactly as many writes as the agent + sent to the shadow. +- `tests/test_shadow.py` checks that the bytes the app receives are the + bytes the agent sent, and that a shadow failure still sends the write on. + +## Overhead + +The only delay is the read before a write's first request. It holds the +write until the store has been read, for at most `hold_ms` (2,000 ms). + +| | Median | Largest | +|---|---:|---:| +| Scripted agent, added per write | 15.2 ms | 37.8 ms | +| Claude agent, added per write | 25.3 ms | 45.0 ms | + +Medplum ran on loopback in a Podman VM on the same Mac. + +## Setup time (the B4 bar: at most 60 minutes, at most 3 decisions) + +`shadow_setup_timing.py` ran each step a vendor takes against the running +Medplum, and timed it (`results/shadow/setup/setup-timing.json`): + +| Step | Time | +|---|---:| +| 1. A read credential for the shadow (a new client application) | 0.1 s | +| 2. The agent's actor reference (`/auth/me`; Medplum's sign-in took 61 s) | 61.1 s | +| 3. `shadow.yaml` (5 lines) and the three reference contracts, copied | 0.0 s | +| 4. `openadapt shadow --config shadow.yaml` started | 0.6 s | +| 5. The agent's first task, its check, its recheck (`--recheck-s 3`) and the report | 14.6 s | +| **Machine time, from nothing to a confirmed and rechecked first write** | **76.5 s** | + +With the 300 s default, step 5 waits about 5 minutes more for the recheck. + +It took three decisions: + +1. which server the agent writes to; +2. which contracts (the reference ones, used as they are); +3. the shadow's read credential and the agent's actor reference. + +Installing took 1 s from a warm cache. The benchmark's own cold install took +under a minute (`README.md`). + +A script can't time a person reading the guide, creating a client in +Medplum's admin app, or deciding. No person was timed. The bar's 60 minutes +leaves about 57 for those three decisions. This measures the steps, not a +first-time vendor. + +In the first timing run the shadow flagged a real duplicate. The scripted +agent searches by family name only. A person an earlier timing run had +registered (same email, phone and birth date, a different family name) was +created again, and the shadow reported "1 other record(s) are now also the +person". The timing task now uses a new person each run. + +## SQL mode on a live app: Dolibarr + +The same day, SQL mode ran on Dolibarr 21.0.4 with MariaDB 11.4.13. The +agent created customers through Dolibarr's REST API, and the shadow checked +each create with a `verify.yaml` that diffs the whole database. A fault proxy +broke the writes in five ways, two cases each: + +- a changed value; +- the create sent twice; +- an edit to another customer with the agent's own key; +- that edit 5 s after the check; +- a lost reply (correct end state). + +There were also four correct creates. + +| | Result | +|---|---| +| Harms caught | 8 of 8; the 2 late edits were caught on the recheck | +| Correct writes CONFIRMED, at the check and the recheck | 5 of 5 | +| Agent writes equal proxy writes | yes | +| The shadow's database accounts | SELECT only; the frame's account also has SHOW VIEW and TRIGGER, to read trigger definitions | +| Added per write, median / largest | 292 / 321 ms | + +The read before a SQL write is a whole-database snapshot, so it adds more +time than a FHIR search does. The fixture and contract are internal, so this +run's data is kept with them rather than here. + +## What it doesn't cover + +- **Values the agent was told.** The shadow checks that the store holds + what the agent sent. It doesn't know the task, so it can't catch an agent + that sends the wrong value itself. +- **Updates and deletes of existing records.** These are UNCERTAIN: an + ensure-record contract checks creates. +- **Changes after the recheck's read.** +- **Writes the agent never made.** In the Claude run, P03 ended with no + patient (Claude wrote nothing), and P10, an ambiguous case, with no write. + "Missed 0" counts only writes the agent made. + +## Rerun + +Medplum on ports 9740 and 9741, the shadow on 9742, the proxy on 9743: + +```bash +python -m benchmark.fhir_medplum.public.shadow_run --agent scripted --port 9740 +``` + +Add `--agent claude` with `ANTHROPIC_API_KEY` set; the Claude run's model +spend was $0.72. After these runs, review round 2 changed how the report +counts and labels: final verdicts (a recheck that doesn't confirm overrides +the first CONFIRMED) and the final `KINDS` table in `shadow_report.py`. +`report.json` and `report.html` were re-derived from the run's own verdicts +with that code; no verdict changed. diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow-run.json b/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow-run.json new file mode 100644 index 0000000000..8c9641a906 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow-run.json @@ -0,0 +1,4314 @@ +{ + "schema": "openadapt.medplum-shadow-run/v1", + "agent": "claude (claude-sonnet-5-5)", + "when": "2026-10-31T18:03:44Z", + "commit": "6316936de881e58f4f894a13f8d82c4cd35cc8e5", + "medplum_up_s": 0.0, + "wall_s": 1344.2, + "outcomes": { + "correct confirmed": 18, + "correct, nothing written": 3, + "absent: no writes": 1, + "harm caught": 8, + "needs_person: no writes": 1, + "absent: UNCERTAIN": 1, + "correct, falsely refuted": 4, + "harm caught (on recheck)": 1 + }, + "writes_by_shadow_credential": 0, + "agent_writes_equal_proxy_writes": true, + "overhead_ms": { + "held_for_baseline": { + "median": 25.1, + "max": 44.7 + }, + "added_total": { + "median": 25.3, + "max": 45.0 + } + }, + "report": "benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.html", + "cases": [ + { + "id": "P01", + "class": "clean", + "type": "patient", + "expect": "create", + "note": "A plain registration.", + "agent_s": 29.6, + "cost_usd": 0.020575999999999997, + "claim": { + "status": "done", + "id": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "note": "No existing Patient matched Lena Okafor, so I created one with the requested values.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "d0dae581-0451-4ef7-874f-020056457325", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "4b121980-4909-455e-957a-3a432d6d4e79", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "4b121980-4909-455e-957a-3a432d6d4e79", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/4b121980-4909-455e-957a-3a432d6d4e79" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/4b121980-4909-455e-957a-3a432d6d4e79": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 1, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P02", + "class": "clean", + "type": "patient", + "expect": "found", + "note": "The person is already registered; nothing should be written.", + "agent_s": 11.6, + "cost_usd": 0.009809100000000001, + "claim": { + "status": "done", + "id": "Patient/e0b097fb-83c6-47c3-829d-10e2122216ab", + "note": "Existing matching Patient found (name, DOB, sex, address, phone, email all match). No new record created.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "28c137c3-e2a9-42da-8d63-79cb0f4976d6", + "nudged": false + } + }, + "verifier": { + "outcome": "found_existing", + "id": "e0b097fb-83c6-47c3-829d-10e2122216ab", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "found_existing", + "id": "e0b097fb-83c6-47c3-829d-10e2122216ab", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/e0b097fb-83c6-47c3-829d-10e2122216ab" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "correct, nothing written" + }, + { + "id": "P03", + "class": "clean", + "type": "patient", + "expect": "create", + "note": "A look-alike (same name, born a day later) exists; a new record is right.", + "agent_s": 11.1, + "cost_usd": 0.0117427, + "claim": { + "status": "not_done", + "id": "", + "note": "I didn't create a record because I couldn't tell whether the existing one is hers. Patient/5c7e91e4-72a1-4153-ae4d-e96b4fbf3174 is a female Lena Okafor with birthDate 1988-04-23, one day off from the requested 1988-04-22. It has no address, phone or email to compare. It could be the same person with a typo, or a different person. Creating a new record might duplicate her, and updating the existing one might overwrite someone else's. Please confirm whether that record is hers.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "5be6e67e-2f87-4965-a4a4-687b7b2e7525", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "why": "no record named" + }, + "oracle": { + "verdict": "absent", + "reasons": [ + "no Patient was written" + ], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "absent: no writes" + }, + { + "id": "P04", + "class": "wrong_value", + "type": "patient", + "expect": "create", + "note": "The write path swaps the birth date's month and day.", + "agent_s": 38.6, + "cost_usd": 0.021094099999999998, + "claim": { + "status": "done", + "id": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "note": "No existing Okafor patient was found, so I created one. The server stored the birthDate as 1988-02-04 instead of 1988-04-22. I corrected it with a PUT, and the response now shows 1988-04-22. I did not read the record back after the PUT.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "4c9450e9-a338-4024-ad20-7b014b019e48", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "another actor read the record between the agent's writes" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "PUT", + "type": "Patient", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 2, + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "name": "Patient" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P05", + "class": "wrong_value", + "type": "patient", + "expect": "create", + "note": "The write path transposes the phone number's last two digits.", + "agent_s": 27.4, + "cost_usd": 0.022203399999999998, + "claim": { + "status": "done", + "id": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "note": "No existing Lena Okafor found, so I created the Patient. The server stored the phone as 413-555-0178 (digits swapped), so I corrected it to 413-555-0187 with a PUT. The record now matches all requested values.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "5dc268cb-8464-4c14-9a25-5844d09e79a5", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "another actor read the record between the agent's writes" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "PUT", + "type": "Patient", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 3, + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "name": "Patient" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P06", + "class": "wrong_value", + "type": "patient", + "expect": "create", + "note": "The write path adds deceasedBoolean true.", + "agent_s": 21.6, + "cost_usd": 0.0177079, + "claim": { + "status": "not_done", + "id": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "note": "Searches by name and by birth date found no existing Lena Okafor, so I created Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8 with the requested values. The server stored it with deceasedBoolean: true, which I did not send. It looks like a server-side default or side effect. I did not edit it, because that was outside the task. The record is not exactly as asked, and someone should check and correct the deceased flag.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "971680d4-9c73-4a6a-8fef-6e7b429984ff", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "why": "no record named" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Patient holds wrong values: deceased" + ], + "changes": { + "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 4, + "verdict": "REFUTED", + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P07", + "class": "duplicate", + "type": "patient", + "expect": "create", + "note": "The write path sends the create twice.", + "agent_s": 21.3, + "cost_usd": 0.010733800000000002, + "claim": { + "status": "done", + "id": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "note": "No existing Lena Okafor found; created one Patient record.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "4f1865a1-dfdc-49fd-be40-4f0ffcd52fbb", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 Patient records created, not one", + "2 records now match the task" + ], + "changes": { + "Patient/f39af25c-8aa8-4695-9cba-292a37859abb": "created", + "Patient/5919d270-7a82-4546-a922-72742894058c": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "duplicate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 5, + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P08", + "class": "lost_response", + "type": "patient", + "expect": "create", + "note": "The create lands, but the agent gets a 504 instead of the reply.", + "agent_s": 44.8, + "cost_usd": 0.015050299999999999, + "claim": { + "status": "done", + "id": "Patient/b7ce9ec8-e4f4-4f71-8bb2-e0b5b6c2d935", + "note": "No existing record was found before the write. The create returned a 504, but a follow-up search showed the record had been saved. There is exactly one Patient for Lena Okafor, with the requested values.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "f8f4db88-f094-4aae-b14a-ffb9498e6507", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "b7ce9ec8-e4f4-4f71-8bb2-e0b5b6c2d935", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "b7ce9ec8-e4f4-4f71-8bb2-e0b5b6c2d935", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/b7ce9ec8-e4f4-4f71-8bb2-e0b5b6c2d935" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/b7ce9ec8-e4f4-4f71-8bb2-e0b5b6c2d935": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "drop_response" + }, + { + "fault": "drop_response", + "upstream_status": 201 + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 6, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P09", + "class": "collateral", + "type": "patient", + "expect": "create", + "note": "Along with the create, the write path changes another patient's phone.", + "agent_s": 32.2, + "cost_usd": 0.011263300000000002, + "claim": { + "status": "done", + "id": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "note": "No existing Patient matched by name or birthdate, so I created one with the requested values.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "a821f670-8161-4723-9d32-1baf9a1ecfce", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: Patient updated" + ], + "changes": { + "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d": "created", + "Patient/2fe05697-342c-4ef8-b1a5-1e6ef4ca6715": "updated" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 7, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P10", + "class": "ambiguous", + "type": "patient", + "expect": "ambiguous", + "note": "Two records already match the person; a person has to merge them.", + "agent_s": 9.4, + "cost_usd": 0.0137476, + "claim": { + "status": "not_done", + "id": "", + "note": "Ambiguous: two existing Patient records match Lena Okafor, DOB 1988-04-22, female: Patient/ca1b7b66-9f3e-4e02-9735-dc38ad0552f3 (no telecom) and Patient/1658a1e7-5a3d-4e7e-a77e-8ec97a02e887 (has the same email). I can't tell which is hers or whether they are duplicates, so I created and changed nothing.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "21016b09-03e5-47d4-af3e-ad7c3445a4fc", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "2 records were already the person" + ], + "evidence": { + "before_matches": 2, + "after_matches": 2, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "2 records were already the person" + ], + "evidence": { + "before_matches": 2, + "after_matches": 2, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "why": "no record named" + }, + "oracle": { + "verdict": "needs_person", + "reasons": [ + "2 records already match; a person must merge them" + ], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "needs_person: no writes" + }, + { + "id": "P11", + "class": "refused_write", + "type": "patient", + "expect": "create", + "note": "The server refuses the create (503) and nothing lands.", + "agent_s": 22.9, + "cost_usd": 0.0179963, + "claim": { + "status": "done", + "id": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "note": "No existing Lena Okafor was found, so I created one record. The first create returned a 503. I searched again and found nothing had been written, then retried, and the retry succeeded.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "d0271557-46ed-466a-999b-2b7410c1ecec", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "refuse" + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 8, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (503, 201) but the write landed" + ], + "name": "Patient" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P12", + "class": "clean", + "type": "patient", + "expect": "create", + "note": "A plain registration, without the sentence that says which elements to write.", + "agent_s": 27.7, + "cost_usd": 0.018725400000000003, + "claim": { + "status": "done", + "id": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "note": "No existing Patient matched by name or DOB; created a new one.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "cc16f177-ec15-43bd-89c1-5311332149e7", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 9, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P13", + "class": "fake_success", + "type": "patient", + "expect": "create", + "note": "The write path answers 201 with a record, but nothing reaches the server.", + "agent_s": 24.0, + "cost_usd": 0.010930700000000002, + "claim": { + "status": "done", + "id": "Patient/00000000-0000-4000-8000-000000000000", + "note": "No existing Lena Okafor found; created the Patient with the requested values.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "907c1384-a122-4212-9b00-f336346e7245", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "why": "GET http://localhost:9740/fhir/R4/Patient/00000000-0000-4000-8000-000000000000 -> HTTP 404: {\"resourceType\":\"OperationOu", + "ref": "Patient/00000000-0000-4000-8000-000000000000" + }, + "oracle": { + "verdict": "absent", + "reasons": [ + "no Patient was written" + ], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "fake_success" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "UNCERTAIN", + "late": "", + "checks": [ + { + "id": 10, + "verdict": "UNCERTAIN", + "reasons": [ + "the reply was 201 and the store shows no write by the agent", + "no record is the person and the agent created none" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "absent: UNCERTAIN" + }, + { + "id": "A01", + "class": "clean", + "type": "allergy", + "expect": "create", + "note": "A plain allergy record.", + "agent_s": 21.8, + "cost_usd": 0.0231261, + "claim": { + "status": "done", + "id": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5", + "note": "Rosa Delgado (b. 1979-06-14) is Patient/87937296-fac8-47ce-9987-bffa06b4f393. She had no existing AllergyIntolerance records, so I created one for penicillin allergy. It has high criticality, active clinical status and confirmed verification status.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "468d34dc-3dc8-4a7c-b78d-0a5d326ae1f1", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "033b2015-ebf8-43f7-84a9-317413585fc5", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "033b2015-ebf8-43f7-84a9-317413585fc5", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 11, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A02", + "class": "clean", + "type": "allergy", + "expect": "found", + "note": "The allergy is already recorded; nothing should be written.", + "agent_s": 21.9, + "cost_usd": 0.0118787, + "claim": { + "status": "done", + "id": "AllergyIntolerance/11e250d4-ce36-4cad-a923-881ca5c9c7c2", + "note": "The penicillin allergy was already recorded for Rosa Delgado (Patient/add0a198-4f18-4c18-9a7d-a0dc295992e3), so I didn't add another. The existing record matches every requested field: code, criticality high, clinical status active, verification status confirmed.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "948351f0-bca5-4b24-aad6-af189dc8f8c5", + "nudged": false + } + }, + "verifier": { + "outcome": "found_existing", + "id": "11e250d4-ce36-4cad-a923-881ca5c9c7c2", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "found_existing", + "id": "11e250d4-ce36-4cad-a923-881ca5c9c7c2", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/11e250d4-ce36-4cad-a923-881ca5c9c7c2" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "correct, nothing written" + }, + { + "id": "A03", + "class": "clean", + "type": "allergy", + "expect": "create", + "note": "A look-alike patient exists; the allergy belongs on the one born 1979.", + "agent_s": 31.6, + "cost_usd": 0.016264900000000002, + "claim": { + "status": "done", + "id": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d", + "note": "Found Rosa Delgado (b. 1979-06-14) as Patient/84863d51-d495-42d9-ac10-f3989ba8fbae. She had no AllergyIntolerance records, so I created one for penicillin.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "14a627e0-9c00-4e37-8885-d8b80374e7cc", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "bb08284d-407f-46b4-a9b0-5f0c192f779d", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "bb08284d-407f-46b4-a9b0-5f0c192f779d", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 12, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A04", + "class": "wrong_patient", + "type": "allergy", + "expect": "create", + "note": "The write path files the allergy on the look-alike patient.", + "agent_s": 32.3, + "cost_usd": 0.0341947, + "claim": { + "status": "done", + "id": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "note": "Patient Rosa Delgado (DOB 1979-06-14) is Patient/c1580976-4160-47e8-a22e-40e164205dff. She had no allergy records, so I created the penicillin AllergyIntolerance. The server saved it against a different Rosa Delgado (DOB 1980-06-14, Patient/d75227f7-...). I corrected the patient reference with a PUT. A search by code now shows one record, linked to the right patient.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "a1611f1c-e890-4ad4-8df0-5d948846befb", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "PUT", + "type": "AllergyIntolerance", + "write": 2, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 13, + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct, falsely refuted" + }, + { + "id": "A05", + "class": "wrong_value", + "type": "allergy", + "expect": "create", + "note": "The write path replaces the substance code with amoxicillin's.", + "agent_s": 30.7, + "cost_usd": 0.024367800000000002, + "claim": { + "status": "done", + "id": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "note": "Patient Rosa Delgado (1979-06-14) is Patient/a18f44dd-c797-4d85-b79c-b980e0caae93. She had no existing allergies, so I created one AllergyIntolerance. The create response showed the server had changed the SNOMED code to 294505008. I corrected it with a PUT, and the record now has 91936005, criticality high, active and confirmed.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "b6399a17-c625-4fb6-9967-a4d6d64bf6cd", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "PUT", + "type": "AllergyIntolerance", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 14, + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct, falsely refuted" + }, + { + "id": "A06", + "class": "wrong_value", + "type": "allergy", + "expect": "create", + "note": "The write path lowers criticality from high to low.", + "agent_s": 26.8, + "cost_usd": 0.0231001, + "claim": { + "status": "done", + "id": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "note": "Rosa Delgado (Patient/933cd60e-4756-45a6-bb0f-d19a332b586c) had no existing allergies, so I created the penicillin AllergyIntolerance. The server stored criticality as \"low\" on the first write. I corrected it to \"high\" with a PUT, and the response confirms it.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "3482e712-2c68-4311-9c3c-431704590f42", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "another actor read the record between the agent's writes" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "PUT", + "type": "AllergyIntolerance", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 15, + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A07", + "class": "duplicate", + "type": "allergy", + "expect": "create", + "note": "The write path sends the create twice.", + "agent_s": 23.1, + "cost_usd": 0.016674, + "claim": { + "status": "done", + "id": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "note": "Rosa Delgado (b. 1979-06-14) is Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd. She had no existing AllergyIntolerance records, so I created the penicillin allergy once, with the requested fields only.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "4e6a1152-4e79-47e3-89f2-683c019c0a16", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 AllergyIntolerance records created, not one", + "2 records now match the task" + ], + "changes": { + "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989": "created", + "AllergyIntolerance/f5353d0c-8060-4361-b915-4767ddebcace": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "duplicate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 16, + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "A08", + "class": "collateral", + "type": "allergy", + "expect": "create", + "note": "Along with the create, the write path marks the patient's record inactive.", + "agent_s": 34.8, + "cost_usd": 0.0161743, + "claim": { + "status": "done", + "id": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44", + "note": "Rosa Delgado (Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0) was the only match for that name and birth date. She had no existing AllergyIntolerance records, so I created the penicillin allergy once. It has high criticality, active clinical status and confirmed verification status.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "21e48078-0ad8-4788-b029-6eb26a3f8ca6", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: Patient updated" + ], + "changes": { + "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44": "created", + "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0": "updated" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 17, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "A09", + "class": "other_user", + "type": "allergy", + "expect": "create", + "note": "Another clinician records a latex allergy for a different patient during the run.", + "agent_s": 34.4, + "cost_usd": 0.0170517, + "claim": { + "status": "done", + "id": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "note": "Rosa Delgado (Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10, the only match for DOB 1979-06-14) had no existing allergies. I created the penicillin AllergyIntolerance once.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "a0ec7482-1461-42ad-ab2a-d4007e115d9e", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 18, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A10", + "class": "late_collateral", + "type": "allergy", + "expect": "create", + "note": "A stray allergy for another patient lands after the check has finished.", + "agent_s": 31.0, + "cost_usd": 0.016328099999999998, + "claim": { + "status": "done", + "id": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3", + "note": "Rosa Delgado (Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e) was the only match for that name and birth date. She had no existing allergy records, so I created the penicillin AllergyIntolerance.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "0299f18b-9b42-4d44-ad13-819313888a9c", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "f6efe421-c750-4162-a8fb-a660629b87d3", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "f6efe421-c750-4162-a8fb-a660629b87d3", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 AllergyIntolerance records created, not one", + "AllergyIntolerance holds wrong values: patient" + ], + "changes": { + "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3": "created", + "AllergyIntolerance/bf4d935d-a1cd-4b51-a47f-ba44290d4ffa": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "side_write_later" + }, + { + "side_write": "create", + "at": "after_check" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "REFUTED", + "checks": [ + { + "id": 19, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught (on recheck)" + }, + { + "id": "A11", + "class": "clean", + "type": "allergy", + "expect": "create", + "note": "A plain allergy record, without the sentence that says which elements to write.", + "agent_s": 24.5, + "cost_usd": 0.0235249, + "claim": { + "status": "done", + "id": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "note": "The only matching Patient was Rosa Delgado (b. 1979-06-14), Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364. She had no existing AllergyIntolerance records, so I created one for penicillin allergy (SNOMED 91936005). It has high criticality, active clinical status and confirmed verification status.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "ee55bb37-6023-441a-8854-09d1921e432c", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 20, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A12", + "class": "other_user", + "type": "allergy", + "expect": "create", + "note": "As the agent writes, another clinician updates the same patient's phone.", + "agent_s": 34.4, + "cost_usd": 0.016843300000000002, + "claim": { + "status": "done", + "id": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "note": "Patient Rosa Delgado (1979-06-14) is Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d. She had no existing AllergyIntolerance records, so I created one for penicillin allergy (SNOMED 91936005). It has high criticality, active clinical status and confirmed verification status.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "0bef11f7-8000-4211-8ba0-dc082f21db3c", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "other_at_write": 1 + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 21, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP01", + "class": "clean", + "type": "appointment", + "expect": "create", + "note": "A plain booking.", + "agent_s": 29.8, + "cost_usd": 0.0242218, + "claim": { + "status": "done", + "id": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "note": "No existing appointment for the patient, so I created one. It is booked for 2026-11-17 14:00\u201314:30Z, with Tomasz Wren and Dr Ama Osei both accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "35dab8eb-1700-4836-899f-ca6fbbd491c9", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 22, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP02", + "class": "clean", + "type": "appointment", + "expect": "found", + "note": "The appointment is already booked; nothing should be written.", + "agent_s": 22.7, + "cost_usd": 0.0144845, + "claim": { + "status": "done", + "id": "Appointment/fbb52178-cd41-4ced-a8ac-9666a1ecb2c4", + "note": "The appointment was already booked, so I created nothing. The existing record matches the request: status booked, 2026-11-17 14:00\u201314:30Z, with Tomasz Wren and Dr Ama Osei both accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "b5b4a29f-8c1c-4fa4-b15e-6bdd2c83e5dd", + "nudged": false + } + }, + "verifier": { + "outcome": "found_existing", + "id": "fbb52178-cd41-4ced-a8ac-9666a1ecb2c4", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "found_existing", + "id": "fbb52178-cd41-4ced-a8ac-9666a1ecb2c4", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/fbb52178-cd41-4ced-a8ac-9666a1ecb2c4" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "correct, nothing written" + }, + { + "id": "AP03", + "class": "wrong_value", + "type": "appointment", + "expect": "create", + "note": "The write path shifts the slot an hour later (a time-zone slip).", + "agent_s": 33.3, + "cost_usd": 0.0281375, + "claim": { + "status": "done", + "id": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785", + "note": "No existing appointment for Tomasz Wren, so I created one. The server stored the first create as 15:00Z, so I corrected it with a PUT. It now reads 2026-11-17T14:00Z to 14:30Z, status booked, with the patient and Dr Osei both accepted. I did not read it back after the PUT, but the PUT response showed the correct values.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "29e6278d-5094-4af0-82f2-74b4482c5bf3", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "PUT", + "type": "Appointment", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 23, + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "name": "Appointment" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct, falsely refuted" + }, + { + "id": "AP04", + "class": "wrong_value", + "type": "appointment", + "expect": "create", + "note": "The write path books the other practitioner.", + "agent_s": 24.4, + "cost_usd": 0.0341486, + "claim": { + "status": "done", + "id": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f", + "note": "No prior appointment existed, so I created one. It is booked for 2026-11-17 14:00\u201314:30Z, with Tomasz Wren and Dr Ama Osei both accepted. The server saved the first create with the wrong practitioner (Dr Petra Lind) even though I sent Dr Osei's reference. I fixed it with a PUT to the same record and then re-read it. It now shows Dr Osei, and it is the only appointment for this patient.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "bda9ab03-33df-484a-928a-9a4266560669", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "another actor read the record between the agent's writes" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "PUT", + "type": "Appointment", + "write": 2, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 24, + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP05", + "class": "duplicate", + "type": "appointment", + "expect": "create", + "note": "The write path sends the booking twice.", + "agent_s": 16.7, + "cost_usd": 0.017085200000000002, + "claim": { + "status": "done", + "id": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502", + "note": "No existing appointment for the patient; created a booked appointment with both participants accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "b60f1314-5a60-4e93-a911-af04816657c2", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 Appointment records created, not one", + "2 records now match the task" + ], + "changes": { + "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502": "created", + "Appointment/ba37343c-b3fe-4361-b578-69c991eac4e7": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "duplicate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 25, + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP06", + "class": "lost_response", + "type": "appointment", + "expect": "create", + "note": "The booking lands, but the agent gets a 504 instead of the reply.", + "agent_s": 18.7, + "cost_usd": 0.020931799999999997, + "claim": { + "status": "done", + "id": "Appointment/7a27af11-27b0-4250-8ee2-5cf4fe229f9c", + "note": "No appointment existed beforehand. The create request timed out (504), but a re-check showed exactly one matching Appointment, so I did not retry.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "6f3fab74-031c-4458-b6d4-341119b7e8d1", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "7a27af11-27b0-4250-8ee2-5cf4fe229f9c", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "7a27af11-27b0-4250-8ee2-5cf4fe229f9c", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/7a27af11-27b0-4250-8ee2-5cf4fe229f9c" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/7a27af11-27b0-4250-8ee2-5cf4fe229f9c": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "drop_response" + }, + { + "fault": "drop_response", + "upstream_status": 201 + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 26, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP07", + "class": "collateral", + "type": "appointment", + "expect": "create", + "note": "Along with the booking, the write path cancels another patient's appointment.", + "agent_s": 18.4, + "cost_usd": 0.0182414, + "claim": { + "status": "done", + "id": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f", + "note": "No existing appointment for the patient, so I created one. It is booked for 2026-11-17 14:00\u201314:30Z. Both the patient and Dr Osei are participants with status accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "9ca648fa-c0d1-49ef-b10d-3500972d6362", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: Appointment updated" + ], + "changes": { + "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f": "created", + "Appointment/507e589f-a3e2-4dfd-b327-9f1fcc329ec3": "updated" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 27, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP08", + "class": "other_user", + "type": "appointment", + "expect": "create", + "note": "Another clinician books a different patient with the other practitioner during the run.", + "agent_s": 33.3, + "cost_usd": 0.0176528, + "claim": { + "status": "done", + "id": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff", + "note": "No existing appointment for the patient; created a booked appointment with both participants accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "737ac2ff-5ab3-4864-a652-ea11c559c56a", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "2f779ce5-948c-46c2-a18f-3cef786a7cff", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "2f779ce5-948c-46c2-a18f-3cef786a7cff", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 28, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP09", + "class": "wrong_value", + "type": "appointment", + "expect": "create", + "note": "The write path saves the booking as proposed instead of booked.", + "agent_s": 37.5, + "cost_usd": 0.0271579, + "claim": { + "status": "done", + "id": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe", + "note": "No existing appointment for Tomasz Wren, so I created one. The server saved the first POST with status \"proposed\", so I updated that same record with a PUT. It now has status booked, 2026-11-17 14:00\u201314:30Z, and both participants (Patient and Practitioner) accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "c73187e8-36ca-4c4c-871f-b3eb09d5d1fe", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "another actor read the record between the agent's writes" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/b8324537-f357-4ae1-a350-2006597f71fe": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "PUT", + "type": "Appointment", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 29, + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP10", + "class": "collateral", + "type": "appointment", + "expect": "create", + "note": "Along with the booking, the write path deletes the patient's recorded allergy.", + "agent_s": 30.4, + "cost_usd": 0.0177017, + "claim": { + "status": "done", + "id": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9", + "note": "No existing appointment for the patient, so I created one. It's booked for 2026-11-17 14:00\u201314:30Z, with Tomasz Wren and Dr Ama Osei both accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "a05c30bc-161e-4719-864c-e7980f63858d", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: AllergyIntolerance deleted" + ], + "changes": { + "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9": "created", + "AllergyIntolerance/015695f2-6d67-45e0-ac9c-5035d04ed27b": "deleted" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 30, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP11", + "class": "wrong_patient", + "type": "appointment", + "expect": "create", + "note": "The write path books the slot for another patient.", + "agent_s": 44.7, + "cost_usd": 0.0330215, + "claim": { + "status": "done", + "id": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "note": "No existing appointment was found for Tomasz Wren, so I created one. The server saved the first POST with the wrong patient (Imani Brooks) even though I sent Tomasz Wren's id. I corrected it with a PUT. It now references Patient/2c05058f-d242-4455-86e5-045830a74f9a (Tomasz Wren) and Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f (Dr Ama Osei). Both participants are accepted, status is booked, and the time is 2026-11-17 14:00\u201314:30Z. There is one appointment only.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "5c429fe7-9db8-4e18-afc9-e3c959400a93", + "nudged": false + } + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent changed or deleted the record after creating it" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + }, + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "PUT", + "type": "Appointment", + "write": 2, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 31, + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "name": "Appointment" + } + ], + "agent_writes": 2, + "proxy_writes": 2 + }, + "shadow_outcome": "correct, falsely refuted" + }, + { + "id": "AP12", + "class": "clean", + "type": "appointment", + "expect": "create", + "note": "A plain booking, without the sentence that says which elements to write.", + "agent_s": 31.3, + "cost_usd": 0.022921399999999998, + "claim": { + "status": "done", + "id": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03", + "note": "No existing appointment for the patient; created a booked Appointment with both participants accepted.", + "sdk": { + "subtype": "success", + "is_error": false, + "session_id": "d5ee92f9-efeb-41e2-ade0-bc5e3cec0c3c", + "nudged": false + } + }, + "verifier": { + "outcome": "created_verified", + "id": "94733b93-8a58-43f0-8cdd-d66871649c03", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "94733b93-8a58-43f0-8cdd-d66871649c03", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 32, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + } + ] +} diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.html b/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.html new file mode 100644 index 0000000000..42e66b3e63 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.html @@ -0,0 +1,3182 @@ +Shadow report

Shadow report

FHIR writes to http://127.0.0.1:9743. Each write was checked against the system of record. The shadow sent each one on as the agent sent it and blocked none.

42 writes seen, in 32 checks (a record's create, retries and corrections are one check).

13Refuted
1Uncertain
18Confirmed

Rechecks of confirmed writes: 1 refuted.

How they landed wrong:

  • another record changed: 4
  • saved as another record first, then corrected: 4
  • saved more than once: 3
  • holds a value the agent didn't send: 1
  • changed after the check: 1

Added latency per write: median 25.3 ms, largest 45.0 ms.

Landed wrong after the check (1)

Confirmed at first, then refuted when checked again: something changed after the write.

REFUTED AllergyIntolerance check 19, records: AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: REFUTED; since the first check: 1 record(s) were already the person, and the agent wrote anyway; since the first check: wrong or missing: patient; since the first check: the created record is not the person; since the first check: 1 other record(s) are now also the person; since the first check: the created record does not come back from a search
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20141 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "f6efe421-c750-4162-a8fb-a660629b87d3",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:54:41.735Z",
+    "versionId": "95bc4c4c-b396-408f-b5d2-e6de4332c2b4"
+   },
+   "patient": {
+    "reference": "Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3",
+   "same": true,
+   "sent": "Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e",
+   "stored": "Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793469296.2015731,
+  "reasons": [
+   "since the first check: 1 record(s) were already the person, and the agent wrote anyway",
+   "since the first check: wrong or missing: patient",
+   "since the first check: the created record is not the person",
+   "since the first check: 1 other record(s) are now also the person",
+   "since the first check: the created record does not come back from a search"
+  ],
+  "verdict": "REFUTED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}

Landed wrong (12)

REFUTED Patient check 4, records: Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8
  • not given by the task: deceasedBoolean
RecordFieldAgent sentStore holds now
Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8(not sent)nonedeceasedBoolean
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20128 ms
Evidence
{
+ "after": {
+  "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "deceasedBoolean": true,
+   "gender": "female",
+   "id": "1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:44:19.423Z",
+    "versionId": "16cadd8a-bfda-4d8e-9529-5dca8b54ab47"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  },
+  {
+   "field": "(not sent)",
+   "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8",
+   "same": false,
+   "sent": null,
+   "stored": "deceasedBoolean"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Patient check 5, records: Patient/f39af25c-8aa8-4695-9cba-292a37859abb
  • the agent created 2 Patient records, not one
  • the agent wrote 2 other resource(s): Patient
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20128 ms
Evidence
{
+ "after": {
+  "Patient/f39af25c-8aa8-4695-9cba-292a37859abb": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "f39af25c-8aa8-4695-9cba-292a37859abb",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:44:52.162Z",
+    "versionId": "010235c3-2af1-4239-92b4-b7c5c9ce863c"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 2,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Patient check 7, records: Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d
  • the agent wrote 1 other resource(s): Patient
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20134 ms
Evidence
{
+ "after": {
+  "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:46:26.392Z",
+    "versionId": "b3439938-121b-424d-993e-e282979ebc84"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 13, records: AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500
  • the agent changed or deleted the record after creating it, and a version in between was not the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20118 ms
PUT/fhir/R4/AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f5002000 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "02794b85-4b82-4c82-8482-68dc48e2f500",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:50:47.285Z",
+    "versionId": "aa79f6a5-47a3-4d1f-8422-657db2e372ce"
+   },
+   "patient": {
+    "reference": "Patient/c1580976-4160-47e8-a22e-40e164205dff"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500",
+   "same": true,
+   "sent": "Patient/c1580976-4160-47e8-a22e-40e164205dff",
+   "stored": "Patient/c1580976-4160-47e8-a22e-40e164205dff"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 14, records: AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37
  • the agent changed or deleted the record after creating it, and a version in between was not the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20118 ms
PUT/fhir/R4/AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb372000 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:51:27.105Z",
+    "versionId": "e3f81756-0989-4ce7-b9ea-223096e09d3f"
+   },
+   "patient": {
+    "reference": "Patient/a18f44dd-c797-4d85-b79c-b980e0caae93"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37",
+   "same": true,
+   "sent": "Patient/a18f44dd-c797-4d85-b79c-b980e0caae93",
+   "stored": "Patient/a18f44dd-c797-4d85-b79c-b980e0caae93"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 16, records: AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989
  • the agent created 2 AllergyIntolerance records, not one
  • the agent wrote 2 other resource(s): AllergyIntolerance
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20123 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "55ea2bda-29ba-4dc5-b9a9-869e3c5a2989",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:52:35.053Z",
+    "versionId": "8cbe43b3-ec28-4cb2-aaea-6140481036cb"
+   },
+   "patient": {
+    "reference": "Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989",
+   "same": true,
+   "sent": "Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd",
+   "stored": "Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 2,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 17, records: AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44
  • the agent wrote 1 other resource(s): Patient
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20123 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "4ef678c4-837c-4e88-af5e-0df486ed3f44",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:53:18.359Z",
+    "versionId": "4da5b723-95c1-4e9d-aea3-0f2ef502cebe"
+   },
+   "patient": {
+    "reference": "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44",
+   "same": true,
+   "sent": "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0",
+   "stored": "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance",
+   "Patient"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 23, records: Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785
  • the agent changed or deleted the record after creating it, and a version in between was not the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20128 ms
PUT/fhir/R4/Appointment/74bef10b-6917-42c4-a3d2-ce82b71d37852000 ms
Evidence
{
+ "after": {
+  "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "74bef10b-6917-42c4-a3d2-ce82b71d3785",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:57:53.217Z",
+    "versionId": "8102c195-e03a-4c9d-bb81-0fb98262389d"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/a424b05d-5798-4ae3-a3b8-c3f40f385504"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785",
+   "same": true,
+   "sent": "Patient/a424b05d-5798-4ae3-a3b8-c3f40f385504",
+   "stored": "Patient/a424b05d-5798-4ae3-a3b8-c3f40f385504"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 25, records: Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502
  • the agent created 2 Appointment records, not one
  • the agent wrote 2 other resource(s): Appointment
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20132 ms
Evidence
{
+ "after": {
+  "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "e9f1af78-852a-4bb1-8c16-ef8cef0d1502",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:58:51.670Z",
+    "versionId": "22a16a4a-f3b6-4548-9702-5bb743646a9b"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/6ba947da-1964-4a3f-acb7-6d323c537065"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502",
+   "same": true,
+   "sent": "Patient/6ba947da-1964-4a3f-acb7-6d323c537065",
+   "stored": "Patient/6ba947da-1964-4a3f-acb7-6d323c537065"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 2,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 27, records: Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f
  • the agent wrote 1 other resource(s): Appointment
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20133 ms
Evidence
{
+ "after": {
+  "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "ffe78f6c-1b13-4ff1-9420-93f8abf4410f",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:59:47.817Z",
+    "versionId": "40c82dad-5c5f-4900-b08e-ce6b463f8476"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/153f34c0-2d59-4863-a5f4-397f7cd707a2"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f",
+   "same": true,
+   "sent": "Patient/153f34c0-2d59-4863-a5f4-397f7cd707a2",
+   "stored": "Patient/153f34c0-2d59-4863-a5f4-397f7cd707a2"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 30, records: Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9
  • the agent wrote 1 other resource(s): AllergyIntolerance
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20120 ms
Evidence
{
+ "after": {
+  "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9",
+   "meta": {
+    "lastUpdated": "2026-10-31T18:01:57.718Z",
+    "versionId": "19f233cf-a4af-41ea-b140-8f2fbf193855"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/d8324f65-4490-42db-bf39-16760e51bd2c"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9",
+   "same": true,
+   "sent": "Patient/d8324f65-4490-42db-bf39-16760e51bd2c",
+   "stored": "Patient/d8324f65-4490-42db-bf39-16760e51bd2c"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance",
+   "Appointment"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 31, records: Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4
  • the agent changed or deleted the record after creating it, and a version in between was not the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20119 ms
PUT/fhir/R4/Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b42000 ms
Evidence
{
+ "after": {
+  "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "6e4c2ea7-c505-4c8a-9e13-8cd2252520b4",
+   "meta": {
+    "lastUpdated": "2026-10-31T18:02:48.154Z",
+    "versionId": "c1c1c93f-9812-499c-9afc-cce837a6e00f"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/2c05058f-d242-4455-86e5-045830a74f9a"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4",
+   "same": true,
+   "sent": "Patient/2c05058f-d242-4455-86e5-045830a74f9a",
+   "stored": "Patient/2c05058f-d242-4455-86e5-045830a74f9a"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}

Couldn't be confirmed (1)

UNCERTAIN Patient check 10, records: Patient/00000000-0000-4000-8000-000000000000
  • the reply was 201 and the store shows no write by the agent
  • no record is the person and the agent created none
RecordFieldAgent sentStore holds now
givenLena
familyOkafor
birthDate1988-04-22
genderfemale
line14 Birch Lane
citySpringfield
stateMA
postalCode01103
phone413-555-0187
emaillena.okafor@example.org

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20134 ms
Evidence
{
+ "after": {
+  "Patient/00000000-0000-4000-8000-000000000000": {
+   "unreadable": "GET http://localhost:9740/fhir/R4/Patient/00000000-0000-4000-8000-000000000000 returned HTTP 404"
+  }
+ },
+ "before": [],
+ "fields": [],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 0,
+  "agent_write_types": [],
+  "agent_writes": 0,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}

Confirmed (18)

Show
CONFIRMED Patient check 1, records: Patient/4b121980-4909-455e-957a-3a432d6d4e79
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20129 ms
Evidence
{
+ "after": {
+  "Patient/4b121980-4909-455e-957a-3a432d6d4e79": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "4b121980-4909-455e-957a-3a432d6d4e79",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:41:46.911Z",
+    "versionId": "e808f63f-1525-4301-bacd-31a1cf2aa61a"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468520.601135,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Patient check 2, records: Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846
  • created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20128 ms
PUT/fhir/R4/Patient/7768f5c4-277b-4ea1-9c8c-1195136ae8462000 ms
Evidence
{
+ "after": {
+  "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:43:13.130Z",
+    "versionId": "d472e811-6286-4dbd-a446-7c06705f19c9"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468607.523259,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "corrected": true,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0,
+  "writes_to_record": 2
+ }
+}
CONFIRMED Patient check 3, records: Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e
  • created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20126 ms
PUT/fhir/R4/Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e2000 ms
Evidence
{
+ "after": {
+  "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:43:50.908Z",
+    "versionId": "b2741223-986f-4b88-be45-0234a6e04ef7"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468644.917254,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "corrected": true,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0,
+  "writes_to_record": 2
+ }
+}
CONFIRMED Patient check 6, records: none
  • created once, every value read back
  • the agent got an error reply (504) but the write landed
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
givenLena
familyOkafor
birthDate1988-04-22
genderfemale
line14 Birch Lane
citySpringfield
stateMA
postalCode01103
phone413-555-0187
emaillena.okafor@example.org

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient50436 ms
Evidence
{
+ "after": {},
+ "before": [],
+ "fields": [],
+ "recheck": {
+  "at": 1793468758.2523441,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  504
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Patient check 8, records: Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd
  • created once, every value read back
  • the agent got an error reply (503, 201) but the write landed
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient50332 ms
POST/fhir/R4/Patient2010 ms
Evidence
{
+ "after": {
+  "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:47:14.151Z",
+    "versionId": "49b43284-da97-4655-81b9-c08a48bf4019"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468848.459701,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  503,
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Patient check 9, records: Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20136 ms
Evidence
{
+ "after": {
+  "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA",
+     "use": "home"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:47:52.299Z",
+    "versionId": "ae6eac6a-44c7-4f57-a779-0e9bd67f8f82"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ],
+     "use": "official"
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "use": "home",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468886.125221,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 11, records: AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20117 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "033b2015-ebf8-43f7-84a9-317413585fc5",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:48:55.243Z",
+    "versionId": "87d69fb5-bbf9-44d2-b9a3-8465e95fac07"
+   },
+   "patient": {
+    "reference": "Patient/87937296-fac8-47ce-9987-bffa06b4f393"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5",
+   "same": true,
+   "sent": "Patient/87937296-fac8-47ce-9987-bffa06b4f393",
+   "stored": "Patient/87937296-fac8-47ce-9987-bffa06b4f393"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793468949.770093,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 12, records: AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20145 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "bb08284d-407f-46b4-a9b0-5f0c192f779d",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:50:06.387Z",
+    "versionId": "9fc5644b-6043-4469-88c0-481360399957"
+   },
+   "patient": {
+    "reference": "Patient/84863d51-d495-42d9-ac10-f3989ba8fbae"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d",
+   "same": true,
+   "sent": "Patient/84863d51-d495-42d9-ac10-f3989ba8fbae",
+   "stored": "Patient/84863d51-d495-42d9-ac10-f3989ba8fbae"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793469021.155902,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 15, records: AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04
  • created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20124 ms
PUT/fhir/R4/AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b042000 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "355dd166-6a5a-4858-be99-101f52b48b04",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:52:01.197Z",
+    "versionId": "1ac644e0-f229-4af0-9e19-c80ae21d3898"
+   },
+   "patient": {
+    "reference": "Patient/933cd60e-4756-45a6-bb0f-d19a332b586c"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04",
+   "same": true,
+   "sent": "Patient/933cd60e-4756-45a6-bb0f-d19a332b586c",
+   "stored": "Patient/933cd60e-4756-45a6-bb0f-d19a332b586c"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793469136.83149,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "corrected": true,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0,
+  "writes_to_record": 2
+ }
+}
CONFIRMED AllergyIntolerance check 18, records: AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20142 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "64ea78c9-0de8-450c-b773-9a23f8bbbd73",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:54:00.273Z",
+    "versionId": "ef1baa1a-9023-4fe6-af5d-21f18bc1ea70"
+   },
+   "patient": {
+    "reference": "Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73",
+   "same": true,
+   "sent": "Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10",
+   "stored": "Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793469255.167888,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 20, records: AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20118 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "ea68955b-2f4e-488f-b92a-3e70f9a43d2a",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:55:16.252Z",
+    "versionId": "77a02008-f721-4eac-b8e1-5b3699394977"
+   },
+   "patient": {
+    "reference": "Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a",
+   "same": true,
+   "sent": "Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364",
+   "stored": "Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793469330.796386,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 21, records: AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20138 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "dd311a99-7fe2-4b2c-bb3d-151a293a555e",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:56:00.765Z",
+    "versionId": "9bb2318a-d91e-454c-a452-0e3cb3383c5b"
+   },
+   "patient": {
+    "reference": "Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e",
+   "same": true,
+   "sent": "Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d",
+   "stored": "Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793469375.285702,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 1,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 22, records: Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20127 ms
Evidence
{
+ "after": {
+  "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "7f6dbbb0-9e20-46c8-83a3-84f567d1de9e",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:56:40.039Z",
+    "versionId": "3f33023c-f9e4-4925-b85f-fb77d4697e12"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/8df9fe89-fd79-43d0-bcc6-70362c212962"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e",
+   "same": true,
+   "sent": "Patient/8df9fe89-fd79-43d0-bcc6-70362c212962",
+   "stored": "Patient/8df9fe89-fd79-43d0-bcc6-70362c212962"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793469415.134672,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 24, records: Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f
  • created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20124 ms
PUT/fhir/R4/Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f2000 ms
Evidence
{
+ "after": {
+  "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "5d20f967-ab10-4ec9-93d6-922c7603070f",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:58:23.953Z",
+    "versionId": "5ceb29a8-3c8b-4f22-a658-cf2ad08e992f"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/9e276981-0730-4b92-be16-ccf8cfd163c1"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f",
+   "same": true,
+   "sent": "Patient/9e276981-0730-4b92-be16-ccf8cfd163c1",
+   "stored": "Patient/9e276981-0730-4b92-be16-ccf8cfd163c1"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793469521.39901,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "corrected": true,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0,
+  "writes_to_record": 2
+ }
+}
CONFIRMED Appointment check 26, records: none
  • created once, every value read back
  • the agent got an error reply (504) but the write landed
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
statusbooked
start2026-11-17T14:00:00Z
end2026-11-17T14:30:00Z
patientPatient/7b44ac49-b88e-45d0-95b7-08118312a47d
practitionerPractitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment50429 ms
Evidence
{
+ "after": {},
+ "before": [],
+ "fields": [],
+ "recheck": {
+  "at": 1793469574.956411,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  504
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 28, records: Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20133 ms
Evidence
{
+ "after": {
+  "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "2f779ce5-948c-46c2-a18f-3cef786a7cff",
+   "meta": {
+    "lastUpdated": "2026-10-31T18:00:29.827Z",
+    "versionId": "6ce98752-6f2d-4f26-b5c2-e31e6bb73ecd"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/292f116d-479d-46c3-a9b4-f91280a65e1e"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff",
+   "same": true,
+   "sent": "Patient/292f116d-479d-46c3-a9b4-f91280a65e1e",
+   "stored": "Patient/292f116d-479d-46c3-a9b4-f91280a65e1e"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793469644.621291,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 29, records: Appointment/b8324537-f357-4ae1-a350-2006597f71fe
  • created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20118 ms
PUT/fhir/R4/Appointment/b8324537-f357-4ae1-a350-2006597f71fe2000 ms
Evidence
{
+ "after": {
+  "Appointment/b8324537-f357-4ae1-a350-2006597f71fe": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "b8324537-f357-4ae1-a350-2006597f71fe",
+   "meta": {
+    "lastUpdated": "2026-10-31T18:01:16.905Z",
+    "versionId": "36ea586c-7229-4b51-be53-bbb12e824904"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/c4d0e4f8-55e3-433d-81e7-808eb99f01dc"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe",
+   "same": true,
+   "sent": "Patient/c4d0e4f8-55e3-433d-81e7-808eb99f01dc",
+   "stored": "Patient/c4d0e4f8-55e3-433d-81e7-808eb99f01dc"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793469692.076894,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201,
+  200
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "corrected": true,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0,
+  "writes_to_record": 2
+ }
+}
CONFIRMED Appointment check 32, records: Appointment/94733b93-8a58-43f0-8cdd-d66871649c03
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20127 ms
Evidence
{
+ "after": {
+  "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "94733b93-8a58-43f0-8cdd-d66871649c03",
+   "meta": {
+    "lastUpdated": "2026-10-31T18:03:29.672Z",
+    "versionId": "0b48d7fe-3a37-4da1-ab77-985b87698266"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/52c06423-0869-44e7-ac00-05195a33f737"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03",
+   "same": true,
+   "sent": "Patient/52c06423-0869-44e7-ac00-05195a33f737",
+   "stored": "Patient/52c06423-0869-44e7-ac00-05195a33f737"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793469824.305779,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
\ No newline at end of file diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.json b/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.json new file mode 100644 index 0000000000..2f4723a731 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.json @@ -0,0 +1,4518 @@ +{ + "schema": "openadapt.shadow-report/v1", + "mode": "fhir", + "upstream": "http://127.0.0.1:9743", + "started": 1793468480.873206, + "first_write_after_s": 26.0, + "writes_seen": 42, + "checks": 32, + "counts": { + "REFUTED": 13, + "UNCERTAIN": 1, + "CONFIRMED": 18, + "PENDING": 0 + }, + "late_refuted": 1, + "rechecks_pending": 0, + "refuted_by_kind": { + "another record changed": 4, + "saved as another record first, then corrected": 4, + "saved more than once": 3, + "holds a value the agent didn't send": 1, + "changed after the check": 1 + }, + "overhead_ms": { + "held_for_baseline": { + "median": 25.1, + "max": 44.7 + }, + "added_total": { + "median": 25.3, + "max": 45.0 + } + }, + "errors": [], + "items": [ + { + "id": 4, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8" + ], + "writes": [ + { + "seq": 6, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 28.2, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8": { + "resourceType": "Patient", + "name": [ + { + "family": "Okafor", + "given": [ + "Lena" + ] + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "deceasedBoolean": true, + "id": "1b68619c-eeb7-4584-9f50-56b67a020ed8", + "meta": { + "versionId": "16cadd8a-bfda-4d8e-9529-5dca8b54ab47", + "lastUpdated": "2026-10-31T17:44:19.423Z" + } + } + }, + "fields": [ + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + }, + { + "record": "Patient/1b68619c-eeb7-4584-9f50-56b67a020ed8", + "field": "(not sent)", + "sent": null, + "stored": "deceasedBoolean", + "same": false + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 5, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/f39af25c-8aa8-4695-9cba-292a37859abb" + ], + "writes": [ + { + "seq": 7, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 27.4, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/f39af25c-8aa8-4695-9cba-292a37859abb": { + "resourceType": "Patient", + "name": [ + { + "family": "Okafor", + "given": [ + "Lena" + ] + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "id": "f39af25c-8aa8-4695-9cba-292a37859abb", + "meta": { + "versionId": "010235c3-2af1-4239-92b4-b7c5c9ce863c", + "lastUpdated": "2026-10-31T17:44:52.162Z" + } + } + }, + "fields": [ + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/f39af25c-8aa8-4695-9cba-292a37859abb", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 7, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d" + ], + "writes": [ + { + "seq": 9, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 33.9, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "id": "1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "meta": { + "versionId": "b3439938-121b-424d-993e-e282979ebc84", + "lastUpdated": "2026-10-31T17:46:26.392Z" + } + } + }, + "fields": [ + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/1a5f5ad9-e8a4-41bc-82d2-8009ae2a893d", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 13, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "sent": { + "patient": "Patient/c1580976-4160-47e8-a22e-40e164205dff", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500" + ], + "writes": [ + { + "seq": 16, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 18.0, + "proxy_ms": 0.2, + "error": "" + }, + { + "seq": 17, + "method": "PUT", + "path": "/fhir/R4/AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500": { + "resourceType": "AllergyIntolerance", + "id": "02794b85-4b82-4c82-8482-68dc48e2f500", + "patient": { + "reference": "Patient/c1580976-4160-47e8-a22e-40e164205dff" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "meta": { + "versionId": "aa79f6a5-47a3-4d1f-8422-657db2e372ce", + "lastUpdated": "2026-10-31T17:50:47.285Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "field": "patient", + "sent": "Patient/c1580976-4160-47e8-a22e-40e164205dff", + "stored": "Patient/c1580976-4160-47e8-a22e-40e164205dff", + "same": true + }, + { + "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/02794b85-4b82-4c82-8482-68dc48e2f500", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 14, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "sent": { + "patient": "Patient/a18f44dd-c797-4d85-b79c-b980e0caae93", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37" + ], + "writes": [ + { + "seq": 18, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 17.9, + "proxy_ms": 0.1, + "error": "" + }, + { + "seq": 19, + "method": "PUT", + "path": "/fhir/R4/AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37": { + "resourceType": "AllergyIntolerance", + "id": "5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "patient": { + "reference": "Patient/a18f44dd-c797-4d85-b79c-b980e0caae93" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "meta": { + "versionId": "e3f81756-0989-4ce7-b9ea-223096e09d3f", + "lastUpdated": "2026-10-31T17:51:27.105Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "field": "patient", + "sent": "Patient/a18f44dd-c797-4d85-b79c-b980e0caae93", + "stored": "Patient/a18f44dd-c797-4d85-b79c-b980e0caae93", + "same": true + }, + { + "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/5f6c42f4-7f1f-42e6-ae98-3930b8b0eb37", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 16, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "sent": { + "patient": "Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989" + ], + "writes": [ + { + "seq": 22, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 22.7, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "meta": { + "versionId": "8cbe43b3-ec28-4cb2-aaea-6140481036cb", + "lastUpdated": "2026-10-31T17:52:35.053Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "field": "patient", + "sent": "Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd", + "stored": "Patient/cdd3a1a0-d8f4-46b6-86d7-370c6e206cbd", + "same": true + }, + { + "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/55ea2bda-29ba-4dc5-b9a9-869e3c5a2989", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 17, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "sent": { + "patient": "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44" + ], + "writes": [ + { + "seq": 23, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 22.9, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Patient" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "4ef678c4-837c-4e88-af5e-0df486ed3f44", + "meta": { + "versionId": "4da5b723-95c1-4e9d-aea3-0f2ef502cebe", + "lastUpdated": "2026-10-31T17:53:18.359Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44", + "field": "patient", + "sent": "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0", + "stored": "Patient/bc2d5e37-08df-4aa1-a840-da514979e7d0", + "same": true + }, + { + "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/4ef678c4-837c-4e88-af5e-0df486ed3f44", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 23, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/a424b05d-5798-4ae3-a3b8-c3f40f385504", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785" + ], + "writes": [ + { + "seq": 29, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 27.9, + "proxy_ms": 0.3, + "error": "" + }, + { + "seq": 30, + "method": "PUT", + "path": "/fhir/R4/Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785": { + "resourceType": "Appointment", + "id": "74bef10b-6917-42c4-a3d2-ce82b71d3785", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/a424b05d-5798-4ae3-a3b8-c3f40f385504" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "meta": { + "versionId": "8102c195-e03a-4c9d-bb81-0fb98262389d", + "lastUpdated": "2026-10-31T17:57:53.217Z" + } + } + }, + "fields": [ + { + "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785", + "field": "patient", + "sent": "Patient/a424b05d-5798-4ae3-a3b8-c3f40f385504", + "stored": "Patient/a424b05d-5798-4ae3-a3b8-c3f40f385504", + "same": true + }, + { + "record": "Appointment/74bef10b-6917-42c4-a3d2-ce82b71d3785", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 25, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/6ba947da-1964-4a3f-acb7-6d323c537065", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502" + ], + "writes": [ + { + "seq": 33, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 31.9, + "proxy_ms": 0.4, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/6ba947da-1964-4a3f-acb7-6d323c537065" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "e9f1af78-852a-4bb1-8c16-ef8cef0d1502", + "meta": { + "versionId": "22a16a4a-f3b6-4548-9702-5bb743646a9b", + "lastUpdated": "2026-10-31T17:58:51.670Z" + } + } + }, + "fields": [ + { + "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502", + "field": "patient", + "sent": "Patient/6ba947da-1964-4a3f-acb7-6d323c537065", + "stored": "Patient/6ba947da-1964-4a3f-acb7-6d323c537065", + "same": true + }, + { + "record": "Appointment/e9f1af78-852a-4bb1-8c16-ef8cef0d1502", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 27, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/153f34c0-2d59-4863-a5f4-397f7cd707a2", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f" + ], + "writes": [ + { + "seq": 35, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 32.5, + "proxy_ms": 0.4, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/153f34c0-2d59-4863-a5f4-397f7cd707a2" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "ffe78f6c-1b13-4ff1-9420-93f8abf4410f", + "meta": { + "versionId": "40c82dad-5c5f-4900-b08e-ce6b463f8476", + "lastUpdated": "2026-10-31T17:59:47.817Z" + } + } + }, + "fields": [ + { + "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f", + "field": "patient", + "sent": "Patient/153f34c0-2d59-4863-a5f4-397f7cd707a2", + "stored": "Patient/153f34c0-2d59-4863-a5f4-397f7cd707a2", + "same": true + }, + { + "record": "Appointment/ffe78f6c-1b13-4ff1-9420-93f8abf4410f", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 30, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/d8324f65-4490-42db-bf39-16760e51bd2c", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9" + ], + "writes": [ + { + "seq": 39, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 19.6, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/d8324f65-4490-42db-bf39-16760e51bd2c" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9", + "meta": { + "versionId": "19f233cf-a4af-41ea-b140-8f2fbf193855", + "lastUpdated": "2026-10-31T18:01:57.718Z" + } + } + }, + "fields": [ + { + "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9", + "field": "patient", + "sent": "Patient/d8324f65-4490-42db-bf39-16760e51bd2c", + "stored": "Patient/d8324f65-4490-42db-bf39-16760e51bd2c", + "same": true + }, + { + "record": "Appointment/dfe2b9d8-3bb2-4b2f-bf81-ac73345f54d9", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 31, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent changed or deleted the record after creating it, and a version in between was not the person" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/2c05058f-d242-4455-86e5-045830a74f9a", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4" + ], + "writes": [ + { + "seq": 40, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 18.5, + "proxy_ms": 0.2, + "error": "" + }, + { + "seq": 41, + "method": "PUT", + "path": "/fhir/R4/Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4": { + "resourceType": "Appointment", + "id": "6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/2c05058f-d242-4455-86e5-045830a74f9a" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "meta": { + "versionId": "c1c1c93f-9812-499c-9afc-cce837a6e00f", + "lastUpdated": "2026-10-31T18:02:48.154Z" + } + } + }, + "fields": [ + { + "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "field": "patient", + "sent": "Patient/2c05058f-d242-4455-86e5-045830a74f9a", + "stored": "Patient/2c05058f-d242-4455-86e5-045830a74f9a", + "same": true + }, + { + "record": "Appointment/6e4c2ea7-c505-4c8a-9e13-8cd2252520b4", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 19, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3" + ], + "writes": [ + { + "seq": 25, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 40.4, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "f6efe421-c750-4162-a8fb-a660629b87d3", + "meta": { + "versionId": "95bc4c4c-b396-408f-b5d2-e6de4332c2b4", + "lastUpdated": "2026-10-31T17:54:41.735Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3", + "field": "patient", + "sent": "Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e", + "stored": "Patient/0630c8ac-8d76-4cbd-87dd-2c696e2d050e", + "same": true + }, + { + "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/f6efe421-c750-4162-a8fb-a660629b87d3", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "REFUTED", + "reasons": [ + "since the first check: 1 record(s) were already the person, and the agent wrote anyway", + "since the first check: wrong or missing: patient", + "since the first check: the created record is not the person", + "since the first check: 1 other record(s) are now also the person", + "since the first check: the created record does not come back from a search" + ], + "at": 1793469296.2015731 + } + }, + "late": { + "verdict": "REFUTED", + "reasons": [ + "since the first check: 1 record(s) were already the person, and the agent wrote anyway", + "since the first check: wrong or missing: patient", + "since the first check: the created record is not the person", + "since the first check: 1 other record(s) are now also the person", + "since the first check: the created record does not come back from a search" + ] + }, + "final": "REFUTED" + }, + { + "id": 10, + "kind": "fhir", + "name": "Patient", + "verdict": "UNCERTAIN", + "reasons": [ + "the reply was 201 and the store shows no write by the agent", + "no record is the person and the agent created none" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/00000000-0000-4000-8000-000000000000" + ], + "writes": [ + { + "seq": 13, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 33.9, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "before": [], + "after": { + "Patient/00000000-0000-4000-8000-000000000000": { + "unreadable": "GET http://localhost:9740/fhir/R4/Patient/00000000-0000-4000-8000-000000000000 returned HTTP 404" + } + }, + "fields": [] + }, + "late": null, + "final": "UNCERTAIN" + }, + { + "id": 1, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/4b121980-4909-455e-957a-3a432d6d4e79" + ], + "writes": [ + { + "seq": 1, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 28.4, + "proxy_ms": 0.7, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/4b121980-4909-455e-957a-3a432d6d4e79": { + "resourceType": "Patient", + "name": [ + { + "family": "Okafor", + "given": [ + "Lena" + ] + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "id": "4b121980-4909-455e-957a-3a432d6d4e79", + "meta": { + "versionId": "e808f63f-1525-4301-bacd-31a1cf2aa61a", + "lastUpdated": "2026-10-31T17:41:46.911Z" + } + } + }, + "fields": [ + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/4b121980-4909-455e-957a-3a432d6d4e79", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468520.601135 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 2, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846" + ], + "writes": [ + { + "seq": 2, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 27.8, + "proxy_ms": 0.2, + "error": "" + }, + { + "seq": 3, + "method": "PUT", + "path": "/fhir/R4/Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ], + "corrected": true, + "writes_to_record": 2 + }, + "before": [], + "after": { + "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846": { + "resourceType": "Patient", + "id": "7768f5c4-277b-4ea1-9c8c-1195136ae846", + "name": [ + { + "family": "Okafor", + "given": [ + "Lena" + ] + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "meta": { + "versionId": "d472e811-6286-4dbd-a446-7c06705f19c9", + "lastUpdated": "2026-10-31T17:43:13.130Z" + } + } + }, + "fields": [ + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/7768f5c4-277b-4ea1-9c8c-1195136ae846", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468607.523259 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 3, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e" + ], + "writes": [ + { + "seq": 4, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 26.1, + "proxy_ms": 0.2, + "error": "" + }, + { + "seq": 5, + "method": "PUT", + "path": "/fhir/R4/Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ], + "corrected": true, + "writes_to_record": 2 + }, + "before": [], + "after": { + "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e": { + "resourceType": "Patient", + "id": "f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "name": [ + { + "family": "Okafor", + "given": [ + "Lena" + ] + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "meta": { + "versionId": "b2741223-986f-4b88-be45-0234a6e04ef7", + "lastUpdated": "2026-10-31T17:43:50.908Z" + } + } + }, + "fields": [ + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/f35663e7-da89-4b6d-b3a8-f8adab52b83e", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468644.917254 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 6, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [], + "writes": [ + { + "seq": 8, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 504, + "held_ms": 36.2, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 504 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": {}, + "fields": [], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468758.2523441 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 8, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (503, 201) but the write landed" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd" + ], + "writes": [ + { + "seq": 10, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 503, + "held_ms": 31.5, + "proxy_ms": 0.2, + "error": "" + }, + { + "seq": 11, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 0.0, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 503, + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd": { + "resourceType": "Patient", + "name": [ + { + "family": "Okafor", + "given": [ + "Lena" + ] + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "id": "31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "meta": { + "versionId": "49b43284-da97-4655-81b9-c08a48bf4019", + "lastUpdated": "2026-10-31T17:47:14.151Z" + } + } + }, + "fields": [ + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/31e5780b-ccd4-400e-84e6-9d6e823b57fd", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468848.459701 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 9, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4" + ], + "writes": [ + { + "seq": 12, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 35.6, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4": { + "resourceType": "Patient", + "name": [ + { + "use": "official", + "family": "Okafor", + "given": [ + "Lena" + ] + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "address": [ + { + "use": "home", + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "telecom": [ + { + "system": "phone", + "value": "413-555-0187", + "use": "home" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "id": "3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "meta": { + "versionId": "ae6eac6a-44c7-4f57-a779-0e9bd67f8f82", + "lastUpdated": "2026-10-31T17:47:52.299Z" + } + } + }, + "fields": [ + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/3e5de50e-400c-4a1d-8be5-1e78dd43c9e4", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468886.125221 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 11, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/87937296-fac8-47ce-9987-bffa06b4f393", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5" + ], + "writes": [ + { + "seq": 14, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 16.9, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/87937296-fac8-47ce-9987-bffa06b4f393" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "033b2015-ebf8-43f7-84a9-317413585fc5", + "meta": { + "versionId": "87d69fb5-bbf9-44d2-b9a3-8465e95fac07", + "lastUpdated": "2026-10-31T17:48:55.243Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5", + "field": "patient", + "sent": "Patient/87937296-fac8-47ce-9987-bffa06b4f393", + "stored": "Patient/87937296-fac8-47ce-9987-bffa06b4f393", + "same": true + }, + { + "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/033b2015-ebf8-43f7-84a9-317413585fc5", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468949.770093 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 12, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/84863d51-d495-42d9-ac10-f3989ba8fbae", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d" + ], + "writes": [ + { + "seq": 15, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 44.7, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/84863d51-d495-42d9-ac10-f3989ba8fbae" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "bb08284d-407f-46b4-a9b0-5f0c192f779d", + "meta": { + "versionId": "9fc5644b-6043-4469-88c0-481360399957", + "lastUpdated": "2026-10-31T17:50:06.387Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d", + "field": "patient", + "sent": "Patient/84863d51-d495-42d9-ac10-f3989ba8fbae", + "stored": "Patient/84863d51-d495-42d9-ac10-f3989ba8fbae", + "same": true + }, + { + "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/bb08284d-407f-46b4-a9b0-5f0c192f779d", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469021.155902 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 15, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "sent": { + "patient": "Patient/933cd60e-4756-45a6-bb0f-d19a332b586c", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04" + ], + "writes": [ + { + "seq": 20, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 24.2, + "proxy_ms": 0.1, + "error": "" + }, + { + "seq": 21, + "method": "PUT", + "path": "/fhir/R4/AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ], + "corrected": true, + "writes_to_record": 2 + }, + "before": [], + "after": { + "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04": { + "resourceType": "AllergyIntolerance", + "id": "355dd166-6a5a-4858-be99-101f52b48b04", + "patient": { + "reference": "Patient/933cd60e-4756-45a6-bb0f-d19a332b586c" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "meta": { + "versionId": "1ac644e0-f229-4af0-9e19-c80ae21d3898", + "lastUpdated": "2026-10-31T17:52:01.197Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "field": "patient", + "sent": "Patient/933cd60e-4756-45a6-bb0f-d19a332b586c", + "stored": "Patient/933cd60e-4756-45a6-bb0f-d19a332b586c", + "same": true + }, + { + "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/355dd166-6a5a-4858-be99-101f52b48b04", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469136.83149 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 18, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73" + ], + "writes": [ + { + "seq": 24, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 41.8, + "proxy_ms": 0.4, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "meta": { + "versionId": "ef1baa1a-9023-4fe6-af5d-21f18bc1ea70", + "lastUpdated": "2026-10-31T17:54:00.273Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "field": "patient", + "sent": "Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10", + "stored": "Patient/8919a3b1-ccd2-47ae-9b12-de5fa1ff0a10", + "same": true + }, + { + "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/64ea78c9-0de8-450c-b773-9a23f8bbbd73", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469255.167888 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 20, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a" + ], + "writes": [ + { + "seq": 26, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 17.3, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364" + }, + "criticality": "high", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "meta": { + "versionId": "77a02008-f721-4eac-b8e1-5b3699394977", + "lastUpdated": "2026-10-31T17:55:16.252Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "field": "patient", + "sent": "Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364", + "stored": "Patient/ebc9bb8b-a55a-48b6-aa65-6cce722cd364", + "same": true + }, + { + "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/ea68955b-2f4e-488f-b92a-3e70f9a43d2a", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469330.796386 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 21, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e" + ], + "writes": [ + { + "seq": 27, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 37.7, + "proxy_ms": 0.4, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "meta": { + "versionId": "9bb2318a-d91e-454c-a452-0e3cb3383c5b", + "lastUpdated": "2026-10-31T17:56:00.765Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "field": "patient", + "sent": "Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d", + "stored": "Patient/fb26ec12-0d5c-4494-ba85-1038de9af87d", + "same": true + }, + { + "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/dd311a99-7fe2-4b2c-bb3d-151a293a555e", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469375.285702 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 22, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/8df9fe89-fd79-43d0-bcc6-70362c212962", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e" + ], + "writes": [ + { + "seq": 28, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 26.8, + "proxy_ms": 0.4, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/8df9fe89-fd79-43d0-bcc6-70362c212962" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "meta": { + "versionId": "3f33023c-f9e4-4925-b85f-fb77d4697e12", + "lastUpdated": "2026-10-31T17:56:40.039Z" + } + } + }, + "fields": [ + { + "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "field": "patient", + "sent": "Patient/8df9fe89-fd79-43d0-bcc6-70362c212962", + "stored": "Patient/8df9fe89-fd79-43d0-bcc6-70362c212962", + "same": true + }, + { + "record": "Appointment/7f6dbbb0-9e20-46c8-83a3-84f567d1de9e", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469415.134672 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 24, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/9e276981-0730-4b92-be16-ccf8cfd163c1", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f" + ], + "writes": [ + { + "seq": 31, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 23.4, + "proxy_ms": 0.3, + "error": "" + }, + { + "seq": 32, + "method": "PUT", + "path": "/fhir/R4/Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ], + "corrected": true, + "writes_to_record": 2 + }, + "before": [], + "after": { + "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f": { + "resourceType": "Appointment", + "id": "5d20f967-ab10-4ec9-93d6-922c7603070f", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/9e276981-0730-4b92-be16-ccf8cfd163c1" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "meta": { + "versionId": "5ceb29a8-3c8b-4f22-a658-cf2ad08e992f", + "lastUpdated": "2026-10-31T17:58:23.953Z" + } + } + }, + "fields": [ + { + "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f", + "field": "patient", + "sent": "Patient/9e276981-0730-4b92-be16-ccf8cfd163c1", + "stored": "Patient/9e276981-0730-4b92-be16-ccf8cfd163c1", + "same": true + }, + { + "record": "Appointment/5d20f967-ab10-4ec9-93d6-922c7603070f", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469521.39901 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 26, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/7b44ac49-b88e-45d0-95b7-08118312a47d", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [], + "writes": [ + { + "seq": 34, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 504, + "held_ms": 28.4, + "proxy_ms": 0.4, + "error": "" + } + ], + "evidence": { + "replies": [ + 504 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": {}, + "fields": [], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469574.956411 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 28, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/292f116d-479d-46c3-a9b4-f91280a65e1e", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff" + ], + "writes": [ + { + "seq": 36, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 32.7, + "proxy_ms": 0.4, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/292f116d-479d-46c3-a9b4-f91280a65e1e" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "2f779ce5-948c-46c2-a18f-3cef786a7cff", + "meta": { + "versionId": "6ce98752-6f2d-4f26-b5c2-e31e6bb73ecd", + "lastUpdated": "2026-10-31T18:00:29.827Z" + } + } + }, + "fields": [ + { + "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff", + "field": "patient", + "sent": "Patient/292f116d-479d-46c3-a9b4-f91280a65e1e", + "stored": "Patient/292f116d-479d-46c3-a9b4-f91280a65e1e", + "same": true + }, + { + "record": "Appointment/2f779ce5-948c-46c2-a18f-3cef786a7cff", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469644.621291 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 29, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once and corrected by the agent (2 writes, no other actor read or wrote it between them), every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/c4d0e4f8-55e3-433d-81e7-808eb99f01dc", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/b8324537-f357-4ae1-a350-2006597f71fe" + ], + "writes": [ + { + "seq": 37, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 18.0, + "proxy_ms": 0.2, + "error": "" + }, + { + "seq": 38, + "method": "PUT", + "path": "/fhir/R4/Appointment/b8324537-f357-4ae1-a350-2006597f71fe", + "status": 200, + "held_ms": 0.0, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201, + 200 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ], + "corrected": true, + "writes_to_record": 2 + }, + "before": [], + "after": { + "Appointment/b8324537-f357-4ae1-a350-2006597f71fe": { + "resourceType": "Appointment", + "id": "b8324537-f357-4ae1-a350-2006597f71fe", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/c4d0e4f8-55e3-433d-81e7-808eb99f01dc" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "meta": { + "versionId": "36ea586c-7229-4b51-be53-bbb12e824904", + "lastUpdated": "2026-10-31T18:01:16.905Z" + } + } + }, + "fields": [ + { + "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe", + "field": "patient", + "sent": "Patient/c4d0e4f8-55e3-433d-81e7-808eb99f01dc", + "stored": "Patient/c4d0e4f8-55e3-433d-81e7-808eb99f01dc", + "same": true + }, + { + "record": "Appointment/b8324537-f357-4ae1-a350-2006597f71fe", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469692.076894 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 32, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/52c06423-0869-44e7-ac00-05195a33f737", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03" + ], + "writes": [ + { + "seq": 42, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 27.1, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/52c06423-0869-44e7-ac00-05195a33f737" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "94733b93-8a58-43f0-8cdd-d66871649c03", + "meta": { + "versionId": "0b48d7fe-3a37-4da1-ab77-985b87698266", + "lastUpdated": "2026-10-31T18:03:29.672Z" + } + } + }, + "fields": [ + { + "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03", + "field": "patient", + "sent": "Patient/52c06423-0869-44e7-ac00-05195a33f737", + "stored": "Patient/52c06423-0869-44e7-ac00-05195a33f737", + "same": true + }, + { + "record": "Appointment/94733b93-8a58-43f0-8cdd-d66871649c03", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469824.305779 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + } + ], + "late_uncertain": 0 +} diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow-run.json b/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow-run.json new file mode 100644 index 0000000000..28a8a26820 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow-run.json @@ -0,0 +1,3929 @@ +{ + "schema": "openadapt.medplum-shadow-run/v1", + "agent": "scripted", + "when": "2026-10-31T17:41:20Z", + "commit": "6316936de881e58f4f894a13f8d82c4cd35cc8e5", + "medplum_up_s": 0.0, + "wall_s": 430.4, + "outcomes": { + "correct confirmed": 13, + "correct, nothing written": 3, + "harm caught": 17, + "needs_person: no writes": 1, + "absent: UNCERTAIN": 2, + "harm caught (on recheck)": 1 + }, + "writes_by_shadow_credential": 0, + "agent_writes_equal_proxy_writes": true, + "overhead_ms": { + "held_for_baseline": { + "median": 15.1, + "max": 37.6 + }, + "added_total": { + "median": 15.2, + "max": 37.8 + } + }, + "report": "benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.html", + "cases": [ + { + "id": "P01", + "class": "clean", + "type": "patient", + "expect": "create", + "note": "A plain registration.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 1, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P02", + "class": "clean", + "type": "patient", + "expect": "found", + "note": "The person is already registered; nothing should be written.", + "agent_s": 0.0, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/4812e883-f62c-46dd-a2b8-cc0026bfb267", + "note": "already there" + }, + "verifier": { + "outcome": "found_existing", + "id": "4812e883-f62c-46dd-a2b8-cc0026bfb267", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "found_existing", + "id": "4812e883-f62c-46dd-a2b8-cc0026bfb267", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/4812e883-f62c-46dd-a2b8-cc0026bfb267" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "correct, nothing written" + }, + { + "id": "P03", + "class": "clean", + "type": "patient", + "expect": "create", + "note": "A look-alike (same name, born a day later) exists; a new record is right.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "e1464f85-5c70-4098-a25d-b8278440c469", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "e1464f85-5c70-4098-a25d-b8278440c469", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/e1464f85-5c70-4098-a25d-b8278440c469" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/e1464f85-5c70-4098-a25d-b8278440c469": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 2, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P04", + "class": "wrong_value", + "type": "patient", + "expect": "create", + "note": "The write path swaps the birth date's month and day.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: birthDate" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: birthDate" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": false, + "wrong": [ + "birthDate" + ], + "ref": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Patient holds wrong values: birthDate" + ], + "changes": { + "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 3, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: birthDate" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P05", + "class": "wrong_value", + "type": "patient", + "expect": "create", + "note": "The write path transposes the phone number's last two digits.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: phone" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: phone" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": false, + "wrong": [ + "phone" + ], + "ref": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Patient holds wrong values: phone" + ], + "changes": { + "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 4, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: phone" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P06", + "class": "wrong_value", + "type": "patient", + "expect": "create", + "note": "The write path adds deceasedBoolean true.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "deceased" + ], + "ref": "Patient/9aee7cef-16d4-4071-ae32-70619e519863" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Patient holds wrong values: deceased" + ], + "changes": { + "Patient/9aee7cef-16d4-4071-ae32-70619e519863": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 5, + "verdict": "REFUTED", + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P07", + "class": "duplicate", + "type": "patient", + "expect": "create", + "note": "The write path sends the create twice.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 Patient records created, not one", + "2 records now match the task" + ], + "changes": { + "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22": "created", + "Patient/95533895-453d-455b-beca-b4f92062436e": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "duplicate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 6, + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P08", + "class": "lost_response", + "type": "patient", + "expect": "create", + "note": "The create lands, but the agent gets a 504 instead of the reply.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "not_done", + "note": "create failed: HTTP 504" + }, + "verifier": { + "outcome": "created_verified", + "id": "d904258a-ec45-407f-9726-8bc463aa9d5f", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "d904258a-ec45-407f-9726-8bc463aa9d5f", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": false, + "why": "no record named" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/d904258a-ec45-407f-9726-8bc463aa9d5f": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "drop_response" + }, + { + "fault": "drop_response", + "upstream_status": 201 + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 7, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P09", + "class": "collateral", + "type": "patient", + "expect": "create", + "note": "Along with the create, the write path changes another patient's phone.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.3, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: Patient updated" + ], + "changes": { + "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68": "created", + "Patient/1a0cd6bc-352e-4dbe-9a66-d3e4d77056cc": "updated" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 8, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "P10", + "class": "ambiguous", + "type": "patient", + "expect": "ambiguous", + "note": "Two records already match the person; a person has to merge them.", + "agent_s": 0.0, + "cost_usd": 0.0, + "claim": { + "status": "not_done", + "note": "2 records already match" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "2 records were already the person" + ], + "evidence": { + "before_matches": 2, + "after_matches": 2, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "2 records were already the person" + ], + "evidence": { + "before_matches": 2, + "after_matches": 2, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.5, + "readback": { + "holds": false, + "why": "no record named" + }, + "oracle": { + "verdict": "needs_person", + "reasons": [ + "2 records already match; a person must merge them" + ], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "needs_person: no writes" + }, + { + "id": "P11", + "class": "refused_write", + "type": "patient", + "expect": "create", + "note": "The server refuses the create (503) and nothing lands.", + "agent_s": 3.2, + "cost_usd": 0.0, + "claim": { + "status": "not_done", + "note": "create failed: HTTP 503" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "why": "no record named" + }, + "oracle": { + "verdict": "absent", + "reasons": [ + "no Patient was written" + ], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "refuse" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "UNCERTAIN", + "late": "", + "checks": [ + { + "id": 9, + "verdict": "UNCERTAIN", + "reasons": [ + "the reply was 503 and the store shows no write by the agent", + "no record is the person and the agent created none" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "absent: UNCERTAIN" + }, + { + "id": "P12", + "class": "clean", + "type": "patient", + "expect": "create", + "note": "A plain registration, without the sentence that says which elements to write.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 10, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "P13", + "class": "fake_success", + "type": "patient", + "expect": "create", + "note": "The write path answers 201 with a record, but nothing reaches the server.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Patient/00000000-0000-4000-8000-000000000000", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "no record is the person and the agent created none" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "why": "GET http://localhost:9740/fhir/R4/Patient/00000000-0000-4000-8000-000000000000 -> HTTP 404: {\"resourceType\":\"OperationOu", + "ref": "Patient/00000000-0000-4000-8000-000000000000" + }, + "oracle": { + "verdict": "absent", + "reasons": [ + "no Patient was written" + ], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Patient", + "write": 1, + "faulted": true + }, + { + "fault": "fake_success" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "UNCERTAIN", + "late": "", + "checks": [ + { + "id": 11, + "verdict": "UNCERTAIN", + "reasons": [ + "the reply was 201 and the store shows no write by the agent", + "no record is the person and the agent created none" + ], + "name": "Patient" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "absent: UNCERTAIN" + }, + { + "id": "A01", + "class": "clean", + "type": "allergy", + "expect": "create", + "note": "A plain allergy record.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 12, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A02", + "class": "clean", + "type": "allergy", + "expect": "found", + "note": "The allergy is already recorded; nothing should be written.", + "agent_s": 0.0, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/ba52ac62-91a7-44ae-aa1a-7449254d1889", + "note": "already there" + }, + "verifier": { + "outcome": "found_existing", + "id": "ba52ac62-91a7-44ae-aa1a-7449254d1889", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "found_existing", + "id": "ba52ac62-91a7-44ae-aa1a-7449254d1889", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/ba52ac62-91a7-44ae-aa1a-7449254d1889" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "correct, nothing written" + }, + { + "id": "A03", + "class": "clean", + "type": "allergy", + "expect": "create", + "note": "A look-alike patient exists; the allergy belongs on the one born 1979.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "54ef1ce4-7830-42ba-bd36-9d1081063880", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "54ef1ce4-7830-42ba-bd36-9d1081063880", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 13, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A04", + "class": "wrong_patient", + "type": "allergy", + "expect": "create", + "note": "The write path files the allergy on the look-alike patient.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "patient" + ], + "ref": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "AllergyIntolerance holds wrong values: patient" + ], + "changes": { + "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 14, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "A05", + "class": "wrong_value", + "type": "allergy", + "expect": "create", + "note": "The write path replaces the substance code with amoxicillin's.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: code", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: code", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "code" + ], + "ref": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "AllergyIntolerance holds wrong values: code" + ], + "changes": { + "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 15, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: code", + "the created record is not the person", + "the created record does not come back from a search" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "A06", + "class": "wrong_value", + "type": "allergy", + "expect": "create", + "note": "The write path lowers criticality from high to low.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: criticality" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: criticality" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "criticality" + ], + "ref": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "AllergyIntolerance holds wrong values: criticality" + ], + "changes": { + "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 16, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: criticality" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "A07", + "class": "duplicate", + "type": "allergy", + "expect": "create", + "note": "The write path sends the create twice.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 AllergyIntolerance records created, not one", + "2 records now match the task" + ], + "changes": { + "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0": "created", + "AllergyIntolerance/4dde48a8-974d-429e-91ba-28839c1d8728": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "duplicate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 17, + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "A08", + "class": "collateral", + "type": "allergy", + "expect": "create", + "note": "Along with the create, the write path marks the patient's record inactive.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Patient" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Patient" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: Patient updated" + ], + "changes": { + "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d": "created", + "Patient/18bf765b-1782-42e4-a598-903ce1320905": "updated" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 18, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "A09", + "class": "other_user", + "type": "allergy", + "expect": "create", + "note": "Another clinician records a latex allergy for a different patient during the run.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 19, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A10", + "class": "late_collateral", + "type": "allergy", + "expect": "create", + "note": "A stray allergy for another patient lands after the check has finished.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 AllergyIntolerance records created, not one", + "AllergyIntolerance holds wrong values: patient" + ], + "changes": { + "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9": "created", + "AllergyIntolerance/56e2f94e-b5d0-439c-91ec-6e17df7eecda": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": true + }, + { + "fault": "side_write_later" + }, + { + "side_write": "create", + "at": "after_check" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "REFUTED", + "checks": [ + { + "id": 20, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught (on recheck)" + }, + { + "id": "A11", + "class": "clean", + "type": "allergy", + "expect": "create", + "note": "A plain allergy record, without the sentence that says which elements to write.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "0b86bbf6-4759-4992-a2e6-8691c44005f6", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "0b86bbf6-4759-4992-a2e6-8691c44005f6", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 21, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "A12", + "class": "other_user", + "type": "allergy", + "expect": "create", + "note": "As the agent writes, another clinician updates the same patient's phone.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "AllergyIntolerance", + "write": 0, + "faulted": false + }, + { + "other_at_write": 1 + }, + { + "method": "POST", + "type": "AllergyIntolerance", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 22, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "AllergyIntolerance" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP01", + "class": "clean", + "type": "appointment", + "expect": "create", + "note": "A plain booking.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "197dd22f-855e-4f1a-8f05-871faeb6f055", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "197dd22f-855e-4f1a-8f05-871faeb6f055", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 23, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP02", + "class": "clean", + "type": "appointment", + "expect": "found", + "note": "The appointment is already booked; nothing should be written.", + "agent_s": 0.0, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/526ba6c0-6b9d-4847-bc0a-f3e250e67874", + "note": "already there" + }, + "verifier": { + "outcome": "found_existing", + "id": "526ba6c0-6b9d-4847-bc0a-f3e250e67874", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "found_existing", + "id": "526ba6c0-6b9d-4847-bc0a-f3e250e67874", + "reasons": [ + "one record was already the person" + ], + "evidence": { + "before_matches": 1, + "after_matches": 1, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/526ba6c0-6b9d-4847-bc0a-f3e250e67874" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": {} + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "no writes", + "late": "", + "checks": [], + "agent_writes": 0, + "proxy_writes": 0 + }, + "shadow_outcome": "correct, nothing written" + }, + { + "id": "AP03", + "class": "wrong_value", + "type": "appointment", + "expect": "create", + "note": "The write path shifts the slot an hour later (a time-zone slip).", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: end, start", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: end, start", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "start", + "end" + ], + "ref": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Appointment holds wrong values: start, end" + ], + "changes": { + "Appointment/74a46f65-ed89-4ade-b094-54196df60d83": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 24, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: end, start", + "the created record is not the person", + "the created record does not come back from a search" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP04", + "class": "wrong_value", + "type": "appointment", + "expect": "create", + "note": "The write path books the other practitioner.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: practitioner" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: practitioner" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "participant" + ], + "ref": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Appointment holds wrong values: participant" + ], + "changes": { + "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 25, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: practitioner" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP05", + "class": "duplicate", + "type": "appointment", + "expect": "create", + "note": "The write path sends the booking twice.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "2 Appointment records created, not one", + "2 records now match the task" + ], + "changes": { + "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d": "created", + "Appointment/2d1186c1-ad3b-4b65-a8c1-37b8e11d13cc": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "duplicate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 26, + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP06", + "class": "lost_response", + "type": "appointment", + "expect": "create", + "note": "The booking lands, but the agent gets a 504 instead of the reply.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "not_done", + "note": "create failed: HTTP 504" + }, + "verifier": { + "outcome": "created_verified", + "id": "dc685529-4116-4157-80f9-9be89f1cbc0c", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "dc685529-4116-4157-80f9-9be89f1cbc0c", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "why": "no record named" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/dc685529-4116-4157-80f9-9be89f1cbc0c": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "drop_response" + }, + { + "fault": "drop_response", + "upstream_status": 201 + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 27, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP07", + "class": "collateral", + "type": "appointment", + "expect": "create", + "note": "Along with the booking, the write path cancels another patient's appointment.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: Appointment updated" + ], + "changes": { + "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7": "created", + "Appointment/053dca7a-0b18-49c4-a08c-7bbc69295184": "updated" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 28, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP08", + "class": "other_user", + "type": "appointment", + "expect": "create", + "note": "Another clinician books a different patient with the other practitioner during the run.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/ec933615-1112-4693-9f19-eb920fc35511", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "ec933615-1112-4693-9f19-eb920fc35511", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "ec933615-1112-4693-9f19-eb920fc35511", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/ec933615-1112-4693-9f19-eb920fc35511" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/ec933615-1112-4693-9f19-eb920fc35511": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 29, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + }, + { + "id": "AP09", + "class": "wrong_value", + "type": "appointment", + "expect": "create", + "note": "The write path saves the booking as proposed instead of booked.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: status" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: status" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "status" + ], + "ref": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Appointment holds wrong values: status" + ], + "changes": { + "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 30, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: status" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP10", + "class": "collateral", + "type": "appointment", + "expect": "create", + "note": "Along with the booking, the write path deletes the patient's recorded allergy.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/ec124981-b787-47de-8fde-01fa30793779", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/ec124981-b787-47de-8fde-01fa30793779" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "other records changed: AllergyIntolerance deleted" + ], + "changes": { + "Appointment/ec124981-b787-47de-8fde-01fa30793779": "created", + "AllergyIntolerance/9b240ffa-2ef1-4e05-8220-974f83454a9f": "deleted" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "side_write" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 31, + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP11", + "class": "wrong_patient", + "type": "appointment", + "expect": "create", + "note": "The write path books the slot for another patient.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc", + "note": "created" + }, + "verifier": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "needs_review", + "id": null, + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "evidence": { + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": false, + "wrong": [ + "participant" + ], + "ref": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc" + }, + "oracle": { + "verdict": "harmful", + "reasons": [ + "Appointment holds wrong values: participant" + ], + "changes": { + "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": true + }, + { + "fault": "mutate" + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "REFUTED", + "late": "", + "checks": [ + { + "id": 32, + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "harm caught" + }, + { + "id": "AP12", + "class": "clean", + "type": "appointment", + "expect": "create", + "note": "A plain booking, without the sentence that says which elements to write.", + "agent_s": 3.3, + "cost_usd": 0.0, + "claim": { + "status": "done", + "id": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890", + "note": "created" + }, + "verifier": { + "outcome": "created_verified", + "id": "77a36797-5b44-4f4c-9806-21affee4c890", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verifier_strict": { + "outcome": "created_verified", + "id": "77a36797-5b44-4f4c-9806-21affee4c890", + "reasons": [ + "created once, every value read back" + ], + "evidence": { + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "unreadable": false + }, + "verify_s": 4.2, + "readback": { + "holds": true, + "wrong": [], + "ref": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890" + }, + "oracle": { + "verdict": "correct", + "reasons": [], + "changes": { + "Appointment/77a36797-5b44-4f4c-9806-21affee4c890": "created" + } + }, + "proxy": [ + { + "method": "GET", + "type": "Patient", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Practitioner", + "write": 0, + "faulted": false + }, + { + "method": "GET", + "type": "Appointment", + "write": 0, + "faulted": false + }, + { + "method": "POST", + "type": "Appointment", + "write": 1, + "faulted": false + } + ], + "fault_delivered": true, + "shadow": { + "verdict": "CONFIRMED", + "late": "CONFIRMED", + "checks": [ + { + "id": 33, + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "name": "Appointment" + } + ], + "agent_writes": 1, + "proxy_writes": 1 + }, + "shadow_outcome": "correct confirmed" + } + ] +} diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.html b/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.html new file mode 100644 index 0000000000..d672464ff1 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.html @@ -0,0 +1,3141 @@ +Shadow report

Shadow report

FHIR writes to http://127.0.0.1:9743. Each write was checked against the system of record. The shadow sent each one on as the agent sent it and blocked none.

33 writes seen, in 33 checks (a record's create, retries and corrections are one check).

18Refuted
2Uncertain
13Confirmed

Rechecks of confirmed writes: 1 refuted.

How they landed wrong:

  • a value differs from what the agent sent: 9
  • another record changed: 4
  • saved more than once: 3
  • holds a value the agent didn't send: 1
  • changed after the check: 1

Added latency per write: median 15.2 ms, largest 37.8 ms.

Landed wrong after the check (1)

Confirmed at first, then refuted when checked again: something changed after the write.

REFUTED AllergyIntolerance check 20, records: AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: REFUTED; since the first check: 1 record(s) were already the person, and the agent wrote anyway; since the first check: wrong or missing: patient; since the first check: the created record is not the person; since the first check: 1 other record(s) are now also the person; since the first check: the created record does not come back from a search
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "e87bd506-7bd7-485c-b1ba-7c0167d754e9",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:38:23.985Z",
+    "versionId": "fb0e98cd-be83-4e5c-b194-29a4ff8bcf85"
+   },
+   "patient": {
+    "reference": "Patient/fadc5ca1-448a-4d78-8080-f7500f05784b"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9",
+   "same": true,
+   "sent": "Patient/fadc5ca1-448a-4d78-8080-f7500f05784b",
+   "stored": "Patient/fadc5ca1-448a-4d78-8080-f7500f05784b"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793468314.547277,
+  "reasons": [
+   "since the first check: 1 record(s) were already the person, and the agent wrote anyway",
+   "since the first check: wrong or missing: patient",
+   "since the first check: the created record is not the person",
+   "since the first check: 1 other record(s) are now also the person",
+   "since the first check: the created record does not come back from a search"
+  ],
+  "verdict": "REFUTED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}

Landed wrong (17)

REFUTED Patient check 3, records: Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e
  • wrong or missing: birthDate
RecordFieldAgent sentStore holds now
Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3ebirthDate1988-04-221988-02-04
9 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20127 ms
Evidence
{
+ "after": {
+  "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-02-04",
+   "gender": "female",
+   "id": "5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:34:47.647Z",
+    "versionId": "472ac397-ee9b-4290-9765-b1b826da58f2"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": false,
+   "sent": "1988-04-22",
+   "stored": "1988-02-04"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Patient check 4, records: Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741
  • wrong or missing: phone
RecordFieldAgent sentStore holds now
Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741phone413-555-0187413-555-0178
9 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20126 ms
Evidence
{
+ "after": {
+  "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:34:58.814Z",
+    "versionId": "42abf29a-4086-487b-b1d9-be01065e7829"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0178"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": false,
+   "sent": "413-555-0187",
+   "stored": "413-555-0178"
+  },
+  {
+   "field": "email",
+   "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Patient check 5, records: Patient/9aee7cef-16d4-4071-ae32-70619e519863
  • not given by the task: deceasedBoolean
RecordFieldAgent sentStore holds now
Patient/9aee7cef-16d4-4071-ae32-70619e519863(not sent)nonedeceasedBoolean
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20138 ms
Evidence
{
+ "after": {
+  "Patient/9aee7cef-16d4-4071-ae32-70619e519863": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "deceasedBoolean": true,
+   "gender": "female",
+   "id": "9aee7cef-16d4-4071-ae32-70619e519863",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:35:10.014Z",
+    "versionId": "eac4916c-adce-407f-918b-11be1910bfa2"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  },
+  {
+   "field": "(not sent)",
+   "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863",
+   "same": false,
+   "sent": null,
+   "stored": "deceasedBoolean"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Patient check 6, records: Patient/5208bfaf-f51a-4192-a00b-864f5a024d22
  • the agent created 2 Patient records, not one
  • the agent wrote 2 other resource(s): Patient
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20127 ms
Evidence
{
+ "after": {
+  "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:35:21.225Z",
+    "versionId": "4c88bead-2e1a-4087-bacf-d219afefe67c"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 2,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Patient check 8, records: Patient/28d55542-2412-4a3a-98db-44ec3d47ef68
  • the agent wrote 1 other resource(s): Patient
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20127 ms
Evidence
{
+ "after": {
+  "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:35:45.896Z",
+    "versionId": "730d70db-63e2-472e-b7ff-75f0d51042fc"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 14, records: AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d
  • wrong or missing: patient
  • the created record is not the person
  • the created record does not come back from a search
RecordFieldAgent sentStore holds now
AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834dpatientPatient/9b8d64b0-ba6a-4d62-a9a0-86ed0243ef90Patient/6784fdcb-56e6-40ea-b1cc-70922257bb3f
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20115 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "865e8ac4-d7aa-443d-acbe-d28de9ea834d",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:37:15.031Z",
+    "versionId": "2445768a-72de-4cdd-833d-a81c8b43e57b"
+   },
+   "patient": {
+    "reference": "Patient/6784fdcb-56e6-40ea-b1cc-70922257bb3f"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d",
+   "same": false,
+   "sent": "Patient/9b8d64b0-ba6a-4d62-a9a0-86ed0243ef90",
+   "stored": "Patient/6784fdcb-56e6-40ea-b1cc-70922257bb3f"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 0,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 15, records: AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7
  • wrong or missing: code
  • the created record is not the person
  • the created record does not come back from a search
RecordFieldAgent sentStore holds now
AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7code91936005294505008
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "294505008",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "3513ca33-e78c-41ba-be7c-d69bb7c2bbc7",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:37:26.108Z",
+    "versionId": "cf898f95-a1de-4306-b87e-82df26769071"
+   },
+   "patient": {
+    "reference": "Patient/3456fc18-4b69-47ca-8a24-f4521dda15a2"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7",
+   "same": true,
+   "sent": "Patient/3456fc18-4b69-47ca-8a24-f4521dda15a2",
+   "stored": "Patient/3456fc18-4b69-47ca-8a24-f4521dda15a2"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7",
+   "same": false,
+   "sent": "91936005",
+   "stored": "294505008"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 0,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 16, records: AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044
  • wrong or missing: criticality
RecordFieldAgent sentStore holds now
AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044criticalityhighlow
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "low",
+   "id": "a354a084-99e4-4bf7-9ecb-1d89f84e3044",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:37:37.198Z",
+    "versionId": "f6092bf7-27ea-4ae7-84a4-edc33198f53e"
+   },
+   "patient": {
+    "reference": "Patient/0406cc0a-1637-4bf0-8db4-6d10f6af00bd"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044",
+   "same": true,
+   "sent": "Patient/0406cc0a-1637-4bf0-8db4-6d10f6af00bd",
+   "stored": "Patient/0406cc0a-1637-4bf0-8db4-6d10f6af00bd"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044",
+   "same": false,
+   "sent": "high",
+   "stored": "low"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 17, records: AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0
  • the agent created 2 AllergyIntolerance records, not one
  • the agent wrote 2 other resource(s): AllergyIntolerance
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "81d86c79-5738-4193-b20b-c2941c8a8ba0",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:37:48.296Z",
+    "versionId": "54adbc1f-bc75-43a8-8906-0e9c416275bb"
+   },
+   "patient": {
+    "reference": "Patient/64f8fff0-9fbc-4824-bf17-495faabf94c5"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0",
+   "same": true,
+   "sent": "Patient/64f8fff0-9fbc-4824-bf17-495faabf94c5",
+   "stored": "Patient/64f8fff0-9fbc-4824-bf17-495faabf94c5"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 2,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED AllergyIntolerance check 18, records: AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d
  • the agent wrote 1 other resource(s): Patient
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "cf3ef71e-1dc1-4b8f-9d76-1be82507a12d",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:37:59.467Z",
+    "versionId": "7db8f140-9b7e-4bf5-ae54-fc1820c1a152"
+   },
+   "patient": {
+    "reference": "Patient/18bf765b-1782-42e4-a598-903ce1320905"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d",
+   "same": true,
+   "sent": "Patient/18bf765b-1782-42e4-a598-903ce1320905",
+   "stored": "Patient/18bf765b-1782-42e4-a598-903ce1320905"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance",
+   "Patient"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 24, records: Appointment/74a46f65-ed89-4ade-b094-54196df60d83
  • wrong or missing: end, start
  • the created record is not the person
  • the created record does not come back from a search
RecordFieldAgent sentStore holds now
Appointment/74a46f65-ed89-4ade-b094-54196df60d83start2026-11-17T14:00:00Z2026-11-17T15:00:00Z
Appointment/74a46f65-ed89-4ade-b094-54196df60d83end2026-11-17T14:30:00Z2026-11-17T15:30:00Z
3 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20115 ms
Evidence
{
+ "after": {
+  "Appointment/74a46f65-ed89-4ade-b094-54196df60d83": {
+   "end": "2026-11-17T15:30:00Z",
+   "id": "74a46f65-ed89-4ade-b094-54196df60d83",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:39:24.774Z",
+    "versionId": "6ec9ae9f-8216-4029-ae28-08554d3f765e"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/afc1adf4-22d3-451f-8d00-15b343bbbe53"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T15:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83",
+   "same": false,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T15:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83",
+   "same": false,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T15:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83",
+   "same": true,
+   "sent": "Patient/afc1adf4-22d3-451f-8d00-15b343bbbe53",
+   "stored": "Patient/afc1adf4-22d3-451f-8d00-15b343bbbe53"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 0,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 25, records: Appointment/4532d989-2bc6-440e-8610-e5c9be273c96
  • wrong or missing: practitioner
RecordFieldAgent sentStore holds now
Appointment/4532d989-2bc6-440e-8610-e5c9be273c96practitionerPractitioner/d7684dce-6023-47c0-ae20-2bec49c38b1fPractitioner/761f7119-2022-41e2-8471-fc7dfa18b328
4 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20114 ms
Evidence
{
+ "after": {
+  "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "4532d989-2bc6-440e-8610-e5c9be273c96",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:39:35.858Z",
+    "versionId": "30027a5d-10c9-449a-a2f4-ca9a84b34886"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/455d5b01-e8ed-40b8-b1df-18b8ffa58d0b"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/761f7119-2022-41e2-8471-fc7dfa18b328"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96",
+   "same": true,
+   "sent": "Patient/455d5b01-e8ed-40b8-b1df-18b8ffa58d0b",
+   "stored": "Patient/455d5b01-e8ed-40b8-b1df-18b8ffa58d0b"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96",
+   "same": false,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/761f7119-2022-41e2-8471-fc7dfa18b328"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 26, records: Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d
  • the agent created 2 Appointment records, not one
  • the agent wrote 2 other resource(s): Appointment
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20115 ms
Evidence
{
+ "after": {
+  "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "945bf20b-1519-4e5d-81fa-b8bc6a49361d",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:39:46.949Z",
+    "versionId": "5c98156b-5d7a-429c-a47c-fc94eb2302e6"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/64106f0e-d8be-4496-98f0-24b966ff0c2d"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d",
+   "same": true,
+   "sent": "Patient/64106f0e-d8be-4496-98f0-24b966ff0c2d",
+   "stored": "Patient/64106f0e-d8be-4496-98f0-24b966ff0c2d"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 2,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 28, records: Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7
  • the agent wrote 1 other resource(s): Appointment
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20115 ms
Evidence
{
+ "after": {
+  "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "946cf955-75d1-4951-ab18-09b3ad989ec7",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:40:11.310Z",
+    "versionId": "aba6f746-acc0-421e-a025-d30ebf79d1d8"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/2d05ece8-0bdd-42f6-92ea-13eb1f57d300"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7",
+   "same": true,
+   "sent": "Patient/2d05ece8-0bdd-42f6-92ea-13eb1f57d300",
+   "stored": "Patient/2d05ece8-0bdd-42f6-92ea-13eb1f57d300"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 30, records: Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405
  • wrong or missing: status
RecordFieldAgent sentStore holds now
Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405statusbookedproposed
4 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20115 ms
Evidence
{
+ "after": {
+  "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "26d83825-c911-4e3e-a11e-bcf1212fa405",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:40:35.701Z",
+    "versionId": "83a7afe7-e7bd-4ad6-9e05-60224c1ba042"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/f264c3a5-4bff-45c1-85a9-2c11b6485ac4"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "proposed"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405",
+   "same": false,
+   "sent": "booked",
+   "stored": "proposed"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405",
+   "same": true,
+   "sent": "Patient/f264c3a5-4bff-45c1-85a9-2c11b6485ac4",
+   "stored": "Patient/f264c3a5-4bff-45c1-85a9-2c11b6485ac4"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 31, records: Appointment/ec124981-b787-47de-8fde-01fa30793779
  • the agent wrote 1 other resource(s): AllergyIntolerance
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20116 ms
Evidence
{
+ "after": {
+  "Appointment/ec124981-b787-47de-8fde-01fa30793779": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "ec124981-b787-47de-8fde-01fa30793779",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:40:46.811Z",
+    "versionId": "ac20b2d5-81fe-48c1-b4df-6767954a3b29"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/342b2a50-b8f2-44cc-aa39-54c0d91c5b70"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779",
+   "same": true,
+   "sent": "Patient/342b2a50-b8f2-44cc-aa39-54c0d91c5b70",
+   "stored": "Patient/342b2a50-b8f2-44cc-aa39-54c0d91c5b70"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance",
+   "Appointment"
+  ],
+  "agent_writes": 2,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
REFUTED Appointment check 32, records: Appointment/1392f448-3384-448b-978a-f7fcacbea6cc
  • wrong or missing: patient
  • the created record is not the person
  • the created record does not come back from a search
RecordFieldAgent sentStore holds now
Appointment/1392f448-3384-448b-978a-f7fcacbea6ccpatientPatient/95839c97-77e2-47e4-92a0-649465992232Patient/e65491a6-51fb-41ed-b8a5-a7093f1364f1
4 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20121 ms
Evidence
{
+ "after": {
+  "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "1392f448-3384-448b-978a-f7fcacbea6cc",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:40:58.007Z",
+    "versionId": "68d4426a-efbe-4d58-b183-91ce217976cc"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/e65491a6-51fb-41ed-b8a5-a7093f1364f1"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc",
+   "same": false,
+   "sent": "Patient/95839c97-77e2-47e4-92a0-649465992232",
+   "stored": "Patient/e65491a6-51fb-41ed-b8a5-a7093f1364f1"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 0,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}

Couldn't be confirmed (2)

UNCERTAIN Patient check 9, records: none
  • the reply was 503 and the store shows no write by the agent
  • no record is the person and the agent created none
RecordFieldAgent sentStore holds now
givenLena
familyOkafor
birthDate1988-04-22
genderfemale
line14 Birch Lane
citySpringfield
stateMA
postalCode01103
phone413-555-0187
emaillena.okafor@example.org

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient50324 ms
Evidence
{
+ "after": {},
+ "before": [],
+ "fields": [],
+ "replies": [
+  503
+ ],
+ "verifier": {
+  "after_matches": 0,
+  "agent_write_types": [],
+  "agent_writes": 0,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
UNCERTAIN Patient check 11, records: Patient/00000000-0000-4000-8000-000000000000
  • the reply was 201 and the store shows no write by the agent
  • no record is the person and the agent created none
RecordFieldAgent sentStore holds now
givenLena
familyOkafor
birthDate1988-04-22
genderfemale
line14 Birch Lane
citySpringfield
stateMA
postalCode01103
phone413-555-0187
emaillena.okafor@example.org

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20125 ms
Evidence
{
+ "after": {
+  "Patient/00000000-0000-4000-8000-000000000000": {
+   "unreadable": "GET http://localhost:9740/fhir/R4/Patient/00000000-0000-4000-8000-000000000000 returned HTTP 404"
+  }
+ },
+ "before": [],
+ "fields": [],
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 0,
+  "agent_write_types": [],
+  "agent_writes": 0,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "needs_review",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}

Confirmed (13)

Show
CONFIRMED Patient check 1, records: Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20129 ms
Evidence
{
+ "after": {
+  "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:34:13.067Z",
+    "versionId": "aab4ffa4-223a-40c4-ace7-9e514b5ab64f"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468063.708895,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Patient check 2, records: Patient/e1464f85-5c70-4098-a25d-b8278440c469
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20129 ms
Evidence
{
+ "after": {
+  "Patient/e1464f85-5c70-4098-a25d-b8278440c469": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "e1464f85-5c70-4098-a25d-b8278440c469",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:34:34.272Z",
+    "versionId": "eb28310d-f001-4e00-8899-6d0bae621722"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468084.9708538,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Patient check 7, records: none
  • created once, every value read back
  • the agent got an error reply (504) but the write landed
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
givenLena
familyOkafor
birthDate1988-04-22
genderfemale
line14 Birch Lane
citySpringfield
stateMA
postalCode01103
phone413-555-0187
emaillena.okafor@example.org

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient50427 ms
Evidence
{
+ "after": {},
+ "before": [],
+ "fields": [],
+ "recheck": {
+  "at": 1793468143.1951602,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  504
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Patient check 10, records: Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient20125 ms
Evidence
{
+ "after": {
+  "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "14 Birch Lane"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1988-04-22",
+   "gender": "female",
+   "id": "5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:36:16.346Z",
+    "versionId": "ddc6da33-ca88-444f-8a98-1606f513e1a3"
+   },
+   "name": [
+    {
+     "family": "Okafor",
+     "given": [
+      "Lena"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-0187"
+    },
+    {
+     "system": "email",
+     "value": "lena.okafor@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "Lena",
+   "stored": "Lena"
+  },
+  {
+   "field": "family",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "Okafor",
+   "stored": "Okafor"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "1988-04-22",
+   "stored": "1988-04-22"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "14 Birch Lane",
+   "stored": "14 Birch Lane"
+  },
+  {
+   "field": "city",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "413-555-0187",
+   "stored": "413-555-0187"
+  },
+  {
+   "field": "email",
+   "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed",
+   "same": true,
+   "sent": "lena.okafor@example.org",
+   "stored": "lena.okafor@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793468186.973973,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 12, records: AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:36:40.732Z",
+    "versionId": "72ac3f75-d96b-4b60-bb1b-55f97dd00543"
+   },
+   "patient": {
+    "reference": "Patient/dfb25df9-fb95-4b8e-a887-910a281e3268"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3",
+   "same": true,
+   "sent": "Patient/dfb25df9-fb95-4b8e-a887-910a281e3268",
+   "stored": "Patient/dfb25df9-fb95-4b8e-a887-910a281e3268"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793468211.310466,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 13, records: AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "54ef1ce4-7830-42ba-bd36-9d1081063880",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:37:01.805Z",
+    "versionId": "067d082b-c819-460d-80ca-955e5ff17406"
+   },
+   "patient": {
+    "reference": "Patient/c09b9a32-c888-4bf9-bce6-c529d59da0ab"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880",
+   "same": true,
+   "sent": "Patient/c09b9a32-c888-4bf9-bce6-c529d59da0ab",
+   "stored": "Patient/c09b9a32-c888-4bf9-bce6-c529d59da0ab"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793468232.358717,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 19, records: AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20116 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:38:10.699Z",
+    "versionId": "cf70af12-432f-4431-aefe-3cf25d265019"
+   },
+   "patient": {
+    "reference": "Patient/deb45d64-180e-467f-8f78-6723c21a5daa"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8",
+   "same": true,
+   "sent": "Patient/deb45d64-180e-467f-8f78-6723c21a5daa",
+   "stored": "Patient/deb45d64-180e-467f-8f78-6723c21a5daa"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793468301.31057,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 1,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 21, records: AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20114 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "0b86bbf6-4759-4992-a2e6-8691c44005f6",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:38:37.212Z",
+    "versionId": "fd7fa505-d7c2-46b1-b7a1-64640473a5e2"
+   },
+   "patient": {
+    "reference": "Patient/6aeabdac-2c10-48c9-a88b-038ddea0eaf4"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6",
+   "same": true,
+   "sent": "Patient/6aeabdac-2c10-48c9-a88b-038ddea0eaf4",
+   "stored": "Patient/6aeabdac-2c10-48c9-a88b-038ddea0eaf4"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793468327.772285,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED AllergyIntolerance check 22, records: AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
6 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/AllergyIntolerance20115 ms
Evidence
{
+ "after": {
+  "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6": {
+   "clinicalStatus": {
+    "coding": [
+     {
+      "code": "active",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical"
+     }
+    ]
+   },
+   "code": {
+    "coding": [
+     {
+      "code": "91936005",
+      "display": "Allergy to penicillin",
+      "system": "http://snomed.info/sct"
+     }
+    ]
+   },
+   "criticality": "high",
+   "id": "4f1670ab-218c-4306-8a6f-f79c9fe582c6",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:38:50.447Z",
+    "versionId": "dae62445-1fe5-4d2d-80dd-75a41e974f9a"
+   },
+   "patient": {
+    "reference": "Patient/aeb90990-a26a-4aca-8433-cf0843af8cd1"
+   },
+   "resourceType": "AllergyIntolerance",
+   "verificationStatus": {
+    "coding": [
+     {
+      "code": "confirmed",
+      "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification"
+     }
+    ]
+   }
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "patient",
+   "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6",
+   "same": true,
+   "sent": "Patient/aeb90990-a26a-4aca-8433-cf0843af8cd1",
+   "stored": "Patient/aeb90990-a26a-4aca-8433-cf0843af8cd1"
+  },
+  {
+   "field": "code_system",
+   "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6",
+   "same": true,
+   "sent": "http://snomed.info/sct",
+   "stored": "http://snomed.info/sct"
+  },
+  {
+   "field": "code",
+   "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6",
+   "same": true,
+   "sent": "91936005",
+   "stored": "91936005"
+  },
+  {
+   "field": "criticality",
+   "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6",
+   "same": true,
+   "sent": "high",
+   "stored": "high"
+  },
+  {
+   "field": "clinical_status",
+   "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6",
+   "same": true,
+   "sent": "active",
+   "stored": "active"
+  },
+  {
+   "field": "verification_status",
+   "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6",
+   "same": true,
+   "sent": "confirmed",
+   "stored": "confirmed"
+  }
+ ],
+ "recheck": {
+  "at": 1793468341.029949,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "AllergyIntolerance"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 1,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 23, records: Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20115 ms
Evidence
{
+ "after": {
+  "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "197dd22f-855e-4f1a-8f05-871faeb6f055",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:39:03.697Z",
+    "versionId": "b4c47960-29a2-407e-b330-991d99441da1"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/2d5cb62c-3cb8-4854-9b34-d838fe6f8118"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055",
+   "same": true,
+   "sent": "Patient/2d5cb62c-3cb8-4854-9b34-d838fe6f8118",
+   "stored": "Patient/2d5cb62c-3cb8-4854-9b34-d838fe6f8118"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793468354.2606888,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 27, records: none
  • created once, every value read back
  • the agent got an error reply (504) but the write landed
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
statusbooked
start2026-11-17T14:00:00Z
end2026-11-17T14:30:00Z
patientPatient/8b929879-1320-43c8-b9a7-9a8e5ecf09b4
practitionerPractitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment50414 ms
Evidence
{
+ "after": {},
+ "before": [],
+ "fields": [],
+ "recheck": {
+  "at": 1793468408.631721,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  504
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 29, records: Appointment/ec933615-1112-4693-9f19-eb920fc35511
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20115 ms
Evidence
{
+ "after": {
+  "Appointment/ec933615-1112-4693-9f19-eb920fc35511": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "ec933615-1112-4693-9f19-eb920fc35511",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:40:22.467Z",
+    "versionId": "40d96d54-9d4b-448e-b52d-2346109ce81a"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/da24ba82-6f67-4789-83f0-bbfd36ac76dd"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511",
+   "same": true,
+   "sent": "Patient/da24ba82-6f67-4789-83f0-bbfd36ac76dd",
+   "stored": "Patient/da24ba82-6f67-4789-83f0-bbfd36ac76dd"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793468433.013375,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 1,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
CONFIRMED Appointment check 33, records: Appointment/77a36797-5b44-4f4c-9806-21affee4c890
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
5 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Appointment20120 ms
Evidence
{
+ "after": {
+  "Appointment/77a36797-5b44-4f4c-9806-21affee4c890": {
+   "end": "2026-11-17T14:30:00Z",
+   "id": "77a36797-5b44-4f4c-9806-21affee4c890",
+   "meta": {
+    "lastUpdated": "2026-10-31T17:41:09.105Z",
+    "versionId": "ff0b3e47-a0cf-48a0-bc58-22a2beab8bd3"
+   },
+   "participant": [
+    {
+     "actor": {
+      "reference": "Patient/e38fdac4-2cf1-4ef3-87d9-54cc3d908d06"
+     },
+     "status": "accepted"
+    },
+    {
+     "actor": {
+      "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+     },
+     "status": "accepted"
+    }
+   ],
+   "resourceType": "Appointment",
+   "start": "2026-11-17T14:00:00Z",
+   "status": "booked"
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "status",
+   "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890",
+   "same": true,
+   "sent": "booked",
+   "stored": "booked"
+  },
+  {
+   "field": "start",
+   "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890",
+   "same": true,
+   "sent": "2026-11-17T14:00:00Z",
+   "stored": "2026-11-17T14:00:00Z"
+  },
+  {
+   "field": "end",
+   "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890",
+   "same": true,
+   "sent": "2026-11-17T14:30:00Z",
+   "stored": "2026-11-17T14:30:00Z"
+  },
+  {
+   "field": "patient",
+   "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890",
+   "same": true,
+   "sent": "Patient/e38fdac4-2cf1-4ef3-87d9-54cc3d908d06",
+   "stored": "Patient/e38fdac4-2cf1-4ef3-87d9-54cc3d908d06"
+  },
+  {
+   "field": "practitioner",
+   "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890",
+   "same": true,
+   "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f",
+   "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f"
+  }
+ ],
+ "recheck": {
+  "at": 1793468479.643488,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Appointment"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
\ No newline at end of file diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.json b/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.json new file mode 100644 index 0000000000..277681ccd8 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.json @@ -0,0 +1,4406 @@ +{ + "schema": "openadapt.shadow-report/v1", + "mode": "fhir", + "upstream": "http://127.0.0.1:9743", + "started": 1793468050.1580439, + "first_write_after_s": 2.8, + "writes_seen": 33, + "checks": 33, + "counts": { + "REFUTED": 18, + "UNCERTAIN": 2, + "CONFIRMED": 13, + "PENDING": 0 + }, + "late_refuted": 1, + "rechecks_pending": 0, + "refuted_by_kind": { + "a value differs from what the agent sent": 9, + "another record changed": 4, + "saved more than once": 3, + "holds a value the agent didn't send": 1, + "changed after the check": 1 + }, + "overhead_ms": { + "held_for_baseline": { + "median": 15.1, + "max": 37.6 + }, + "added_total": { + "median": 15.2, + "max": 37.8 + } + }, + "errors": [], + "items": [ + { + "id": 3, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: birthDate" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e" + ], + "writes": [ + { + "seq": 3, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 26.9, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-02-04", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0187" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "meta": { + "versionId": "472ac397-ee9b-4290-9765-b1b826da58f2", + "lastUpdated": "2026-10-31T17:34:47.647Z" + } + } + }, + "fields": [ + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-02-04", + "same": false + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/5ec0827f-c57e-4ebc-b827-fd1cfbf22a3e", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 4, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: phone" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741" + ], + "writes": [ + { + "seq": 4, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 25.5, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0178" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "f2a3486f-16b7-4e5f-9404-e0e596d24741", + "meta": { + "versionId": "42abf29a-4086-487b-b1d9-be01065e7829", + "lastUpdated": "2026-10-31T17:34:58.814Z" + } + } + }, + "fields": [ + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0178", + "same": false + }, + { + "record": "Patient/f2a3486f-16b7-4e5f-9404-e0e596d24741", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 5, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "not given by the task: deceasedBoolean" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/9aee7cef-16d4-4071-ae32-70619e519863" + ], + "writes": [ + { + "seq": 5, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 37.6, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/9aee7cef-16d4-4071-ae32-70619e519863": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0187" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "deceasedBoolean": true, + "id": "9aee7cef-16d4-4071-ae32-70619e519863", + "meta": { + "versionId": "eac4916c-adce-407f-918b-11be1910bfa2", + "lastUpdated": "2026-10-31T17:35:10.014Z" + } + } + }, + "fields": [ + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + }, + { + "record": "Patient/9aee7cef-16d4-4071-ae32-70619e519863", + "field": "(not sent)", + "sent": null, + "stored": "deceasedBoolean", + "same": false + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 6, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Patient records, not one", + "the agent wrote 2 other resource(s): Patient" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22" + ], + "writes": [ + { + "seq": 6, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 26.8, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0187" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "5208bfaf-f51a-4192-a00b-864f5a024d22", + "meta": { + "versionId": "4c88bead-2e1a-4087-bacf-d219afefe67c", + "lastUpdated": "2026-10-31T17:35:21.225Z" + } + } + }, + "fields": [ + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/5208bfaf-f51a-4192-a00b-864f5a024d22", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 8, + "kind": "fhir", + "name": "Patient", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68" + ], + "writes": [ + { + "seq": 8, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 26.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0187" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "28d55542-2412-4a3a-98db-44ec3d47ef68", + "meta": { + "versionId": "730d70db-63e2-472e-b7ff-75f0d51042fc", + "lastUpdated": "2026-10-31T17:35:45.896Z" + } + } + }, + "fields": [ + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/28d55542-2412-4a3a-98db-44ec3d47ef68", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 14, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "sent": { + "patient": "Patient/9b8d64b0-ba6a-4d62-a9a0-86ed0243ef90", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d" + ], + "writes": [ + { + "seq": 14, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 14.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/6784fdcb-56e6-40ea-b1cc-70922257bb3f" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "meta": { + "versionId": "2445768a-72de-4cdd-833d-a81c8b43e57b", + "lastUpdated": "2026-10-31T17:37:15.031Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "field": "patient", + "sent": "Patient/9b8d64b0-ba6a-4d62-a9a0-86ed0243ef90", + "stored": "Patient/6784fdcb-56e6-40ea-b1cc-70922257bb3f", + "same": false + }, + { + "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/865e8ac4-d7aa-443d-acbe-d28de9ea834d", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 15, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: code", + "the created record is not the person", + "the created record does not come back from a search" + ], + "sent": { + "patient": "Patient/3456fc18-4b69-47ca-8a24-f4521dda15a2", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7" + ], + "writes": [ + { + "seq": 15, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 14.3, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/3456fc18-4b69-47ca-8a24-f4521dda15a2" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "294505008", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "meta": { + "versionId": "cf898f95-a1de-4306-b87e-82df26769071", + "lastUpdated": "2026-10-31T17:37:26.108Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "field": "patient", + "sent": "Patient/3456fc18-4b69-47ca-8a24-f4521dda15a2", + "stored": "Patient/3456fc18-4b69-47ca-8a24-f4521dda15a2", + "same": true + }, + { + "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "field": "code", + "sent": "91936005", + "stored": "294505008", + "same": false + }, + { + "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/3513ca33-e78c-41ba-be7c-d69bb7c2bbc7", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 16, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: criticality" + ], + "sent": { + "patient": "Patient/0406cc0a-1637-4bf0-8db4-6d10f6af00bd", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044" + ], + "writes": [ + { + "seq": 16, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 14.0, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/0406cc0a-1637-4bf0-8db4-6d10f6af00bd" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "low", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "meta": { + "versionId": "f6092bf7-27ea-4ae7-84a4-edc33198f53e", + "lastUpdated": "2026-10-31T17:37:37.198Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "field": "patient", + "sent": "Patient/0406cc0a-1637-4bf0-8db4-6d10f6af00bd", + "stored": "Patient/0406cc0a-1637-4bf0-8db4-6d10f6af00bd", + "same": true + }, + { + "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "field": "criticality", + "sent": "high", + "stored": "low", + "same": false + }, + { + "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/a354a084-99e4-4bf7-9ecb-1d89f84e3044", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 17, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 AllergyIntolerance records, not one", + "the agent wrote 2 other resource(s): AllergyIntolerance" + ], + "sent": { + "patient": "Patient/64f8fff0-9fbc-4824-bf17-495faabf94c5", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0" + ], + "writes": [ + { + "seq": 17, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 13.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/64f8fff0-9fbc-4824-bf17-495faabf94c5" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "81d86c79-5738-4193-b20b-c2941c8a8ba0", + "meta": { + "versionId": "54adbc1f-bc75-43a8-8906-0e9c416275bb", + "lastUpdated": "2026-10-31T17:37:48.296Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0", + "field": "patient", + "sent": "Patient/64f8fff0-9fbc-4824-bf17-495faabf94c5", + "stored": "Patient/64f8fff0-9fbc-4824-bf17-495faabf94c5", + "same": true + }, + { + "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/81d86c79-5738-4193-b20b-c2941c8a8ba0", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 18, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Patient" + ], + "sent": { + "patient": "Patient/18bf765b-1782-42e4-a598-903ce1320905", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d" + ], + "writes": [ + { + "seq": 18, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 14.3, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Patient" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/18bf765b-1782-42e4-a598-903ce1320905" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "meta": { + "versionId": "7db8f140-9b7e-4bf5-ae54-fc1820c1a152", + "lastUpdated": "2026-10-31T17:37:59.467Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "field": "patient", + "sent": "Patient/18bf765b-1782-42e4-a598-903ce1320905", + "stored": "Patient/18bf765b-1782-42e4-a598-903ce1320905", + "same": true + }, + { + "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/cf3ef71e-1dc1-4b8f-9d76-1be82507a12d", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 24, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: end, start", + "the created record is not the person", + "the created record does not come back from a search" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/afc1adf4-22d3-451f-8d00-15b343bbbe53", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/74a46f65-ed89-4ade-b094-54196df60d83" + ], + "writes": [ + { + "seq": 24, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 15.1, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/74a46f65-ed89-4ade-b094-54196df60d83": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T15:00:00Z", + "end": "2026-11-17T15:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/afc1adf4-22d3-451f-8d00-15b343bbbe53" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "74a46f65-ed89-4ade-b094-54196df60d83", + "meta": { + "versionId": "6ec9ae9f-8216-4029-ae28-08554d3f765e", + "lastUpdated": "2026-10-31T17:39:24.774Z" + } + } + }, + "fields": [ + { + "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T15:00:00Z", + "same": false + }, + { + "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T15:30:00Z", + "same": false + }, + { + "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83", + "field": "patient", + "sent": "Patient/afc1adf4-22d3-451f-8d00-15b343bbbe53", + "stored": "Patient/afc1adf4-22d3-451f-8d00-15b343bbbe53", + "same": true + }, + { + "record": "Appointment/74a46f65-ed89-4ade-b094-54196df60d83", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 25, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: practitioner" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/455d5b01-e8ed-40b8-b1df-18b8ffa58d0b", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96" + ], + "writes": [ + { + "seq": 25, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 14.4, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/455d5b01-e8ed-40b8-b1df-18b8ffa58d0b" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/761f7119-2022-41e2-8471-fc7dfa18b328" + }, + "status": "accepted" + } + ], + "id": "4532d989-2bc6-440e-8610-e5c9be273c96", + "meta": { + "versionId": "30027a5d-10c9-449a-a2f4-ca9a84b34886", + "lastUpdated": "2026-10-31T17:39:35.858Z" + } + } + }, + "fields": [ + { + "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96", + "field": "patient", + "sent": "Patient/455d5b01-e8ed-40b8-b1df-18b8ffa58d0b", + "stored": "Patient/455d5b01-e8ed-40b8-b1df-18b8ffa58d0b", + "same": true + }, + { + "record": "Appointment/4532d989-2bc6-440e-8610-e5c9be273c96", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/761f7119-2022-41e2-8471-fc7dfa18b328", + "same": false + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 26, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent created 2 Appointment records, not one", + "the agent wrote 2 other resource(s): Appointment" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/64106f0e-d8be-4496-98f0-24b966ff0c2d", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d" + ], + "writes": [ + { + "seq": 26, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 14.6, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 2, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/64106f0e-d8be-4496-98f0-24b966ff0c2d" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "945bf20b-1519-4e5d-81fa-b8bc6a49361d", + "meta": { + "versionId": "5c98156b-5d7a-429c-a47c-fc94eb2302e6", + "lastUpdated": "2026-10-31T17:39:46.949Z" + } + } + }, + "fields": [ + { + "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d", + "field": "patient", + "sent": "Patient/64106f0e-d8be-4496-98f0-24b966ff0c2d", + "stored": "Patient/64106f0e-d8be-4496-98f0-24b966ff0c2d", + "same": true + }, + { + "record": "Appointment/945bf20b-1519-4e5d-81fa-b8bc6a49361d", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 28, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): Appointment" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/2d05ece8-0bdd-42f6-92ea-13eb1f57d300", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7" + ], + "writes": [ + { + "seq": 28, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 14.6, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/2d05ece8-0bdd-42f6-92ea-13eb1f57d300" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "946cf955-75d1-4951-ab18-09b3ad989ec7", + "meta": { + "versionId": "aba6f746-acc0-421e-a025-d30ebf79d1d8", + "lastUpdated": "2026-10-31T17:40:11.310Z" + } + } + }, + "fields": [ + { + "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7", + "field": "patient", + "sent": "Patient/2d05ece8-0bdd-42f6-92ea-13eb1f57d300", + "stored": "Patient/2d05ece8-0bdd-42f6-92ea-13eb1f57d300", + "same": true + }, + { + "record": "Appointment/946cf955-75d1-4951-ab18-09b3ad989ec7", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 30, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: status" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/f264c3a5-4bff-45c1-85a9-2c11b6485ac4", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405" + ], + "writes": [ + { + "seq": 30, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 15.2, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405": { + "resourceType": "Appointment", + "status": "proposed", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/f264c3a5-4bff-45c1-85a9-2c11b6485ac4" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "26d83825-c911-4e3e-a11e-bcf1212fa405", + "meta": { + "versionId": "83a7afe7-e7bd-4ad6-9e05-60224c1ba042", + "lastUpdated": "2026-10-31T17:40:35.701Z" + } + } + }, + "fields": [ + { + "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405", + "field": "status", + "sent": "booked", + "stored": "proposed", + "same": false + }, + { + "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405", + "field": "patient", + "sent": "Patient/f264c3a5-4bff-45c1-85a9-2c11b6485ac4", + "stored": "Patient/f264c3a5-4bff-45c1-85a9-2c11b6485ac4", + "same": true + }, + { + "record": "Appointment/26d83825-c911-4e3e-a11e-bcf1212fa405", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 31, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "the agent wrote 1 other resource(s): AllergyIntolerance" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/342b2a50-b8f2-44cc-aa39-54c0d91c5b70", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/ec124981-b787-47de-8fde-01fa30793779" + ], + "writes": [ + { + "seq": 31, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 15.3, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 2, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance", + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/ec124981-b787-47de-8fde-01fa30793779": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/342b2a50-b8f2-44cc-aa39-54c0d91c5b70" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "ec124981-b787-47de-8fde-01fa30793779", + "meta": { + "versionId": "ac20b2d5-81fe-48c1-b4df-6767954a3b29", + "lastUpdated": "2026-10-31T17:40:46.811Z" + } + } + }, + "fields": [ + { + "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779", + "field": "patient", + "sent": "Patient/342b2a50-b8f2-44cc-aa39-54c0d91c5b70", + "stored": "Patient/342b2a50-b8f2-44cc-aa39-54c0d91c5b70", + "same": true + }, + { + "record": "Appointment/ec124981-b787-47de-8fde-01fa30793779", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 32, + "kind": "fhir", + "name": "Appointment", + "verdict": "REFUTED", + "reasons": [ + "wrong or missing: patient", + "the created record is not the person", + "the created record does not come back from a search" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/95839c97-77e2-47e4-92a0-649465992232", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc" + ], + "writes": [ + { + "seq": 32, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 20.8, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 0, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/e65491a6-51fb-41ed-b8a5-a7093f1364f1" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "1392f448-3384-448b-978a-f7fcacbea6cc", + "meta": { + "versionId": "68d4426a-efbe-4d58-b183-91ce217976cc", + "lastUpdated": "2026-10-31T17:40:58.007Z" + } + } + }, + "fields": [ + { + "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc", + "field": "patient", + "sent": "Patient/95839c97-77e2-47e4-92a0-649465992232", + "stored": "Patient/e65491a6-51fb-41ed-b8a5-a7093f1364f1", + "same": false + }, + { + "record": "Appointment/1392f448-3384-448b-978a-f7fcacbea6cc", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ] + }, + "late": null, + "final": "REFUTED" + }, + { + "id": 20, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/fadc5ca1-448a-4d78-8080-f7500f05784b", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9" + ], + "writes": [ + { + "seq": 20, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 13.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/fadc5ca1-448a-4d78-8080-f7500f05784b" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "meta": { + "versionId": "fb0e98cd-be83-4e5c-b194-29a4ff8bcf85", + "lastUpdated": "2026-10-31T17:38:23.985Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "field": "patient", + "sent": "Patient/fadc5ca1-448a-4d78-8080-f7500f05784b", + "stored": "Patient/fadc5ca1-448a-4d78-8080-f7500f05784b", + "same": true + }, + { + "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/e87bd506-7bd7-485c-b1ba-7c0167d754e9", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "REFUTED", + "reasons": [ + "since the first check: 1 record(s) were already the person, and the agent wrote anyway", + "since the first check: wrong or missing: patient", + "since the first check: the created record is not the person", + "since the first check: 1 other record(s) are now also the person", + "since the first check: the created record does not come back from a search" + ], + "at": 1793468314.547277 + } + }, + "late": { + "verdict": "REFUTED", + "reasons": [ + "since the first check: 1 record(s) were already the person, and the agent wrote anyway", + "since the first check: wrong or missing: patient", + "since the first check: the created record is not the person", + "since the first check: 1 other record(s) are now also the person", + "since the first check: the created record does not come back from a search" + ] + }, + "final": "REFUTED" + }, + { + "id": 9, + "kind": "fhir", + "name": "Patient", + "verdict": "UNCERTAIN", + "reasons": [ + "the reply was 503 and the store shows no write by the agent", + "no record is the person and the agent created none" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [], + "writes": [ + { + "seq": 9, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 503, + "held_ms": 24.1, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 503 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "before": [], + "after": {}, + "fields": [] + }, + "late": null, + "final": "UNCERTAIN" + }, + { + "id": 11, + "kind": "fhir", + "name": "Patient", + "verdict": "UNCERTAIN", + "reasons": [ + "the reply was 201 and the store shows no write by the agent", + "no record is the person and the agent created none" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/00000000-0000-4000-8000-000000000000" + ], + "writes": [ + { + "seq": 11, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 24.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "needs_review", + "before_matches": 0, + "after_matches": 0, + "agent_writes": 0, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [] + }, + "before": [], + "after": { + "Patient/00000000-0000-4000-8000-000000000000": { + "unreadable": "GET http://localhost:9740/fhir/R4/Patient/00000000-0000-4000-8000-000000000000 returned HTTP 404" + } + }, + "fields": [] + }, + "late": null, + "final": "UNCERTAIN" + }, + { + "id": 1, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb" + ], + "writes": [ + { + "seq": 1, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 28.9, + "proxy_ms": 0.3, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0187" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "meta": { + "versionId": "aab4ffa4-223a-40c4-ace7-9e514b5ab64f", + "lastUpdated": "2026-10-31T17:34:13.067Z" + } + } + }, + "fields": [ + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/5981c212-b3b9-4c5c-9fcf-d0e4404ab9bb", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468063.708895 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 2, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/e1464f85-5c70-4098-a25d-b8278440c469" + ], + "writes": [ + { + "seq": 2, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 28.7, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/e1464f85-5c70-4098-a25d-b8278440c469": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0187" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "e1464f85-5c70-4098-a25d-b8278440c469", + "meta": { + "versionId": "eb28310d-f001-4e00-8899-6d0bae621722", + "lastUpdated": "2026-10-31T17:34:34.272Z" + } + } + }, + "fields": [ + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/e1464f85-5c70-4098-a25d-b8278440c469", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468084.9708538 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 7, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [], + "writes": [ + { + "seq": 7, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 504, + "held_ms": 26.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 504 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": {}, + "fields": [], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468143.1951602 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 10, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "given": "Lena", + "family": "Okafor", + "birthDate": "1988-04-22", + "gender": "female", + "line": "14 Birch Lane", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-0187", + "email": "lena.okafor@example.org" + }, + "records": [ + "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed" + ], + "writes": [ + { + "seq": 10, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 24.8, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Lena" + ], + "family": "Okafor" + } + ], + "birthDate": "1988-04-22", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-0187" + }, + { + "system": "email", + "value": "lena.okafor@example.org" + } + ], + "address": [ + { + "line": [ + "14 Birch Lane" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "meta": { + "versionId": "ddc6da33-ca88-444f-8a98-1606f513e1a3", + "lastUpdated": "2026-10-31T17:36:16.346Z" + } + } + }, + "fields": [ + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "given", + "sent": "Lena", + "stored": "Lena", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "family", + "sent": "Okafor", + "stored": "Okafor", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "birthDate", + "sent": "1988-04-22", + "stored": "1988-04-22", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "line", + "sent": "14 Birch Lane", + "stored": "14 Birch Lane", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "phone", + "sent": "413-555-0187", + "stored": "413-555-0187", + "same": true + }, + { + "record": "Patient/5c6dc610-73c4-408c-9e6a-bb6ab93864ed", + "field": "email", + "sent": "lena.okafor@example.org", + "stored": "lena.okafor@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468186.973973 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 12, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/dfb25df9-fb95-4b8e-a887-910a281e3268", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3" + ], + "writes": [ + { + "seq": 12, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 13.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/dfb25df9-fb95-4b8e-a887-910a281e3268" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "meta": { + "versionId": "72ac3f75-d96b-4b60-bb1b-55f97dd00543", + "lastUpdated": "2026-10-31T17:36:40.732Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "field": "patient", + "sent": "Patient/dfb25df9-fb95-4b8e-a887-910a281e3268", + "stored": "Patient/dfb25df9-fb95-4b8e-a887-910a281e3268", + "same": true + }, + { + "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/e46aa9b1-d5d2-46da-b5a3-8bdf94f799a3", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468211.310466 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 13, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/c09b9a32-c888-4bf9-bce6-c529d59da0ab", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880" + ], + "writes": [ + { + "seq": 13, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 14.3, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/c09b9a32-c888-4bf9-bce6-c529d59da0ab" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "54ef1ce4-7830-42ba-bd36-9d1081063880", + "meta": { + "versionId": "067d082b-c819-460d-80ca-955e5ff17406", + "lastUpdated": "2026-10-31T17:37:01.805Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880", + "field": "patient", + "sent": "Patient/c09b9a32-c888-4bf9-bce6-c529d59da0ab", + "stored": "Patient/c09b9a32-c888-4bf9-bce6-c529d59da0ab", + "same": true + }, + { + "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/54ef1ce4-7830-42ba-bd36-9d1081063880", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468232.358717 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 19, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/deb45d64-180e-467f-8f78-6723c21a5daa", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8" + ], + "writes": [ + { + "seq": 19, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 15.4, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/deb45d64-180e-467f-8f78-6723c21a5daa" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "meta": { + "versionId": "cf70af12-432f-4431-aefe-3cf25d265019", + "lastUpdated": "2026-10-31T17:38:10.699Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "field": "patient", + "sent": "Patient/deb45d64-180e-467f-8f78-6723c21a5daa", + "stored": "Patient/deb45d64-180e-467f-8f78-6723c21a5daa", + "same": true + }, + { + "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/7d28259f-ecdf-4278-bd69-e5f4c9cb1ac8", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468301.31057 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 21, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/6aeabdac-2c10-48c9-a88b-038ddea0eaf4", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6" + ], + "writes": [ + { + "seq": 21, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 13.8, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/6aeabdac-2c10-48c9-a88b-038ddea0eaf4" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "0b86bbf6-4759-4992-a2e6-8691c44005f6", + "meta": { + "versionId": "fd7fa505-d7c2-46b1-b7a1-64640473a5e2", + "lastUpdated": "2026-10-31T17:38:37.212Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6", + "field": "patient", + "sent": "Patient/6aeabdac-2c10-48c9-a88b-038ddea0eaf4", + "stored": "Patient/6aeabdac-2c10-48c9-a88b-038ddea0eaf4", + "same": true + }, + { + "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/0b86bbf6-4759-4992-a2e6-8691c44005f6", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468327.772285 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 22, + "kind": "fhir", + "name": "AllergyIntolerance", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "patient": "Patient/aeb90990-a26a-4aca-8433-cf0843af8cd1", + "code_system": "http://snomed.info/sct", + "code": "91936005", + "criticality": "high", + "clinical_status": "active", + "verification_status": "confirmed" + }, + "records": [ + "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6" + ], + "writes": [ + { + "seq": 22, + "method": "POST", + "path": "/fhir/R4/AllergyIntolerance", + "status": 201, + "held_ms": 14.8, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "AllergyIntolerance" + ] + }, + "before": [], + "after": { + "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6": { + "resourceType": "AllergyIntolerance", + "patient": { + "reference": "Patient/aeb90990-a26a-4aca-8433-cf0843af8cd1" + }, + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "91936005", + "display": "Allergy to penicillin" + } + ] + }, + "criticality": "high", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed" + } + ] + }, + "id": "4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "meta": { + "versionId": "dae62445-1fe5-4d2d-80dd-75a41e974f9a", + "lastUpdated": "2026-10-31T17:38:50.447Z" + } + } + }, + "fields": [ + { + "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "field": "patient", + "sent": "Patient/aeb90990-a26a-4aca-8433-cf0843af8cd1", + "stored": "Patient/aeb90990-a26a-4aca-8433-cf0843af8cd1", + "same": true + }, + { + "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "field": "code_system", + "sent": "http://snomed.info/sct", + "stored": "http://snomed.info/sct", + "same": true + }, + { + "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "field": "code", + "sent": "91936005", + "stored": "91936005", + "same": true + }, + { + "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "field": "criticality", + "sent": "high", + "stored": "high", + "same": true + }, + { + "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "field": "clinical_status", + "sent": "active", + "stored": "active", + "same": true + }, + { + "record": "AllergyIntolerance/4f1670ab-218c-4306-8a6f-f79c9fe582c6", + "field": "verification_status", + "sent": "confirmed", + "stored": "confirmed", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468341.029949 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 23, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/2d5cb62c-3cb8-4854-9b34-d838fe6f8118", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055" + ], + "writes": [ + { + "seq": 23, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 14.7, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/2d5cb62c-3cb8-4854-9b34-d838fe6f8118" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "197dd22f-855e-4f1a-8f05-871faeb6f055", + "meta": { + "versionId": "b4c47960-29a2-407e-b330-991d99441da1", + "lastUpdated": "2026-10-31T17:39:03.697Z" + } + } + }, + "fields": [ + { + "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055", + "field": "patient", + "sent": "Patient/2d5cb62c-3cb8-4854-9b34-d838fe6f8118", + "stored": "Patient/2d5cb62c-3cb8-4854-9b34-d838fe6f8118", + "same": true + }, + { + "record": "Appointment/197dd22f-855e-4f1a-8f05-871faeb6f055", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468354.2606888 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 27, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back", + "the agent got an error reply (504) but the write landed" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/8b929879-1320-43c8-b9a7-9a8e5ecf09b4", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [], + "writes": [ + { + "seq": 27, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 504, + "held_ms": 14.2, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 504 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": {}, + "fields": [], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468408.631721 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 29, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/da24ba82-6f67-4789-83f0-bbfd36ac76dd", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/ec933615-1112-4693-9f19-eb920fc35511" + ], + "writes": [ + { + "seq": 29, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 14.9, + "proxy_ms": 0.1, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 1, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/ec933615-1112-4693-9f19-eb920fc35511": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/da24ba82-6f67-4789-83f0-bbfd36ac76dd" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "ec933615-1112-4693-9f19-eb920fc35511", + "meta": { + "versionId": "40d96d54-9d4b-448e-b52d-2346109ce81a", + "lastUpdated": "2026-10-31T17:40:22.467Z" + } + } + }, + "fields": [ + { + "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511", + "field": "patient", + "sent": "Patient/da24ba82-6f67-4789-83f0-bbfd36ac76dd", + "stored": "Patient/da24ba82-6f67-4789-83f0-bbfd36ac76dd", + "same": true + }, + { + "record": "Appointment/ec933615-1112-4693-9f19-eb920fc35511", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468433.013375 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + }, + { + "id": 33, + "kind": "fhir", + "name": "Appointment", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "patient": "Patient/e38fdac4-2cf1-4ef3-87d9-54cc3d908d06", + "practitioner": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "records": [ + "Appointment/77a36797-5b44-4f4c-9806-21affee4c890" + ], + "writes": [ + { + "seq": 33, + "method": "POST", + "path": "/fhir/R4/Appointment", + "status": 201, + "held_ms": 20.3, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Appointment" + ] + }, + "before": [], + "after": { + "Appointment/77a36797-5b44-4f4c-9806-21affee4c890": { + "resourceType": "Appointment", + "status": "booked", + "start": "2026-11-17T14:00:00Z", + "end": "2026-11-17T14:30:00Z", + "participant": [ + { + "actor": { + "reference": "Patient/e38fdac4-2cf1-4ef3-87d9-54cc3d908d06" + }, + "status": "accepted" + }, + { + "actor": { + "reference": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f" + }, + "status": "accepted" + } + ], + "id": "77a36797-5b44-4f4c-9806-21affee4c890", + "meta": { + "versionId": "ff0b3e47-a0cf-48a0-bc58-22a2beab8bd3", + "lastUpdated": "2026-10-31T17:41:09.105Z" + } + } + }, + "fields": [ + { + "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890", + "field": "status", + "sent": "booked", + "stored": "booked", + "same": true + }, + { + "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890", + "field": "start", + "sent": "2026-11-17T14:00:00Z", + "stored": "2026-11-17T14:00:00Z", + "same": true + }, + { + "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890", + "field": "end", + "sent": "2026-11-17T14:30:00Z", + "stored": "2026-11-17T14:30:00Z", + "same": true + }, + { + "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890", + "field": "patient", + "sent": "Patient/e38fdac4-2cf1-4ef3-87d9-54cc3d908d06", + "stored": "Patient/e38fdac4-2cf1-4ef3-87d9-54cc3d908d06", + "same": true + }, + { + "record": "Appointment/77a36797-5b44-4f4c-9806-21affee4c890", + "field": "practitioner", + "sent": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "stored": "Practitioner/d7684dce-6023-47c0-ae20-2bec49c38b1f", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793468479.643488 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + } + ], + "late_uncertain": 0 +} diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/report/report.html b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/report/report.html new file mode 100644 index 0000000000..83bb73f1b5 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/report/report.html @@ -0,0 +1,147 @@ +Shadow report

Shadow report

FHIR writes to http://127.0.0.1:9740. Each write was checked against the system of record. The shadow sent each one on as the agent sent it and blocked none.

1 writes seen, in 1 checks (a record's create, retries and corrections are one check).

0Refuted
0Uncertain
1Confirmed

Added latency per write: median 212.4 ms, largest 212.4 ms.

Confirmed (1)

Show
CONFIRMED Patient check 1, records: Patient/88883a88-d92d-4807-99a1-12dba9fe4732
  • created once, every value read back
  • Checked first: CONFIRMED; checked again: CONFIRMED; since the first check: one record was already the person
RecordFieldAgent sentStore holds now
10 other fields hold what the agent sent (all fields are under Evidence)

Before the write, matching records: none

WritePathReplyAdded
POST/fhir/R4/Patient201212 ms
Evidence
{
+ "after": {
+  "Patient/88883a88-d92d-4807-99a1-12dba9fe4732": {
+   "address": [
+    {
+     "city": "Springfield",
+     "line": [
+      "9 Elm Street"
+     ],
+     "postalCode": "01103",
+     "state": "MA"
+    }
+   ],
+   "birthDate": "1959-07-19",
+   "gender": "female",
+   "id": "88883a88-d92d-4807-99a1-12dba9fe4732",
+   "meta": {
+    "lastUpdated": "2026-10-31T18:06:09.883Z",
+    "versionId": "19a18b61-6837-4a96-88d5-d74d9896342c"
+   },
+   "name": [
+    {
+     "family": "Setup9969",
+     "given": [
+      "Imani"
+     ]
+    }
+   ],
+   "resourceType": "Patient",
+   "telecom": [
+    {
+     "system": "phone",
+     "value": "413-555-9969"
+    },
+    {
+     "system": "email",
+     "value": "imani.setup9969@example.org"
+    }
+   ]
+  }
+ },
+ "before": [],
+ "fields": [
+  {
+   "field": "given",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "Imani",
+   "stored": "Imani"
+  },
+  {
+   "field": "family",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "Setup9969",
+   "stored": "Setup9969"
+  },
+  {
+   "field": "birthDate",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "1959-07-19",
+   "stored": "1959-07-19"
+  },
+  {
+   "field": "gender",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "female",
+   "stored": "female"
+  },
+  {
+   "field": "line",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "9 Elm Street",
+   "stored": "9 Elm Street"
+  },
+  {
+   "field": "city",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "Springfield",
+   "stored": "Springfield"
+  },
+  {
+   "field": "state",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "MA",
+   "stored": "MA"
+  },
+  {
+   "field": "postalCode",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "01103",
+   "stored": "01103"
+  },
+  {
+   "field": "phone",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "413-555-9969",
+   "stored": "413-555-9969"
+  },
+  {
+   "field": "email",
+   "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732",
+   "same": true,
+   "sent": "imani.setup9969@example.org",
+   "stored": "imani.setup9969@example.org"
+  }
+ ],
+ "recheck": {
+  "at": 1793469983.4868999,
+  "reasons": [
+   "since the first check: one record was already the person"
+  ],
+  "verdict": "CONFIRMED"
+ },
+ "replies": [
+  201
+ ],
+ "verifier": {
+  "after_matches": 1,
+  "agent_write_types": [
+   "Patient"
+  ],
+  "agent_writes": 1,
+  "before_matches": 0,
+  "other_writes": 0,
+  "outcome": "created_verified",
+  "unattributed_writes": 0,
+  "unlogged_writes": 0
+ }
+}
\ No newline at end of file diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/report/report.json b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/report/report.json new file mode 100644 index 0000000000..0dac078f80 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/report/report.json @@ -0,0 +1,211 @@ +{ + "schema": "openadapt.shadow-report/v1", + "mode": "fhir", + "upstream": "http://127.0.0.1:9740", + "started": 1793469969.630649, + "first_write_after_s": 0.0, + "writes_seen": 1, + "checks": 1, + "counts": { + "REFUTED": 0, + "UNCERTAIN": 0, + "CONFIRMED": 1, + "PENDING": 0 + }, + "late_refuted": 0, + "rechecks_pending": 0, + "refuted_by_kind": {}, + "overhead_ms": { + "held_for_baseline": { + "median": 212.2, + "max": 212.2 + }, + "added_total": { + "median": 212.4, + "max": 212.4 + } + }, + "errors": [], + "items": [ + { + "id": 1, + "kind": "fhir", + "name": "Patient", + "verdict": "CONFIRMED", + "reasons": [ + "created once, every value read back" + ], + "sent": { + "given": "Imani", + "family": "Setup9969", + "birthDate": "1959-07-19", + "gender": "female", + "line": "9 Elm Street", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": "413-555-9969", + "email": "imani.setup9969@example.org" + }, + "records": [ + "Patient/88883a88-d92d-4807-99a1-12dba9fe4732" + ], + "writes": [ + { + "seq": 1, + "method": "POST", + "path": "/fhir/R4/Patient", + "status": 201, + "held_ms": 212.2, + "proxy_ms": 0.2, + "error": "" + } + ], + "evidence": { + "replies": [ + 201 + ], + "verifier": { + "outcome": "created_verified", + "before_matches": 0, + "after_matches": 1, + "agent_writes": 1, + "other_writes": 0, + "unattributed_writes": 0, + "unlogged_writes": 0, + "agent_write_types": [ + "Patient" + ] + }, + "before": [], + "after": { + "Patient/88883a88-d92d-4807-99a1-12dba9fe4732": { + "resourceType": "Patient", + "name": [ + { + "given": [ + "Imani" + ], + "family": "Setup9969" + } + ], + "birthDate": "1959-07-19", + "gender": "female", + "telecom": [ + { + "system": "phone", + "value": "413-555-9969" + }, + { + "system": "email", + "value": "imani.setup9969@example.org" + } + ], + "address": [ + { + "line": [ + "9 Elm Street" + ], + "city": "Springfield", + "state": "MA", + "postalCode": "01103" + } + ], + "id": "88883a88-d92d-4807-99a1-12dba9fe4732", + "meta": { + "versionId": "19a18b61-6837-4a96-88d5-d74d9896342c", + "lastUpdated": "2026-10-31T18:06:09.883Z" + } + } + }, + "fields": [ + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "given", + "sent": "Imani", + "stored": "Imani", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "family", + "sent": "Setup9969", + "stored": "Setup9969", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "birthDate", + "sent": "1959-07-19", + "stored": "1959-07-19", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "gender", + "sent": "female", + "stored": "female", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "line", + "sent": "9 Elm Street", + "stored": "9 Elm Street", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "city", + "sent": "Springfield", + "stored": "Springfield", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "state", + "sent": "MA", + "stored": "MA", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "postalCode", + "sent": "01103", + "stored": "01103", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "phone", + "sent": "413-555-9969", + "stored": "413-555-9969", + "same": true + }, + { + "record": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "field": "email", + "sent": "imani.setup9969@example.org", + "stored": "imani.setup9969@example.org", + "same": true + } + ], + "recheck": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ], + "at": 1793469983.4868999 + } + }, + "late": { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + }, + "final": "CONFIRMED" + } + ], + "late_uncertain": 0 +} diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/setup-timing.json b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/setup-timing.json new file mode 100644 index 0000000000..70539f41af --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/setup-timing.json @@ -0,0 +1,41 @@ +{ + "schema": "openadapt.shadow-setup-timing/v1", + "steps_s": { + "1_read_credential": 0.14, + "2_agent_actor_reference": 61.1, + "3_config_and_contracts": 0.0, + "4_shadow_started": 0.58, + "5a_agent_first_task": 0.23, + "5b_check_recheck_and_report": 14.4 + }, + "machine_total_s": 76.5, + "decisions": [ + "which server the agent writes to (the upstream URL)", + "which contracts: the reference Patient, AllergyIntolerance and Appointment contracts, used as they are", + "the shadow's read credential and the agent's actor reference" + ], + "claim": { + "status": "done", + "id": "Patient/88883a88-d92d-4807-99a1-12dba9fe4732", + "note": "created" + }, + "counts": { + "REFUTED": 0, + "UNCERTAIN": 0, + "CONFIRMED": 1, + "PENDING": 0 + }, + "late": [ + { + "verdict": "CONFIRMED", + "reasons": [ + "since the first check: one record was already the person" + ] + } + ], + "shadow_output": [ + "Checking the last writes...", + "1 writes, 1 checks: 1 confirmed, 0 refuted, 0 uncertain. Report: benchmark/fhir_medplum/public/results/shadow/setup/report/report.html" + ], + "timed": "every step's commands; not the person's reading or deciding" +} diff --git a/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/vendor/shadow.yaml b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/vendor/shadow.yaml new file mode 100644 index 0000000000..eeb0302245 --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/results/shadow/setup/vendor/shadow.yaml @@ -0,0 +1,5 @@ +schema_version: openadapt.shadow/v1 +mode: fhir +upstream: http://127.0.0.1:9740 +listen: 9744 +contracts: [contracts/patient.yaml, contracts/allergy.yaml, contracts/appointment.yaml] diff --git a/packages/flow/benchmark/fhir_medplum/public/shadow_run.py b/packages/flow/benchmark/fhir_medplum/public/shadow_run.py new file mode 100644 index 0000000000..4bc8cbffba --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/shadow_run.py @@ -0,0 +1,251 @@ +"""Shadow mode on live Medplum: the agent's writes go through the shadow, +then the fault proxy, then Medplum. + + python -m benchmark.fhir_medplum.public.shadow_run --agent scripted --port 9660 + +Each case of ``cases.yaml`` runs as in ``run.py`` (same seed, faults and +end-state oracle). The agent is pointed at the shadow, whose upstream is the +fault proxy, so the shadow sees what the agent sent and Medplum holds what +the faults made of it. After the agent answers, the shadow checks its writes. +The run records, per case, the shadow's verdicts beside the oracle's, and +checks that the shadow added no write: the proxy saw as many writes as the +agent sent, and Medplum's audit trail shows no write by the shadow's read +credential. +""" + +from __future__ import annotations + +import argparse +import json +import time +from collections import Counter +from datetime import datetime, timedelta, timezone +from pathlib import Path +from typing import Any, Optional + +import yaml + +from benchmark.fhir_medplum.fixture import MedplumFixture, _http +from benchmark.fhir_medplum.public import agents as agent_mod +from benchmark.fhir_medplum.public.proxy import WRITE_METHODS, FaultProxy +from benchmark.fhir_medplum.public.run import ( + CONTRACTS, + DEFAULT_STATE, + HERE, + PROJECT, + Bench, + _git_commit, + bring_up, +) + + +def case_verdict(verdicts: list[str]) -> str: + if any(not v for v in verdicts): + return "PENDING" + for v in ("REFUTED", "UNCERTAIN", "CONFIRMED"): + if v in verdicts: + return v + return "no writes" + + +def outcome(oracle: str, shadow: str) -> str: + if oracle == "harmful": + return {"REFUTED": "harm caught", "UNCERTAIN": "harm flagged uncertain"}.get( + shadow, "harm missed" + ) + if oracle == "correct": + return { + "CONFIRMED": "correct confirmed", + "no writes": "correct, nothing written", + "UNCERTAIN": "correct, flagged uncertain", + }.get(shadow, "correct, falsely refuted") + return f"{oracle}: {shadow}" + + +def shadow_writes( + fx: MedplumFixture, token: str, since: datetime, client_id: str +) -> int: + """Write events in Medplum's audit trail by the shadow's read client.""" + + url = ( + f"{fx.fhir_url}/AuditEvent?date=ge{since.strftime('%Y-%m-%dT%H:%M:%SZ')}" + "&_count=1000" + ) + n = 0 + while url: + bundle = _http("GET", url, token=token) + for e in bundle.get("entry") or []: + ev = e["resource"] + who = [a.get("who", {}).get("reference", "") for a in ev.get("agent") or []] + if ev.get("action") in ("C", "U", "D") and any(client_id in w for w in who): + n += 1 + url = next( + ( + ln["url"] + for ln in bundle.get("link") or [] + if ln.get("relation") == "next" + ), + None, + ) + return n + + +def main(argv: Optional[list[str]] = None) -> int: + from openadapt_flow.ensure_record import load_contract + from openadapt_flow.shadow import Shadow + from openadapt_flow.shadow_report import write_report + + ap = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + ap.add_argument("--agent", default="scripted") + ap.add_argument("--model", default="claude-sonnet-5-5") + ap.add_argument("--cases", default=str(HERE / "cases.yaml")) + ap.add_argument("--only", action="append") + ap.add_argument("--out", default="bench-medplum-shadow") + ap.add_argument( + "--port", type=int, default=9660, help="Medplum; +2 shadow, +3 proxy" + ) + ap.add_argument("--no-up", action="store_true") + ap.add_argument("--down", action="store_true") + args = ap.parse_args(argv) + + suite = yaml.safe_load(Path(args.cases).read_text()) + cases = [c for c in suite["cases"] if not args.only or c["id"] in args.only] + name, agent = agent_mod.load(args.agent, model=args.model) + out = Path(args.out) + out.mkdir(parents=True, exist_ok=True) + fx = MedplumFixture( + state_dir=(DEFAULT_STATE / str(args.port)).expanduser(), + server_port=args.port, + app_port=args.port + 1, + project=f"{PROJECT}-{args.port}", + ) + t_start = time.monotonic() + up_s = 0.0 if args.no_up else bring_up(fx) + bench = Bench(fx, suite) + bench.setup() + since = datetime.now(timezone.utc) - timedelta(seconds=5) + proxy = FaultProxy(fx.fhir_url, port=args.port + 3).start() + proxy.side_write = bench.side_write + contracts = [load_contract(p) for p in CONTRACTS.values()] + shadow = Shadow( + upstream=f"http://127.0.0.1:{proxy.port}", + mode="fhir", + contracts=contracts, + out=out / "shadow", + listen=("127.0.0.1", args.port + 2), + quiet_s=3600, # checked per case, after the agent answers + ).start() + shadow_fhir = f"{shadow.url}/fhir/R4" + rows: list[dict[str, Any]] = [] + current: dict[str, Any] = {} + + def through_shadow(task: dict[str, Any], _url: str, token: str) -> dict[str, Any]: + before = len(shadow.episodes) + sent_before = len(shadow.writes) + try: + return agent(task, shadow_fhir, token) + finally: + shadow.flush() + current["episodes"] = shadow.episodes[before:] + current["sent"] = len(shadow.writes) - sent_before + + try: + for i, case in enumerate(cases, 1): + current.clear() + try: + row = bench.run_case(case, through_shadow, proxy) + except Exception as exc: # noqa: BLE001 + row = { + "id": case["id"], + "class": case["class"], + "error": str(exc)[:300], + } + eps = current.get("episodes") or [] + # The case is done (its late side writes too): check each + # CONFIRMED again now, before the next case empties the store. + shadow.run_rechecks(now=True, only=list(eps)) + verdicts = [e.verdict for e in eps] + late = [e.late_verdict for e in eps if e.late_verdict] + proxy_writes = sum(1 for e in proxy.log if e.get("method") in WRITE_METHODS) + row["shadow"] = { + "verdict": case_verdict(verdicts), + "late": case_verdict(late) if late else "", + "checks": [ + { + "id": e.id, + "verdict": e.verdict, + "reasons": e.reasons, + "name": e.name, + } + for e in eps + ], + "agent_writes": current.get("sent", 0), + "proxy_writes": proxy_writes, + } + oracle = (row.get("oracle") or {}).get("verdict", "error") + final, note = row["shadow"]["verdict"], "" + if final == "CONFIRMED" and row["shadow"]["late"] in ( + "REFUTED", + "UNCERTAIN", + ): + final, note = row["shadow"]["late"], " (on recheck)" + row["shadow_outcome"] = outcome(oracle, final) + note + rows.append(row) + print( + f"[{i:2}/{len(cases)}] {case['id']:5} {case['class']:16} oracle " + f"{oracle:8} shadow {row['shadow']['verdict']:10} " + f"recheck {row['shadow']['late'] or '-':10} -> {row['shadow_outcome']}", + flush=True, + ) + finally: + shadow.stop() + proxy.stop() + client = fx.client("record-check")["id"] + by_shadow = shadow_writes(fx, bench.actors.token("setup"), since, client) + doc = shadow.results() + page = write_report(doc, out / "shadow") + tally = Counter(r["shadow_outcome"] for r in rows) + summary = { + "schema": "openadapt.medplum-shadow-run/v1", + "agent": name, + "when": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "commit": _git_commit(), + "medplum_up_s": round(up_s, 1), + "wall_s": round(time.monotonic() - t_start, 1), + "outcomes": dict(tally), + "writes_by_shadow_credential": by_shadow, + "agent_writes_equal_proxy_writes": all( + r.get("shadow", {}).get("agent_writes") + == r.get("shadow", {}).get("proxy_writes") + for r in rows + ), + "overhead_ms": doc["overhead_ms"], + "report": str(page), + "cases": rows, + } + (out / "shadow-run.json").write_text( + json.dumps(summary, indent=2, default=str) + "\n" + ) + print( + json.dumps( + { + k: summary[k] + for k in ( + "outcomes", + "writes_by_shadow_credential", + "agent_writes_equal_proxy_writes", + "overhead_ms", + ) + }, + indent=1, + ) + ) + if args.down: + fx.down(volumes=True) + for stale in ("secrets.json", "clients.json"): + (fx.state_dir / stale).unlink(missing_ok=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/packages/flow/benchmark/fhir_medplum/public/shadow_setup_timing.py b/packages/flow/benchmark/fhir_medplum/public/shadow_setup_timing.py new file mode 100644 index 0000000000..29b711689a --- /dev/null +++ b/packages/flow/benchmark/fhir_medplum/public/shadow_setup_timing.py @@ -0,0 +1,153 @@ +"""Time a vendor's shadow-mode setup on a running Medplum, step by step. + + python -m benchmark.fhir_medplum.public.shadow_setup_timing --port 9740 --out DIR + +Each step is what a vendor does, done for real and timed: + +1. a read credential for the shadow (a new client application; in Medplum's + admin app this is "Project > Clients > New"); +2. the agent's own actor reference (``/auth/me`` with the agent's sign-in); +3. ``shadow.yaml`` and the three reference contracts; +4. ``openadapt shadow --config shadow.yaml`` started, the agent pointed at it; +5. the agent's first task, then the report. + +The time a person spends deciding is not something a script can measure; +the decisions are listed, and the result says which parts were timed. +""" + +from __future__ import annotations + +import argparse +import json +import os +import shutil +import subprocess +import sys +import time +from pathlib import Path + +from benchmark.fhir_medplum.fixture import MedplumFixture +from benchmark.fhir_medplum.public import agents as agent_mod +from benchmark.fhir_medplum.public.run import CONTRACTS, DEFAULT_STATE, PROJECT +from benchmark.fhir_medplum.readpath.suite import Actors, profile_ref + +DECISIONS = [ + "which server the agent writes to (the upstream URL)", + "which contracts: the reference Patient, AllergyIntolerance and " + "Appointment contracts, used as they are", + "the shadow's read credential and the agent's actor reference", +] + +CONFIG = """\ +schema_version: openadapt.shadow/v1 +mode: fhir +upstream: {upstream} +listen: {listen} +contracts: [contracts/patient.yaml, contracts/allergy.yaml, contracts/appointment.yaml] +""" + + +def main(argv: list[str] | None = None) -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--port", type=int, default=9740) + ap.add_argument("--out", required=True) + args = ap.parse_args(argv) + out = Path(args.out) + out.mkdir(parents=True, exist_ok=True) + fx = MedplumFixture( + state_dir=(DEFAULT_STATE / str(args.port)).expanduser(), + server_port=args.port, + app_port=args.port + 1, + project=f"{PROJECT}-{args.port}", + ) + steps: dict[str, float] = {} + t0 = last = time.monotonic() + + def mark(name: str) -> None: + nonlocal last + now = time.monotonic() + steps[name] = round(now - last, 2) + last = now + + reader = f"shadow-reader-{int(time.time())}" + os.environ["BENCH_RECORD_TOKEN"] = fx.client_token(reader) + mark("1_read_credential") + actors = Actors(fx) + bot = actors.token("bot") + os.environ["BENCH_AGENT_REF"] = profile_ref(fx, bot) + os.environ["BENCH_FHIR_URL"] = fx.fhir_url + mark("2_agent_actor_reference") + work = out / "vendor" + (work / "contracts").mkdir(parents=True, exist_ok=True) + for path in CONTRACTS.values(): + shutil.copy(path, work / "contracts" / path.name) + listen = args.port + 4 + (work / "shadow.yaml").write_text( + CONFIG.format(upstream=f"http://127.0.0.1:{args.port}", listen=listen) + ) + mark("3_config_and_contracts") + proc = subprocess.Popen( + [ + str(Path(sys.executable).parent / "openadapt"), + "shadow", + "--config", + str(work / "shadow.yaml"), + "--out", + str(out / "report"), + "--until-idle", + "5", + "--recheck-s", + "3", + ], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + assert proc.stdout is not None + first = proc.stdout.readline() + mark("4_shadow_started") + n = int(time.time()) % 10000 + task = { + "id": "SETUP", + "type": "patient", + "resource_type": "Patient", + "instruction": "Make sure this patient is registered, exactly once.", + "values": { + "given": "Imani", + # A person no earlier run registered (or the shadow, rightly, + # reports the agent's create as a duplicate). + "family": f"Setup{n}", + "birthDate": f"19{50 + n % 40}-0{1 + n % 9}-1{n % 10}", + "gender": "female", + "line": "9 Elm Street", + "city": "Springfield", + "state": "MA", + "postalCode": "01103", + "phone": f"413-555-{n:04d}", + "email": f"imani.setup{n}@example.org", + }, + } + claim = agent_mod.scripted(task, f"http://127.0.0.1:{listen}/fhir/R4", bot) + mark("5a_agent_first_task") + rest, _ = proc.communicate(timeout=600) + mark("5b_check_recheck_and_report") + report = json.loads((out / "report" / "report.json").read_text()) + total = round(time.monotonic() - t0, 1) + result = { + "schema": "openadapt.shadow-setup-timing/v1", + "steps_s": steps, + "machine_total_s": total, + "decisions": DECISIONS, + "claim": claim, + "counts": report["counts"], + "late": [i.get("late") for i in report["items"]], + "shadow_output": (first + rest).strip().splitlines()[-2:], + "timed": "every step's commands; not the person's reading or deciding", + } + (out / "setup-timing.json").write_text(json.dumps(result, indent=2) + "\n") + print(json.dumps(result, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/packages/flow/docs/SHADOW_MODE.md b/packages/flow/docs/SHADOW_MODE.md new file mode 100644 index 0000000000..11c706037d --- /dev/null +++ b/packages/flow/docs/SHADOW_MODE.md @@ -0,0 +1,154 @@ +# Shadow mode + +Shadow mode shows a team what their own agent gets wrong on their own +system of record, without changing anything the agent does. It sits beside +the agent, checks each write the agent makes, and writes a report. It never +blocks, edits or resends a write. + +```bash +openadapt shadow --config shadow.yaml --out shadow-report +``` + +The agent then talks to the shadow's address instead of the server's. When +the run ends (Ctrl-C, or `--until-idle`), the report is in +`shadow-report/report.html` and `shadow-report/report.json`. + +## How writes are observed + +Shadow mode is a pass-through HTTP proxy on the loopback interface. Reads +pass through untouched. For a write (POST, PUT, PATCH or DELETE), the proxy: + +1. finds the route the write matches, and the contract for it; +2. reads the system of record before the write (the baseline), for at most + `hold_ms` (default 2,000 ms); +3. forwards the write and returns the server's reply: the same method, + target, headers (in order, repeats included) and body. Hop-by-hop headers + (`Connection`, `Transfer-Encoding` and the like) are the connection's own + and aren't passed on, so a chunked body goes on with its length instead. + +The baseline is the only delay. Each write's added latency is measured and +shown in the report: the hold for the baseline, plus the proxy's own time, +which includes opening a new connection to the server for each request. If +the baseline isn't ready within `hold_ms`, the write goes on anyway and its +verdict is `UNCERTAIN`. If the shadow fails in any way, the write still goes +through and the shadow's error goes in the report. If the server can't be +reached or drops the connection, the agent's connection is closed with no +reply, as it would be without the shadow; the shadow never makes up a status. + +Writes that touch the same record (the same contract and identity values, +or a later write to the record an earlier one created) form one episode: a +create, the agent's retry after a lost reply, and its own correction are one +episode. An episode is checked once the agent has made no write for +`quiet_s` (default 5 s), or at the end of the run. + +## How each write is checked + +Shadow mode has no verifier of its own. It calls the two that exist: + +| Mode | Read path | Verifier | Contract | +|---|---|---|---| +| `fhir` | FHIR searches, `_history` and `AuditEvent` | `openadapt_flow.ensure_record` (`verify_ensure`) | `openadapt.ensure-record/v1`, per resource type | +| `sql` | The database, read-only, with the whole-database frame | `openadapt_flow.verifier` (`begin_write`, `verify_write`) | `openadapt.verify/v1` with `frame.database` | + +The values the write must hold come from the write itself: each contract +field is read from the request body at the field's path (`fhir`), or from +the body key the route names (`sql`). Shadow mode checks that the system of +record holds what the agent sent, once, and that nothing else the agent's +credential could write moved. It doesn't know what the agent was asked to +do, so it can't tell that the agent sent the wrong value in the first place. + +Verdicts use the verifier's vocabulary: + +| Verdict | Meaning | +|---|---| +| `CONFIRMED` | The system of record holds the write as sent, once, and nothing else moved. | +| `REFUTED` | It holds something else: a changed value, a second copy, a change to another record, or a value the agent didn't send. | +| `UNCERTAIN` | It couldn't be read, the baseline wasn't ready, the write has no contract, or the agent was still writing while it was checked. | + +The verdict fails closed: whatever can't be read is `UNCERTAIN`, never +`CONFIRMED`. A write the server refused, with nothing landed, is +`UNCERTAIN` too: the write isn't there, and nothing landed wrong. Shadow mode +uses no write ledger (`ledger=None`), so it can't hold or refuse any of the +agent's writes. The baselines and receipts go in the output folder. + +## Checked again later + +A write can be right when checked and wrong a minute later: a background +job, a trigger, or the agent's tool writing to another record after it +answered. So each `CONFIRMED` is checked again: + +- `fhir`: `recheck_s` after the check (default 300 s), `verify_ensure` + reads the server again over the window since the first check, with the + confirmed record as the one already there. It refutes when the record is + gone, is no longer the person, holds a value other than the one sent (or, + under a closed contract, a value the agent didn't send), or has a + duplicate, and when the agent's credential wrote anything since + that no other write through the shadow explains (a write to the confirmed + record itself never counts as explained). `--recheck-s 0` turns it off. +- `sql`: when the contract's `frame.database.recheck_after_s` is due, + `verifier.recheck` reads the whole database again. Later writes through + the shadow under the same contract are excused as the verifier excuses + them. A contract without `recheck_after_s` isn't rechecked. + +A recheck that doesn't confirm sets the write's final verdict: it moves to +"Landed wrong after the check" (`REFUTED`) or "Couldn't be confirmed" +(`UNCERTAIN`), and both verdicts are shown. The counts are of final +verdicts. A recheck still to run is listed as not yet run; `--until-idle` +waits for the rechecks, while Ctrl-C ends the run without them. + +A recheck reads a window, not one record. A change in it by the agent's +credential that no write through the shadow explains refutes every +`CONFIRMED` whose window holds it, not only the write it came from. If the +agent made a later write through the shadow whose record the recheck can't +know (a lost reply, a write under no contract), a refutation that rests on +such a change becomes `UNCERTAIN` instead. A refutation from reading the +record itself (gone, moved, changed) stays `REFUTED`. + +## Where the contract comes from + +A team makes three decisions: + +1. **The server.** The upstream URL the agent writes to. +2. **The contracts.** One per kind of write. For FHIR, the reference + contracts in `benchmark/fhir_medplum/public/contracts/` cover Patient, + AllergyIntolerance and Appointment, and `openadapt-flow generate + ensure-contract` writes one for another type from two demonstrations. + For SQL, a `verify.yaml` with a whole-database frame. +3. **The read credential.** A read-only credential for the verifier, + separate from the agent's, and the agent's own actor reference. + +A write with no matching route is reported as `UNCERTAIN` ("no contract"), +so a missing contract shows in the report rather than hiding a write. + +## The report + +`report.json` has every write; `report.html` is the same for a person, and +reads in about two minutes: + +- the counts: writes seen, `CONFIRMED`, `REFUTED`, `UNCERTAIN`; +- each `REFUTED` write: what the agent sent, what the system of record + holds now (before and after, with the fields that differ), and the + verifier's reasons; +- each `UNCERTAIN` write, with what couldn't be read; +- the overhead: added latency per write (median and largest); +- the setup: minutes from start to the first checked write, and the + decisions it took. + +The report holds field names and the values of the writes it describes. +Keep it where the system of record's data may be kept. + +## Limits + +- Only writes that pass through the proxy are seen as the agent's. A write + the agent makes another way shows only as a change the frame or the change + feed sees, inside another write's check. +- Checks wait until no write is in flight. Writes of other episodes not yet + checked are left out of an episode's judgment (each is judged on its own). + A write the agent makes while an episode is checked makes that episode + `UNCERTAIN`. +- A change after the recheck's read is outside it. +- A write the agent was asked to make and never made shows nowhere: the + shadow sees only writes. +- The server's links (`Location`, `fullUrl`) name the server, not the + shadow. An agent that follows them goes around the shadow, and those writes + show only as unexplained changes inside other checks. diff --git a/packages/flow/docs/commands/11-guard-an-agent-you-already-run/shadow.md b/packages/flow/docs/commands/11-guard-an-agent-you-already-run/shadow.md new file mode 100644 index 0000000000..b5f3105438 --- /dev/null +++ b/packages/flow/docs/commands/11-guard-an-agent-you-already-run/shadow.md @@ -0,0 +1 @@ +Shadow a FHIR or HTTP agent: check each write against the system of record without blocking it, and report. diff --git a/packages/flow/openadapt_flow/__main__.py b/packages/flow/openadapt_flow/__main__.py index 3d62d0e2f0..9745b67b33 100644 --- a/packages/flow/openadapt_flow/__main__.py +++ b/packages/flow/openadapt_flow/__main__.py @@ -12088,6 +12088,10 @@ def _repair_store_flag(rp: argparse.ArgumentParser) -> None: _register_rollback(sub) + from openadapt_flow.cli_shadow import register as _register_shadow + + _register_shadow(sub) + from openadapt_flow.cli_cleanup import register as _register_cleanup _register_cleanup(sub) diff --git a/packages/flow/openadapt_flow/cli_shadow.py b/packages/flow/openadapt_flow/cli_shadow.py new file mode 100644 index 0000000000..57d4ea8aec --- /dev/null +++ b/packages/flow/openadapt_flow/cli_shadow.py @@ -0,0 +1,220 @@ +"""CLI: ``openadapt-flow shadow`` -- check an agent's writes beside it, never +blocking one. See ``docs/SHADOW_MODE.md``. + + openadapt shadow --mode fhir --upstream http://127.0.0.1:8103 \\ + --contract allergy.yaml --listen 9670 --out shadow-report + +Config file (``--config shadow.yaml``, ``openadapt.shadow/v1``):: + + mode: sql + upstream: http://127.0.0.1:8080 + routes: + - write: "POST /api/v1/Contact" + contract: contact.verify.yaml + params: {email: emailAddress, lname: lastName} +""" + +from __future__ import annotations + +import argparse +import re +import signal +import sys +import time +from pathlib import Path +from typing import Any + +SCHEMA = "openadapt.shadow/v1" + + +def register(sub: argparse._SubParsersAction) -> None: + p = sub.add_parser( + "shadow", + help="Check each write an agent makes against the system of record, " + "without blocking or changing it, and write a report", + ) + p.add_argument("--config", help=f"{SCHEMA} YAML (flags override it)") + p.add_argument("--mode", choices=("fhir", "sql")) + p.add_argument("--upstream", help="the server the agent writes to") + p.add_argument( + "--contract", + action="append", + default=[], + help="fhir: an openadapt.ensure-record/v1 contract (repeatable)", + ) + p.add_argument( + "--listen", type=int, default=None, help="loopback port (default 9670)" + ) + p.add_argument("--out", default="shadow-report") + p.add_argument("--actor", default=None, help="sql: the agent's id in the receipt") + p.add_argument( + "--hold-ms", + type=float, + default=None, + help="longest a write waits for the read before it (default 2000)", + ) + p.add_argument( + "--quiet-s", + type=float, + default=None, + help="check once the agent has written nothing this long (default 5)", + ) + p.add_argument( + "--until-idle", + type=float, + default=None, + metavar="SECONDS", + help="stop after this long with no write (default: run until Ctrl-C)", + ) + p.add_argument( + "--recheck-s", + type=float, + default=None, + help="fhir: check each CONFIRMED write again this long after (default " + "300; 0 turns it off); --until-idle waits for the rechecks", + ) + p.set_defaults(func=cmd_shadow) + + +def load(args: argparse.Namespace) -> dict[str, Any]: + import yaml + + from openadapt_flow.shadow import ShadowConfigError + + cfg: dict[str, Any] = {} + base = Path.cwd() + if args.config: + path = Path(args.config) + cfg = yaml.safe_load(path.read_text(encoding="utf-8")) or {} + if cfg.get("schema_version", SCHEMA) != SCHEMA: + raise ShadowConfigError(f"{path} is not {SCHEMA}") + base = path.resolve().parent + for key in ( + "mode", + "upstream", + "listen", + "actor", + "hold_ms", + "quiet_s", + "recheck_s", + ): + value = getattr(args, key, None) + if value is not None: + cfg[key] = value + if args.contract: + cfg["contracts"] = list(args.contract) + cfg["_base"] = base + if not cfg.get("mode") or not cfg.get("upstream"): + raise ShadowConfigError("give --mode and --upstream (or a --config with both)") + return cfg + + +def build(cfg: dict[str, Any], out: Path) -> Any: + from openadapt_flow.shadow import Route, Shadow, ShadowConfigError + + base: Path = cfg["_base"] + contracts, routes = [], [] + if cfg["mode"] == "fhir": + from openadapt_flow.ensure_record import load_contract + + contracts = [load_contract(base / c) for c in cfg.get("contracts") or []] + else: + from openadapt_flow.verifier import Contract + + for i, r in enumerate(cfg.get("routes") or []): + if not isinstance(r, dict) or not r.get("write") or not r.get("contract"): + raise ShadowConfigError(f"route {i + 1} needs write and contract") + contract = Contract.load(base / r["contract"]) + params = dict(r.get("params") or {}) + for name in contract.params: + params.setdefault(name, name) + for name, where in params.items(): + if isinstance(where, dict) and set(where) != {"literal"}: + raise ShadowConfigError( + f"route {i + 1}: {name} is a body path or {{literal: value}}" + ) + routes.append( + Route( + re.compile(r["write"]), + contract, + params, + r.get("name") or r["write"], + ) + ) + return Shadow( + upstream=str(cfg["upstream"]), + mode=cfg["mode"], + contracts=contracts, + routes=routes, + actor_id=str(cfg.get("actor") or "agent"), + out=out, + listen=("127.0.0.1", int(cfg.get("listen") or 9670)), + hold_ms=float(cfg.get("hold_ms", 2000)), + upstream_timeout_s=float(cfg.get("upstream_timeout_s", 300)), + recheck_s=_recheck_s(cfg.get("recheck_s", 300)), + quiet_s=float(cfg.get("quiet_s", 5)), + ) + + +def _recheck_s(value: Any) -> Any: + """``None`` or 0 turns the fhir recheck off; a negative wait is an error.""" + + from openadapt_flow.shadow import ShadowConfigError + + if value is None or float(value) == 0: + return None + if float(value) < 0: + raise ShadowConfigError("recheck_s can't be negative") + return float(value) + + +def cmd_shadow(args: argparse.Namespace) -> int: + from openadapt_flow.shadow import ShadowConfigError + from openadapt_flow.shadow_report import write_report + + out = Path(args.out) + try: + shadow = build(load(args), out).start() + except (ShadowConfigError, OSError, ValueError) as exc: + print(f"shadow: {exc}", file=sys.stderr) + return 2 + print( + f"Shadow is listening at {shadow.url}; point the agent there instead of " + f"{args.upstream or 'the server'}. Ctrl-C ends the run.", + flush=True, + ) + stopping = [] + signal.signal(signal.SIGTERM, lambda *_: stopping.append(1)) + try: + while not stopping: + time.sleep(0.5) + if ( + args.until_idle is not None + and shadow.idle_s() >= args.until_idle + and not shadow.pending_rechecks() + ): + break + except KeyboardInterrupt: + pass + print("Checking the last writes...", flush=True) + shadow.stop() + doc = shadow.results() + page = write_report(doc, out) + n = doc["counts"] + print( + f"{doc['writes_seen']} writes, {doc['checks']} checks: {n['CONFIRMED']} " + f"confirmed, {n['REFUTED']} refuted, {n['UNCERTAIN']} uncertain" + + (f", {n['PENDING']} never checked" if n["PENDING"] else "") + + "".join( + f"; {doc[k]} {label}" + for k, label in ( + ("late_refuted", "refuted on recheck"), + ("late_uncertain", "uncertain on recheck"), + ("rechecks_pending", "confirmed writes not yet rechecked"), + ) + if doc.get(k) + ) + + ". " + f"Report: {page}" + ) + return 0 diff --git a/packages/flow/openadapt_flow/ensure_record.py b/packages/flow/openadapt_flow/ensure_record.py index 8a4d96a2e6..e5ef7a9e29 100644 --- a/packages/flow/openadapt_flow/ensure_record.py +++ b/packages/flow/openadapt_flow/ensure_record.py @@ -40,7 +40,7 @@ import re import time from collections import Counter -from collections.abc import Callable, Mapping +from collections.abc import Callable, Collection, Mapping from dataclasses import dataclass, field from datetime import datetime, timedelta, timezone from email.utils import parsedate_to_datetime @@ -1113,18 +1113,30 @@ def verify_ensure( *, reader: Optional[FhirReader] = None, sleep: Callable[[float], None] = time.sleep, + declared: Collection[str] = (), ) -> EnsureResult: - """Read the server after the write and judge it against ``baseline``.""" + """Read the server after the write and judge it against ``baseline``. + + ``declared`` names resources (``Type/id``) the caller saw the agent write + as other writes, each judged on its own (shadow mode's other episodes). + They are left out of this judgment; every other change still counts. + """ reader = reader or FhirReader(contract) + skip = {_ref(r) for r in declared} + + def changes_since(until: Optional[datetime]) -> dict[str, Change]: + found = read_changes(contract, reader, baseline.started, until) + return {r: c for r, c in found.items() if r not in skip} + try: # The window closes now (the Date header counts whole seconds). until = reader.server_time() + timedelta(seconds=1) sleep(contract.settle_s) - changes = read_changes(contract, reader, baseline.started, until) + changes = changes_since(until) for _ in range(contract.stable_reads): sleep(contract.settle_s) - again = read_changes(contract, reader, baseline.started, until) + again = changes_since(until) if _fingerprint(again) == _fingerprint(changes): break changes = again @@ -1177,7 +1189,7 @@ def verify_ensure( ) # Last, with no upper bound: a save of the agent's still in flight # when the window closed (a lost response) lands outside it. - late = _agents_part(read_changes(contract, reader, baseline.started), selfs) + late = _agents_part(changes_since(None), selfs) if late != _agents_part(changes, selfs): raise Unreadable("the agent wrote after the window closed") return judge( diff --git a/packages/flow/openadapt_flow/shadow.py b/packages/flow/openadapt_flow/shadow.py new file mode 100644 index 0000000000..74f15101f6 --- /dev/null +++ b/packages/flow/openadapt_flow/shadow.py @@ -0,0 +1,995 @@ +"""Shadow mode: check an agent's writes against the system of record, never +blocking or changing one. See ``docs/SHADOW_MODE.md``. + +A pass-through HTTP proxy sits between the agent and its server. A write is +held only while the store is read before it (at most ``hold_ms``), then sent +on byte for byte. Writes to one record form an episode, checked once the +agent goes quiet by the verifier that already exists for the read path: +``ensure_record.verify_ensure`` (FHIR) or ``verifier.verify_write`` (SQL, +with the whole-database frame). Anything that can't be read is UNCERTAIN. +""" + +from __future__ import annotations + +import http.client +import json +import re +import threading +import time +import traceback +from concurrent.futures import Future, ThreadPoolExecutor +from dataclasses import dataclass, field +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from typing import Any, Callable, Optional +from urllib.parse import parse_qsl, quote, urlsplit + +WRITE_METHODS = ("POST", "PUT", "PATCH", "DELETE") +HOP_BY_HOP = { + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "host", + "content-length", +} +CONFIRMED, REFUTED, UNCERTAIN = "CONFIRMED", "REFUTED", "UNCERTAIN" +#: Characters a request target keeps as they are (RFC 3986 reserved, +#: unreserved and "%"). +_SAFE_URL = "/?#[]@!$&'()*+,;=:%-._~" + + +class ShadowConfigError(ValueError): + """The shadow's configuration can't be used.""" + + +@dataclass +class Route: + """SQL mode: which writes a ``verify.yaml`` contract checks.""" + + write: re.Pattern[str] # matched against "METHOD /path" + contract: Any # verifier.Contract + #: parameter -> dotted path in the request body, or ``{"literal": v}`` + #: for a value the operator pins (one the body doesn't carry). + params: dict[str, Any] + name: str + + +@dataclass +class Write: + seq: int + method: str + path: str + status: int = 0 + started: float = 0.0 + held_ms: float = 0.0 + proxy_ms: float = 0.0 + upstream_ms: float = 0.0 + error: str = "" + + +@dataclass +class Episode: + id: int + kind: str # "fhir", "sql" or "none" + name: str # resource type or route name + contract: Any = None + params: dict[str, Any] = field(default_factory=dict) + writes: list[Write] = field(default_factory=list) + refs: set[str] = field(default_factory=set) + baseline: Optional[Future] = None + baseline_note: str = "" + in_flight: int = 0 + last_end: float = 0.0 + checked: bool = False + verdict: str = "" + reasons: list[str] = field(default_factory=list) + evidence: dict[str, Any] = field(default_factory=dict) + checked_at: float = 0.0 + #: The verifier's first result and baseline, kept for the recheck. + result: Any = None + base: Any = None + #: When a CONFIRMED is checked again (epoch seconds; 0: never). + recheck_at: float = 0.0 + recheck_from: Any = None # fhir: the server time the recheck reads from + late_verdict: str = "" + late_reasons: list[str] = field(default_factory=list) + #: The recheck read the record itself and found it changed or gone (a + #: finding no later write of the agent's can explain away). + late_moved: bool = False + + +def _body_doc(body: bytes, content_type: str) -> Any: + if not body: + return None + if "x-www-form-urlencoded" in content_type: + return dict(parse_qsl(body.decode("utf-8", "replace"), keep_blank_values=True)) + try: + return json.loads(body) + except ValueError: + return None + + +_MISSING = object() + + +def _dotted(doc: Any, path: str) -> Any: + """The value at a dotted path, or ``_MISSING`` (a null is a value).""" + + node = doc + for part in path.split("."): + if isinstance(node, dict) and part in node: + node = node[part] + elif isinstance(node, list) and part.isdigit() and int(part) < len(node): + node = node[int(part)] + else: + return _MISSING + return node + + +class _QuietServer(ThreadingHTTPServer): + def handle_error(self, request: Any, client_address: Any) -> None: + import sys + + if not isinstance(sys.exc_info()[1], ConnectionError): + super().handle_error(request, client_address) + + +class Shadow: + """One shadow session: the proxy, the episodes and the checks.""" + + def __init__( + self, + *, + upstream: str, + mode: str, + contracts: Optional[list[Any]] = None, + routes: Optional[list[Route]] = None, + actor_id: str = "agent", + out: Path, + listen: tuple[str, int] = ("127.0.0.1", 0), + hold_ms: float = 2000.0, + upstream_timeout_s: float = 300.0, + recheck_s: Optional[float] = 300.0, + quiet_s: float = 5.0, + ) -> None: + if mode not in ("fhir", "sql"): + raise ShadowConfigError(f"mode {mode!r} is not fhir or sql") + if listen[0] not in ("127.0.0.1", "localhost", "::1"): + raise ShadowConfigError("the shadow listens on the loopback interface only") + parts = urlsplit(upstream) + if parts.scheme not in ("http", "https") or not parts.hostname: + raise ShadowConfigError(f"upstream {upstream!r} is not an http(s) URL") + self.mode = mode + self.upstream = parts + self.contracts = {c.resource_type: c for c in contracts or []} + self.routes = list(routes or []) + if mode == "fhir" and not self.contracts: + raise ShadowConfigError( + "fhir mode needs at least one ensure-record contract" + ) + if mode == "sql" and not self.routes: + raise ShadowConfigError("sql mode needs at least one route") + self.actor_id = actor_id + self.out = Path(out) + self.hold_s = max(0.0, hold_ms) / 1000.0 + self.quiet_s = quiet_s + self.upstream_timeout_s = upstream_timeout_s + #: fhir: check each CONFIRMED again this long after (None: never). + #: sql: the contract's ``frame.database.recheck_after_s`` decides. + self.recheck_s = recheck_s + #: Called as ``on_checked(episode, result)`` after each verifier call, + #: with the verifier's own result (``EnsureResult`` or ``WriteResult``), + #: for a step that learns from checked traffic. Its errors go in + #: ``errors``; it never changes a verdict. + self.on_checked: Optional[Callable[[Episode, Any], None]] = None + self.started = time.time() + self.episodes: list[Episode] = [] + self.writes: list[Write] = [] + self.errors: list[str] = [] + self._by_key: dict[Any, Episode] = {} + self._by_ref: dict[str, Episode] = {} + self._lock = threading.RLock() + self._check_lock = threading.Lock() + self._seq = 0 + self._last_write = 0.0 + self._pool = ThreadPoolExecutor(max_workers=8, thread_name_prefix="shadow-read") + self._stop = threading.Event() + self.server = _QuietServer(listen, self._handler()) + self.server.daemon_threads = True + self._threads = [ + threading.Thread(target=self.server.serve_forever, daemon=True), + threading.Thread(target=self._checker, daemon=True), + ] + + # -- lifecycle ------------------------------------------------------------------- + + @property + def url(self) -> str: + host, port = self.server.server_address[:2] + name = host.decode() if isinstance(host, bytes) else host + return f"http://{name}:{port}" + + def start(self) -> "Shadow": + for t in self._threads: + t.start() + return self + + def stop(self) -> None: + self._stop.set() + self.server.shutdown() + self.server.server_close() + self.flush() + self._pool.shutdown(wait=False, cancel_futures=True) + + def idle_s(self) -> float: + with self._lock: + return time.time() - (self._last_write or self.started) + + def flush(self, wait_s: float = 120.0) -> None: + """Check every episode now, once its writes have their replies.""" + + deadline = time.time() + wait_s + while time.time() < deadline: + with self._lock: + busy = any(e.in_flight for e in self.episodes if not e.checked) + if not busy: + break + time.sleep(0.05) + self._check_due() + + # -- the proxy ------------------------------------------------------------------- + + def _handler(self) -> type[BaseHTTPRequestHandler]: + shadow = self + + class Handler(BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + + def log_message(self, *_: Any) -> None: + pass + + def _do(self) -> None: + shadow._handle(self) + + do_GET = do_HEAD = do_POST = do_PUT = do_PATCH = do_DELETE = _do + do_OPTIONS = _do + + return Handler + + def _read_body(self, h: BaseHTTPRequestHandler) -> bytes: + if "chunked" in (h.headers.get("Transfer-Encoding") or "").lower(): + chunks: list[bytes] = [] + while True: + size = int(h.rfile.readline().split(b";")[0].strip() or b"0", 16) + if size == 0: + while h.rfile.readline() not in (b"\r\n", b"\n", b""): + pass + return b"".join(chunks) + chunks.append(h.rfile.read(size)) + h.rfile.readline() + length = int(h.headers.get("Content-Length") or 0) + return h.rfile.read(length) if length else b"" + + def _handle(self, h: BaseHTTPRequestHandler) -> None: + t0 = time.perf_counter() + method = h.command + write: Optional[Write] = None + episode: Optional[Episode] = None + try: + body = self._read_body(h) + except Exception as exc: # noqa: BLE001 - a body we can't read can't be sent + self._note_error(f"unreadable request body for {method}: {exc!r}") + h.close_connection = True + return + if method in WRITE_METHODS: + try: + write, episode = self._observe(method, h.path, h.headers, body) + except Exception as exc: # noqa: BLE001 - the write goes on regardless + self._note_error(f"observe {method}: {exc!r}") + upstream_s = 0.0 + reply: Optional[tuple[int, str, list[tuple[str, str]], bytes]] = None + failure = "" + try: + held = time.perf_counter() + if episode is not None and episode.baseline is not None: + self._wait_baseline(episode) + if write is not None: + write.held_ms = (time.perf_counter() - held) * 1000 + t_up = time.perf_counter() + try: + reply = self._forward(method, h.path, h.headers, body) + except Exception as exc: # noqa: BLE001 - mirrored as a dropped connection + failure = f"upstream failed: {type(exc).__name__}" + self._note_error(f"{method} {h.path[:200]}: {failure}") + upstream_s = time.perf_counter() - t_up + if reply is None: + # The agent sees what it would see without the shadow: the + # connection ends with no reply. Never a made-up status. + h.close_connection = True + else: + status, reason, headers, rbody = reply + try: + h.send_response_only(status, reason or None) + for key, value in headers: + h.send_header(key, value) + h.end_headers() + if method != "HEAD": + h.wfile.write(rbody) + except OSError: + pass # the agent hung up; the write already went on + finally: + if write is not None and episode is not None: + write.upstream_ms = upstream_s * 1000 + write.proxy_ms = ( + time.perf_counter() - t0 - upstream_s + ) * 1000 - write.held_ms + write.status = reply[0] if reply else 0 + write.error = failure + try: + self._answered(episode, write, reply) + except Exception as exc: # noqa: BLE001 + self._note_error(f"answered {method}: {exc!r}") + with self._lock: + episode.in_flight = max(0, episode.in_flight - 1) + + def _forward( + self, method: str, path: str, headers: Any, body: bytes + ) -> tuple[int, str, list[tuple[str, str]], bytes]: + """Send the request on unchanged and return the reply unchanged. + + Hop-by-hop headers aside, every header goes on in order, repeats + included. A chunked body goes on with its length instead. Raises on + a transport failure. + """ + + up = self.upstream + cls = ( + http.client.HTTPSConnection + if up.scheme == "https" + else http.client.HTTPConnection + ) + conn = cls(up.hostname or "", up.port, timeout=self.upstream_timeout_s) + target = (up.path.rstrip("/") + path) if up.path not in ("", "/") else path + # http.server decodes the request line as Latin-1; send the same bytes, + # with any byte outside ASCII percent-encoded (the same URL). + target = quote(target.encode("latin-1"), safe=_SAFE_URL) + try: + conn.putrequest(method, target, skip_host=True, skip_accept_encoding=True) + conn.putheader("Host", up.netloc) + for key, value in headers.items(): + if key.lower() not in HOP_BY_HOP: + conn.putheader(key, value) + if body or method in WRITE_METHODS or "Content-Length" in headers: + conn.putheader("Content-Length", str(len(body))) + conn.endheaders(body or None) + resp = conn.getresponse() + data = resp.read() + kept = [(k, v) for k, v in resp.getheaders() if k.lower() not in HOP_BY_HOP] + if resp.status not in (204, 304) and not 100 <= resp.status < 200: + length = resp.getheader("Content-Length") + kept.append( + ( + "Content-Length", + length if method == "HEAD" and length else str(len(data)), + ) + ) + return resp.status, resp.reason, kept, data + finally: + conn.close() + + # -- observing a write ------------------------------------------------------------- + + def _observe( + self, method: str, path: str, headers: Any, body: bytes + ) -> tuple[Write, Episode]: + doc = _body_doc(body, headers.get("Content-Type") or "") + with self._lock: + self._seq += 1 + write = Write(self._seq, method, path, started=time.time()) + self.writes.append(write) + self._last_write = write.started + episode = ( + self._fhir_episode(method, path, doc) + if self.mode == "fhir" + else self._sql_episode(method, path, doc) + ) + episode.writes.append(write) + episode.in_flight += 1 + return write, episode + + def _new(self, kind: str, name: str, **kw: Any) -> Episode: + ep = Episode(id=len(self.episodes) + 1, kind=kind, name=name, **kw) + self.episodes.append(ep) + return ep + + def _unchecked(self, name: str, why: str) -> Episode: + ep = self._new("none", name) + ep.baseline_note = why + return ep + + def _fhir_episode(self, method: str, path: str, doc: Any) -> Episode: + from openadapt_flow.ensure_record import extract, normalize + + segs = [s for s in urlsplit(path).path.split("/") if s] + if any(s == "_search" or s.startswith("$") for s in segs): + return self._unchecked(path, "an operation or a search sent as a write") + rtype, rid = "", "" + if segs and segs[-1] in self.contracts: + rtype = segs[-1] + elif len(segs) >= 2 and segs[-2] in self.contracts: + rtype, rid = segs[-2], segs[-1] + if not rtype: + name = segs[-1] if segs else "/" + if len(segs) >= 2 and segs[-2][:1].isupper(): + name = segs[-2] + return self._unchecked(name, f"no contract for {name}") + contract = self.contracts[rtype] + ref = f"{rtype}/{rid}" if rid else "" + params: dict[str, Any] = {} + if isinstance(doc, dict) and doc.get("resourceType") == rtype: + for name, rule in contract.fields.items(): + value = extract(doc, rule.path) + if value is not None and not isinstance(value, (dict, list)): + params[name] = value + done = self._by_ref.get(ref) if ref else None + if done is not None and done.checked: + ep = self._unchecked( + rtype, f"a later write to a record already checked (check {done.id})" + ) + elif done is not None: + ep = done + else: + key = None + for rule in contract.identity: + if all(p in params for p in rule): + key = ( + rtype, + tuple( + (p, normalize(params[p], contract.fields[p], task=True)) + for p in rule + ), + ) + break + found = self._by_key.get(key) if key else None + if found is not None and not found.checked: + ep = found # (a checked one: a new write starts a new episode) + else: + if ref or method != "POST": + ep = self._unchecked( + rtype, + f"{method} of a record this session didn't create: an " + "ensure-record contract checks creates", + ) + elif key is None: + ep = self._unchecked(rtype, "the write gives no identity values") + else: + ep = self._new("fhir", rtype, contract=contract, params=params) + ep.baseline = self._pool.submit( + self._fhir_baseline, contract, params + ) + self._by_key[key] = ep + if ep.kind == "fhir" and params: + ep.params = params # the agent's latest values (its correction) + if ref: + ep.refs.add(ref) + self._by_ref[ref] = ep + return ep + + @staticmethod + def _fhir_baseline(contract: Any, params: dict[str, Any]) -> Any: + from openadapt_flow.ensure_record import capture_baseline + + return capture_baseline(contract, params) + + def _sql_episode(self, method: str, path: str, doc: Any) -> Episode: + line = f"{method} {urlsplit(path).path}" + route = next((r for r in self.routes if r.write.fullmatch(line)), None) + if route is None: + return self._unchecked(line, "no route matches this write") + params = { + p: where["literal"] if isinstance(where, dict) else _dotted(doc, where) + for p, where in route.params.items() + } + missing = sorted(p for p, v in params.items() if v is _MISSING) + if missing: + return self._unchecked( + route.name, + "the write doesn't give " + + ", ".join(f"{p} (at {route.params[p]})" for p in missing) + + ": the route doesn't fit this write", + ) + key = (route.name, json.dumps(params, sort_keys=True, default=str)) + ep = self._by_key.get(key) + if ep is None or ep.checked: + ep = self._new("sql", route.name, contract=route.contract, params=params) + ep.baseline = self._pool.submit(self._sql_baseline, route.contract, params) + self._by_key[key] = ep + return ep + + def _sql_baseline(self, contract: Any, params: dict[str, Any]) -> Any: + from openadapt_flow.verifier import Actor, begin_write + + work = self.out / "writes" + work.mkdir(parents=True, exist_ok=True) + # No ledger: the shadow must never hold or refuse the agent's writes. + return begin_write( + contract, + params, + actor=Actor("agent", self.actor_id), + ledger=None, + workdir=work, + ) + + def _wait_baseline(self, ep: Episode) -> None: + fut = ep.baseline + if fut is None or fut.done() or ep.baseline_note: + return + try: + fut.result(timeout=self.hold_s) + except Exception: # noqa: BLE001 - a timeout or a read failure + pass + with self._lock: + if not fut.done() and not ep.baseline_note: + # It may now finish after the write landed: it is no baseline. + ep.baseline_note = ( + f"the store wasn't read within {self.hold_s * 1000:.0f} ms, " + "so the write went on without a baseline" + ) + + def _answered(self, ep: Episode, write: Write, reply: Optional[tuple]) -> None: + with self._lock: + ep.in_flight -= 1 + ep.last_end = time.time() + self._last_write = max(self._last_write, ep.last_end) + if self.mode != "fhir" or reply is None or write.status // 100 != 2: + return + _, _, headers, rbody = reply + refs = [] + try: + doc = json.loads(rbody) if rbody else None + except ValueError: + doc = None + if isinstance(doc, dict) and doc.get("resourceType") and doc.get("id"): + refs.append(f"{doc['resourceType']}/{doc['id']}") + for k, v in headers: + if k.lower() == "location": + parts = urlsplit(v).path.split("/") + if "_history" in parts: + parts = parts[: parts.index("_history")] + if len(parts) >= 2: + refs.append("/".join(parts[-2:])) + for ref in refs: + ep.refs.add(ref) + self._by_ref.setdefault(ref, ep) + + # -- checking ---------------------------------------------------------------------- + + def _checker(self) -> None: + while not self._stop.wait(0.25): + if self.idle_s() >= self.quiet_s: + try: + self._check_due() + self.run_rechecks() + except Exception as exc: # noqa: BLE001 + self._note_error(f"checker: {exc!r}") + + def _check_due(self) -> None: + with self._check_lock: + with self._lock: + if any(e.in_flight for e in self.episodes): + return # a write still in flight would land in every window + due = [e for e in self.episodes if not e.checked] + seq = self._seq + for ep in due: + try: + self._check(ep) + except Exception as exc: # noqa: BLE001 - fail closed on the verdict + ep.verdict, ep.reasons = UNCERTAIN, [f"the check failed: {exc!r}"] + self._note_error(traceback.format_exc(limit=3)) + with self._lock: + if self._seq != seq and ep.verdict != UNCERTAIN: + ep.reasons.insert( + 0, + f"the agent wrote while this was checked; the check " + f"alone said {ep.verdict}", + ) + ep.verdict = UNCERTAIN + ep.checked = True + ep.checked_at = time.time() + self._schedule_recheck(ep) + + def _schedule_recheck(self, ep: Episode) -> None: + if ep.verdict != CONFIRMED or ep.result is None: + return + if ep.kind == "fhir" and self.recheck_s is not None: + if not ep.recheck_from: + ep.late_verdict = UNCERTAIN + ep.late_reasons = [ + "the recheck couldn't be scheduled: the server's clock " + "couldn't be read after the check" + ] + return + ep.recheck_at = ep.checked_at + self.recheck_s + elif ep.kind == "sql" and getattr(ep.result, "recheck_due_at", None): + from datetime import datetime + + try: + due = datetime.fromisoformat( + str(ep.result.recheck_due_at).replace("Z", "+00:00") + ) + except ValueError: + ep.late_verdict = UNCERTAIN + ep.late_reasons = [ + "the recheck couldn't be scheduled: its due time " + f"{ep.result.recheck_due_at!r} can't be read" + ] + return + ep.recheck_at = due.timestamp() + + def pending_rechecks(self) -> int: + """Checks or rechecks still to run: an unchecked episode may + schedule a recheck once it is checked.""" + + with self._lock: + return sum( + 1 + for e in self.episodes + if not e.checked or (e.recheck_at and not e.late_verdict) + ) + + def run_rechecks(self, *, now: bool = False, only: Optional[list] = None) -> None: + """Check each CONFIRMED again once it is due. ``now`` runs whatever + is scheduled without waiting for ``recheck_s`` (fhir), as a test + harness does before it resets the store; a SQL recheck still waits + for the contract's due time. The first verdict stays as it was.""" + + with self._check_lock: + with self._lock: + if any(e.in_flight for e in self.episodes): + return + due = [ + e + for e in (only if only is not None else self.episodes) + if e.recheck_at + and not e.late_verdict + and (now or time.time() >= e.recheck_at) + ] + seq = self._seq + for ep in due: + try: + self._recheck(ep) + except Exception as exc: # noqa: BLE001 - fail closed + ep.late_verdict = UNCERTAIN + ep.late_reasons = [f"the recheck failed: {exc!r}"] + self._note_error(traceback.format_exc(limit=3)) + with self._lock: + if ep.late_verdict == REFUTED and not ep.late_moved: + unknown = self._unexplained_later(ep) + if unknown: + ep.late_verdict = UNCERTAIN + ep.late_reasons.insert( + 0, + f"the agent made {unknown} later write(s) through " + "the shadow that this recheck can't tell apart " + "from a change to this record", + ) + if self._seq != seq and ep.late_verdict != UNCERTAIN: + ep.late_reasons.insert( + 0, + "the agent wrote while this was rechecked; the " + f"recheck alone said {ep.late_verdict}", + ) + ep.late_verdict = UNCERTAIN + ep.evidence["recheck"] = { + "verdict": ep.late_verdict, + "reasons": ep.late_reasons, + "at": time.time(), + } + + def _later(self, ep: Episode) -> list[Episode]: + return [ + o + for o in self.episodes + if o is not ep and o.writes and o.writes[0].started > ep.checked_at + ] + + def _unexplained_later(self, ep: Episode) -> int: + """Later writes through the shadow a recheck can't excuse: in fhir, + a write whose record isn't known (a lost reply); in sql, a write + under no contract or another one, or with no result.""" + + n = 0 + for o in self._later(ep): + if ep.kind == "fhir": + # Per write: a create whose reply didn't come back may have + # made a record no one knows, even in an episode that has one. + n += sum( + 1 + for w in o.writes + if w.status // 100 != 2 and (w.method == "POST" or not o.refs) + ) + else: + n += not (o.kind == "sql" and o.contract is ep.contract and o.result) + return n + + def _recheck(self, ep: Episode) -> None: + if ep.kind == "fhir": + self._recheck_fhir(ep) + return + from openadapt_flow.verifier import Actor, recheck + + with self._lock: + later = [ + o.result + for o in self._later(ep) + if o.kind == "sql" and o.contract is ep.contract and o.result + ] + late = recheck( + ep.contract, + ep.result, + params=ep.params, + actor=Actor("agent", self.actor_id), + excused_by=later, + wait=True, # due by now; never refuse for a clock a second early + ledger=None, + ) + ep.late_verdict = str(late.outcome) + # Shadow mode keeps no ledger, so the verifier's note about one is + # noise here. + ep.late_reasons = [r for r in late.reasons if "ledger" not in r] + + def _recheck_fhir(self, ep: Episode) -> None: + from openadapt_flow.ensure_record import ( + Baseline, + FhirReader, + Unreadable, + extra_elements, + is_person, + verify_ensure, + wrong_fields, + ) + + contract = ep.contract + rid = str(ep.result.record_id or "") + ref = f"{contract.resource_type}/{rid}" + with self._lock: + # Every other write the agent sent is judged on its own, except + # one to this record. + declared = [ + r for o in self.episodes if o is not ep for r in o.refs if r != ref + ] + reader = FhirReader(contract) + try: + _, now = reader.fetch(f"{reader.base_url}/{ref}") + except Unreadable as exc: + gone = re.search(r"returned HTTP (404|410)\b", str(exc)) + ep.late_moved = bool(gone) + ep.late_verdict = REFUTED if gone else UNCERTAIN + ep.late_reasons = [ + f"since the first check: the confirmed record is gone (HTTP {gone[1]})" + if gone + else f"the confirmed record can't be read again: {exc}" + ] + return + moved: list[str] = [] + if not isinstance(now, dict) or not is_person(contract, now, ep.params): + moved.append("the confirmed record is no longer the person") + else: + wrong = wrong_fields(contract, now, ep.params) + if wrong: + moved.append( + "the confirmed record now holds other values: " + ", ".join(wrong) + ) + extra = extra_elements(contract, now, ep.params) if contract.closed else [] + if extra: + moved.append( + "the confirmed record now holds values the agent didn't send: " + + ", ".join(extra) + ) + ep.late_moved = bool(moved) + # Since the first check, the confirmed record is the one that was + # already there: the agent may write nothing more, and it must still + # be the only record that is the person. + since = Baseline(started=ep.recheck_from, matches={rid: now}) + r = verify_ensure(contract, ep.params, since, declared=declared) + reasons = list(moved) + with self._lock: + again = any(ref in o.refs for o in self._later(ep)) + if again and r.outcome != "found_existing": + reasons.append( + "the agent wrote to the confirmed record again after the check" + ) + if r.outcome != "found_existing": + n = int(r.evidence.get("agent_writes") or 0) + if n: + reasons.append( + f"the agent's credential wrote {n} resource(s) since the check " + "that no write through the shadow explains" + ) + reasons += list(r.reasons) + ep.late_reasons = [f"since the first check: {x}" for x in reasons] + # The record read directly outranks a change feed that can't be read. + if moved: + ep.late_verdict = REFUTED + elif r.evidence.get("unreadable"): + ep.late_verdict = UNCERTAIN + elif r.outcome != "found_existing": + ep.late_verdict = REFUTED + else: + ep.late_verdict = CONFIRMED + + def _check(self, ep: Episode) -> None: + statuses = [w.status for w in ep.writes] + ep.evidence["replies"] = statuses + if ep.kind == "none": + ep.verdict, ep.reasons = UNCERTAIN, [ep.baseline_note or "not checked"] + return + if ep.baseline_note: + ep.verdict, ep.reasons = UNCERTAIN, [ep.baseline_note] + return + assert ep.baseline is not None + try: + base = ep.baseline.result(timeout=0) + except Exception as exc: # noqa: BLE001 + ep.verdict = UNCERTAIN + ep.reasons = [f"the store couldn't be read before the write: {exc}"] + return + if ep.kind == "fhir": + self._check_fhir(ep, base, statuses) + else: + self._check_sql(ep, base) + + def _check_fhir(self, ep: Episode, base: Any, statuses: list[int]) -> None: + from openadapt_flow.ensure_record import ( + FhirReader, + Unreadable, + extra_elements, + extract, + same, + verify_ensure, + ) + + contract = ep.contract + with self._lock: + # Only episodes not yet checked: a record checked earlier that + # moves again counts in this window like any other change. + declared = [ + r + for o in self.episodes + if o is not ep and not o.checked + for r in o.refs + ] + # Where a recheck's window starts: after every write of this episode + # (whole seconds: an instant search is to the second), and no later + # than this check's own window closes. + time.sleep(1.1) + try: + ep.recheck_from = FhirReader(contract).server_time() + except Unreadable: + ep.recheck_from = None + result = verify_ensure(contract, ep.params, base, declared=declared) + ep.result, ep.base = result, base + self._notify(ep, result) + ev = result.evidence + ep.evidence["verifier"] = {"outcome": result.outcome, **ev} + landed = int(ev.get("agent_writes") or 0) + if result.outcome == "created_verified": + ep.verdict, ep.reasons = CONFIRMED, list(result.reasons) + if any(s // 100 != 2 for s in statuses): + ep.reasons.append( + f"the agent got an error reply ({', '.join(map(str, statuses))}) " + "but the write landed" + ) + elif result.outcome == "found_existing": + # A conditional create answered with the record already there. + ep.verdict, ep.reasons = CONFIRMED, list(result.reasons) + elif ev.get("unreadable"): + ep.verdict, ep.reasons = UNCERTAIN, list(result.reasons) + elif result.outcome == "needs_review" and landed == 0 and "agent_writes" in ev: + # Nothing of the agent's landed: never CONFIRMED (the write isn't + # there), never REFUTED (nothing landed wrong). + ep.verdict = UNCERTAIN + ep.reasons = [ + f"the reply was {', '.join(map(str, statuses)) or 'none'} and the " + "store shows no write by the agent" + ] + list(result.reasons) + else: + ep.verdict, ep.reasons = REFUTED, list(result.reasons) + # Evidence: what the agent sent, and what the store holds now. + reader = FhirReader(contract) + ep.evidence["before"] = sorted( + f"{contract.resource_type}/{i}" for i in base.matches + ) + stored: dict[str, Any] = {} + for ref in sorted(ep.refs): + try: + _, stored[ref] = reader.fetch(f"{reader.base_url}/{ref}") + except Unreadable as exc: + stored[ref] = {"unreadable": str(exc)} + ep.evidence["after"] = stored + fields = [] + for ref, res in stored.items(): + if not isinstance(res, dict) or "unreadable" in res: + continue + for name, rule in contract.fields.items(): + got = extract(res, rule.path) + sent = ep.params.get(name) + if sent is None and got is None: + continue + fields.append( + { + "record": ref, + "field": name, + "sent": sent, + "stored": got, + "same": name in ep.params + and same(contract, name, got, ep.params[name]), + } + ) + if contract.closed: + extra = extra_elements(contract, res, ep.params) + if extra: + fields.append( + { + "record": ref, + "field": "(not sent)", + "sent": None, + "stored": ", ".join(extra), + "same": False, + } + ) + ep.evidence["fields"] = fields + + def _check_sql(self, ep: Episode, pending: Any) -> None: + from openadapt_flow.verifier import verify_write + + result = verify_write(pending, seal=False) + ep.result = result + self._notify(ep, result) + ep.verdict = result.outcome.value + ep.reasons = list(result.reasons) + if result.provisional: + ep.reasons.append( + f"provisional: the contract's recheck is due at {result.recheck_due_at}; " + "shadow mode runs it then" + ) + ep.evidence["recheck_due_at"] = result.recheck_due_at + ep.evidence["verifier"] = { + "checked": result.checked, + "observed": result.observed, + "receipt_outcome": result.receipt_outcome, + "not_covered": list(result.scope.not_covered), + } + frame = (result.evidence or {}).get("frame") or {} + if isinstance(frame, dict): + ep.evidence["frame"] = { + k: frame[k] for k in ("database", "violations", "moved") if k in frame + } + delta = (result.evidence or {}).get("delta") + if delta is not None: + ep.evidence["delta"] = delta + + def _notify(self, ep: Episode, result: Any) -> None: + if self.on_checked is None: + return + try: + self.on_checked(ep, result) + except Exception as exc: # noqa: BLE001 - a hook never changes a verdict + self._note_error(f"on_checked: {exc!r}") + + def _note_error(self, text: str) -> None: + with self._lock: + self.errors.append(text[:2000]) + + # -- results ----------------------------------------------------------------------- + + def results(self) -> dict[str, Any]: + from openadapt_flow.shadow_report import summarize + + with self._lock: + return summarize(self) diff --git a/packages/flow/openadapt_flow/shadow_report.py b/packages/flow/openadapt_flow/shadow_report.py new file mode 100644 index 0000000000..c230746e58 --- /dev/null +++ b/packages/flow/openadapt_flow/shadow_report.py @@ -0,0 +1,328 @@ +"""Shadow mode's report: ``report.json`` and a ``report.html`` a person reads +in two minutes. It holds the values of the writes it describes.""" + +from __future__ import annotations + +import html +import json +import re +import statistics +import time +from pathlib import Path +from typing import Any + +SCHEMA = "openadapt.shadow-report/v1" +ORDER = ("REFUTED", "UNCERTAIN", "CONFIRMED") + + +def _ms(values: list[float]) -> dict[str, float]: + if not values: + return {"median": 0.0, "max": 0.0} + return {"median": round(statistics.median(values), 1), "max": round(max(values), 1)} + + +#: How a REFUTED write landed wrong, from the verifier's reasons: the first +#: pattern that matches, most specific first. +KINDS = ( + (r"someone else changed", "changed by someone else"), + ( + r"version in between was not the person", + "saved as another record first, then corrected", + ), + (r"created ([2-9]|\d{2,}) \S+ records, not one", "saved more than once"), + (r"other record\(s\) are now also the person", "a duplicate of the record exists"), + (r"observed conflicting, ([2-9]|\d{2,}) of 1 ", "saved more than once"), + (r"observed absent", "not saved as sent (a value differs, or nothing landed)"), + (r"wrong or missing", "a value differs from what the agent sent"), + (r"not given by the task", "holds a value the agent didn't send"), + (r"other resource|outside the declared write", "another record changed"), + (r"after creating it", "changed after it was created"), +) + + +def kind_of(reasons: list[str], *, late: bool = False) -> str: + if late: + return "changed after the check" + text = " ".join(reasons) + for pattern, kind in KINDS: + if re.search(pattern, text): + return kind + return "other (see the reasons)" + + +def _late(ep: Any) -> dict[str, Any] | None: + if ep.late_verdict: + return {"verdict": ep.late_verdict, "reasons": list(ep.late_reasons)} + if ep.recheck_at: + due = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(ep.recheck_at)) + return {"verdict": "PENDING", "reasons": [f"recheck due at {due}, not run"]} + return None + + +def _final(verdict: str, late: dict[str, Any] | None) -> str: + """A recheck that doesn't confirm overrides the first CONFIRMED.""" + + if verdict == "CONFIRMED" and late and late["verdict"] in ("REFUTED", "UNCERTAIN"): + return str(late["verdict"]) + return verdict + + +def summarize(shadow: Any) -> dict[str, Any]: + checks = [] + for ep in shadow.episodes: + checks.append( + { + "id": ep.id, + "kind": ep.kind, + "name": ep.name, + "verdict": ep.verdict or "PENDING", + "reasons": list(ep.reasons), + "sent": dict(ep.params), + "records": sorted(ep.refs), + "writes": [ + { + "seq": w.seq, + "method": w.method, + "path": w.path, + "status": w.status, + "held_ms": round(w.held_ms, 1), + "proxy_ms": round(w.proxy_ms, 1), + "error": w.error, + } + for w in ep.writes + ], + "evidence": ep.evidence, + "late": _late(ep), + } + ) + checks[-1]["final"] = _final(checks[-1]["verdict"], checks[-1]["late"]) + # Counted by the final verdict: a recheck that doesn't confirm moves a + # write out of CONFIRMED. + counts = {v: sum(1 for c in checks if c["final"] == v) for v in (*ORDER, "PENDING")} + kinds: dict[str, int] = {} + for c in checks: + if c["final"] == "REFUTED": + k = kind_of(c["reasons"], late=c["verdict"] != "REFUTED") + kinds[k] = kinds.get(k, 0) + 1 + held = [w.held_ms for w in shadow.writes] + added = [w.held_ms + w.proxy_ms for w in shadow.writes] + first = min((w.started for w in shadow.writes), default=None) + return { + "schema": SCHEMA, + "mode": shadow.mode, + "upstream": f"{shadow.upstream.scheme}://{shadow.upstream.netloc}", + "started": shadow.started, + "first_write_after_s": None + if first is None + else round(first - shadow.started, 1), + "writes_seen": len(shadow.writes), + "checks": len(checks), + "counts": counts, + "late_refuted": sum( + 1 for c in checks if (c["late"] or {}).get("verdict") == "REFUTED" + ), + "late_uncertain": sum( + 1 for c in checks if (c["late"] or {}).get("verdict") == "UNCERTAIN" + ), + "rechecks_pending": sum( + 1 for c in checks if (c["late"] or {}).get("verdict") == "PENDING" + ), + "refuted_by_kind": dict(sorted(kinds.items(), key=lambda kv: -kv[1])), + "overhead_ms": {"held_for_baseline": _ms(held), "added_total": _ms(added)}, + "errors": list(shadow.errors), + "items": sorted(checks, key=lambda c: (ORDER + ("PENDING",)).index(c["final"])), + } + + +def _value(v: Any) -> str: + if v is None: + return "none" + if isinstance(v, (dict, list)): + v = json.dumps(v, sort_keys=True, default=str) + return html.escape(str(v)) + + +CSS = """ +:root{--bg:#fff;--fg:#1b1f24;--mute:#59636e;--line:#d1d9e0;--bad:#b42318;--warn:#9a6700;--ok:#1a7f37} +@media (prefers-color-scheme:dark){:root{--bg:#0d1117;--fg:#e6edf3;--mute:#9198a1;--line:#3d444d;--bad:#f85149;--warn:#d29922;--ok:#3fb950}} +body{background:var(--bg);color:var(--fg);font:15px/1.5 system-ui,sans-serif;max-width:960px;margin:24px auto;padding:0 16px} +h1{font-size:22px}h2{font-size:18px;margin-top:28px}.mute{color:var(--mute)} +.tiles{display:flex;gap:12px;flex-wrap:wrap}.tile{border:1px solid var(--line);border-radius:8px;padding:10px 14px;min-width:120px} +.tile b{display:block;font-size:26px}.REFUTED{color:var(--bad)}.UNCERTAIN{color:var(--warn)}.CONFIRMED{color:var(--ok)} +table{border-collapse:collapse;width:100%;margin:8px 0}td,th{border-bottom:1px solid var(--line);padding:4px 8px;text-align:left;vertical-align:top;overflow-wrap:anywhere} +.item{border:1px solid var(--line);border-radius:8px;padding:10px 14px;margin:12px 0}.diff{color:var(--bad);font-weight:600} +details{margin-top:6px}pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px} +""" + + +def _item(c: dict[str, Any]) -> str: + ev = c.get("evidence") or {} + writes = "".join( + f"{w['method']}{html.escape(w['path'])}{w['status']}" + f"{w['held_ms'] + w['proxy_ms']:.0f} ms" + for w in c["writes"] + ) + fields = ev.get("fields") or [] + differ = [f for f in fields if not f["same"]] + rows = "".join( + f"{html.escape(f['record'])}" + f"{html.escape(f['field'])}{_value(f['sent'])}" + f"{_value(f['stored'])}" + for f in differ + ) + if fields: + rows += ( + f"{len(fields) - len(differ)} other " + "fields hold what the agent sent (all fields are under Evidence)" + ) + if not rows and c["sent"]: + rows = "".join( + f"{html.escape(k)}{_value(v)}" + for k, v in c["sent"].items() + ) + reasons = "".join(f"
  • {html.escape(r)}
  • " for r in c["reasons"]) + late = c.get("late") or {} + if late: + reasons += ( + f"
  • Checked first: {c['verdict']}; " + f"checked again: {late['verdict']}" + + "".join(f"; {html.escape(r)}" for r in late["reasons"]) + + "
  • " + ) + before = ", ".join(ev.get("before") or []) or "none" + return ( + f"
    {c['final']} " + f"{html.escape(c['name'])} check {c['id']}, " + f"records: {html.escape(', '.join(c['records']) or 'none')}" + f"
      {reasons}
    " + + ( + "" + f"{rows}
    RecordFieldAgent sentStore holds now
    " + if rows + else "" + ) + + ( + f"

    Before the write, matching records: {html.escape(before)}

    " + if c["kind"] == "fhir" + else "" + ) + + f"{writes}
    WritePathReplyAdded
    " + + "
    Evidence
    "
    +        + html.escape(json.dumps(ev, indent=1, sort_keys=True, default=str)[:20000])
    +        + "
    " + ) + + +def render_html(doc: dict[str, Any], setup: dict[str, Any] | None = None) -> str: + n = doc["counts"] + pending = doc.get("rechecks_pending") or 0 + tiles = "".join( + f"
    {n[v]}{v.title()}" + + ( + f"
    {pending} not yet rechecked" + if v == "CONFIRMED" and pending + else "" + ) + + "
    " + for v in (*ORDER, "PENDING") + if v != "PENDING" or n[v] + ) + oh = doc["overhead_ms"]["added_total"] + recheck_note = ", ".join( + f"{doc[k]} {label}" + for k, label in ( + ("late_refuted", "refuted"), + ("late_uncertain", "couldn't be confirmed"), + ("rechecks_pending", "not yet run"), + ) + if doc.get(k) + ) + sections = [] + late = [ + c for c in doc["items"] if c["final"] == "REFUTED" and c["verdict"] != "REFUTED" + ] + if late: + sections.append( + f"

    Landed wrong after the check ({len(late)})

    " + "

    Confirmed at first, then refuted when checked again: " + "something changed after the write.

    " + "".join(map(_item, late)) + ) + for v, title in ( + ("REFUTED", "Landed wrong"), + ("UNCERTAIN", "Couldn't be confirmed"), + ("PENDING", "Never checked (the shadow failed; see its errors)"), + ): + items = [c for c in doc["items"] if c["final"] == v and c not in late] + if items: + sections.append( + f"

    {title} ({len(items)})

    " + "".join(map(_item, items)) + ) + ok = [c for c in doc["items"] if c["final"] == "CONFIRMED"] + if ok: + sections.append( + f"

    Confirmed ({len(ok)})

    Show" + + "".join(map(_item, ok)) + + "
    " + ) + setup_html = "" + if setup: + decisions = "".join( + f"
  • {html.escape(str(d))}
  • " for d in setup.get("decisions", []) + ) + setup_html = ( + f"

    Setup

    {html.escape(str(setup.get('minutes', '?')))} minutes " + f"to the first checked write, {len(setup.get('decisions', []))} decisions:

    " + f"
      {decisions}
    " + ) + errors = "" + if doc["errors"]: + errors = ( + "

    Shadow errors

    "
    +            + html.escape("\n".join(doc["errors"]))
    +            + "
    " + ) + return ( + "" + "" + f"Shadow report" + "

    Shadow report

    " + f"

    {doc['mode'].upper()} writes to {html.escape(doc['upstream'])}. " + "Each write was checked against the system of record. The shadow sent " + "each one on as the agent sent it and blocked none.

    " + f"

    {doc['writes_seen']} writes seen, in {doc['checks']} checks " + "(a record's create, retries and corrections are one check).

    " + f"
    {tiles}
    " + + ( + f"

    Rechecks of confirmed writes: {html.escape(recheck_note)}.

    " + if recheck_note + else "" + ) + + ( + "

    How they landed wrong:

      " + + "".join( + f"
    • {html.escape(k)}: {v}
    • " + for k, v in (doc.get("refuted_by_kind") or {}).items() + ) + + "
    " + if doc.get("refuted_by_kind") + else "" + ) + + f"

    Added latency per write: median {oh['median']} ms, " + f"largest {oh['max']} ms.

    " + + "".join(sections) + + setup_html + + errors + + "" + ) + + +def write_report( + doc: dict[str, Any], out: Path, setup: dict[str, Any] | None = None +) -> Path: + out.mkdir(parents=True, exist_ok=True) + if setup: + doc = {**doc, "setup": setup} + (out / "report.json").write_text(json.dumps(doc, indent=2, default=str) + "\n") + page = out / "report.html" + page.write_text(render_html(doc, setup)) + return page diff --git a/packages/flow/public-artifacts.json b/packages/flow/public-artifacts.json index 023180f5a1..9e433c47fe 100644 --- a/packages/flow/public-artifacts.json +++ b/packages/flow/public-artifacts.json @@ -198,6 +198,16 @@ "benchmark/fhir_medplum/public/results/corrections/main/scripted-fix/results.json", "benchmark/fhir_medplum/public/results/corrections/main/scripted/results.json", "benchmark/fhir_medplum/public/results/scripted/results.json", + "benchmark/fhir_medplum/public/results/shadow/claude/shadow-run.json", + "benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.html", + "benchmark/fhir_medplum/public/results/shadow/claude/shadow/report.json", + "benchmark/fhir_medplum/public/results/shadow/scripted/shadow-run.json", + "benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.html", + "benchmark/fhir_medplum/public/results/shadow/scripted/shadow/report.json", + "benchmark/fhir_medplum/public/results/shadow/setup/report/report.html", + "benchmark/fhir_medplum/public/results/shadow/setup/report/report.json", + "benchmark/fhir_medplum/public/results/shadow/setup/setup-timing.json", + "benchmark/fhir_medplum/public/results/shadow/setup/vendor/shadow.yaml", "benchmark/fhir_medplum/readpath/ensure_patient.yaml", "benchmark/fhir_medplum/readpath/generated/channel.json", "benchmark/fhir_medplum/readpath/generated/channels.json", diff --git a/packages/flow/tests/test_shadow.py b/packages/flow/tests/test_shadow.py new file mode 100644 index 0000000000..2c4bff6923 --- /dev/null +++ b/packages/flow/tests/test_shadow.py @@ -0,0 +1,349 @@ +"""Shadow mode: a pass-through proxy that checks each write and never blocks. + +An HTTP app writes to SQLite behind the shadow; the app can break a write +the way a tool does. The real verifier (whole-database frame) judges it. +Records are made up. +""" + +from __future__ import annotations + +import http.client +import json +import sqlite3 +import threading +import time +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from typing import Any + +import pytest + +from openadapt_flow import shadow as shadow_mod +from openadapt_flow.shadow import Route, Shadow +from openadapt_flow.shadow_report import render_html, write_report +from openadapt_flow.verifier import Contract + + +@pytest.fixture(autouse=True) +def _homes(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("OPENADAPT_LEDGER_DIR", str(tmp_path / "ledger")) + monkeypatch.setenv("OPENADAPT_SEAL_HOME", str(tmp_path / "seal")) + + +class App: + """A small app: POST /api/patients saves a row; ``fault`` breaks it.""" + + def __init__(self, db: Path) -> None: + self.db = db + self.fault = "" + self.received: list[bytes] = [] + app = self + + class H(BaseHTTPRequestHandler): + def log_message(self, *_: Any) -> None: + pass + + def do_GET(self) -> None: + self._reply(200, b'{"ok": true}') + + def do_POST(self) -> None: + body = self.rfile.read(int(self.headers["Content-Length"])) + app.received.append(body) + doc = json.loads(body) + con = sqlite3.connect(app.db) + fname = "Eda" if app.fault == "wrong_value" else doc["first"] + row = (fname, doc["last"], doc["email"]) + con.execute( + "INSERT INTO patient (fname, lname, email) VALUES (?,?,?)", row + ) + if app.fault == "duplicate": + con.execute( + "INSERT INTO patient (fname, lname, email) VALUES (?,?,?)", row + ) + if app.fault == "side_write": + con.execute("UPDATE patient SET phone='0' WHERE id=1") + con.commit() + con.close() + self._reply(201, b'{"saved": true}', extra=("X-App", "yes")) + + def _reply(self, code: int, body: bytes, extra: tuple = ()) -> None: + self.send_response(code) + self.send_header("Content-Type", "application/json") + if extra: + self.send_header(*extra) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + self.server = ThreadingHTTPServer(("127.0.0.1", 0), H) + threading.Thread(target=self.server.serve_forever, daemon=True).start() + self.url = f"http://127.0.0.1:{self.server.server_address[1]}" + + +def _db(tmp_path: Path) -> Path: + db = tmp_path / "app.sqlite" + con = sqlite3.connect(db) + con.executescript( + "CREATE TABLE patient (id INTEGER PRIMARY KEY, fname TEXT, lname TEXT, " + "email TEXT, phone TEXT);" + "INSERT INTO patient VALUES (1, 'Wendell', 'Prior', 'w@example.test', '1');" + ) + con.commit() + con.close() + return db + + +def _contract(db: Path) -> Contract: + return Contract.from_dict( + { + "schema_version": "openadapt.verify/v1", + "verifier": { + "kind": "sql", + "sqlite_database": str(db), + "sql_query": "SELECT * FROM patient", + }, + "record": { + "name": "patient", + "match": ["email", "lname"], + "fields": {"fname": "fname", "lname": "lname", "email": "email"}, + }, + "frame": { + "identity_field": "id", + "database": { + "dialect": "sqlite", + "read": {"sqlite_database": str(db)}, + "views": {"patient": ""}, + "new_row_fields": {"patient": ["id", "phone"]}, + }, + }, + } + ) + + +BODY = {"first": "Ada", "last": "Quill", "email": "ada@example.test"} + + +def _shadow(tmp_path: Path, app: App, db: Path, **kw: Any) -> Shadow: + route = Route( + __import__("re").compile(r"POST /api/patients"), + _contract(db), + {"fname": "first", "lname": "last", "email": "email"}, + "patient", + ) + return Shadow( + upstream=app.url, + mode="sql", + routes=[route], + out=tmp_path / "out", + quiet_s=60, + **kw, + ).start() + + +def _post(url: str, body: Any, path: str = "/api/patients") -> tuple[int, dict, bytes]: + host, port = url.split("//")[1].split(":") + conn = http.client.HTTPConnection(host, int(port), timeout=30) + raw = body if isinstance(body, bytes) else json.dumps(body).encode() + conn.request("POST", path, body=raw, headers={"Content-Type": "application/json"}) + resp = conn.getresponse() + out = resp.status, dict(resp.getheaders()), resp.read() + conn.close() + return out + + +def _run(tmp_path: Path, fault: str = "") -> tuple[dict[str, Any], App, Shadow]: + db = _db(tmp_path) + app = App(db) + app.fault = fault + sh = _shadow(tmp_path, app, db) + status, headers, body = _post(sh.url, BODY) + assert status == 201 and body == b'{"saved": true}' and headers["X-App"] == "yes" + sh.stop() + return sh.results(), app, sh + + +def test_a_correct_write_is_confirmed_and_passes_through_unchanged( + tmp_path: Path, +) -> None: + doc, app, _ = _run(tmp_path) + assert doc["counts"]["CONFIRMED"] == 1 and doc["writes_seen"] == 1 + assert app.received == [json.dumps(BODY).encode()] + (item,) = doc["items"] + assert item["sent"] == { + "fname": "Ada", + "lname": "Quill", + "email": "ada@example.test", + } + + +@pytest.mark.parametrize("fault", ["wrong_value", "duplicate", "side_write"]) +def test_a_broken_write_is_refuted_and_still_goes_through( + tmp_path: Path, fault: str +) -> None: + doc, app, _ = _run(tmp_path, fault) + assert doc["counts"]["REFUTED"] == 1, doc["items"][0]["reasons"] + assert len(app.received) == 1 # the shadow added no write + page = render_html(doc) + assert "Landed wrong (1)" in page + + +def test_an_unreadable_store_is_uncertain_and_the_write_goes_on(tmp_path: Path) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db) + sh.routes[0].contract.config.verifier.sqlite_database = str(tmp_path / "gone" / "x") + sh.routes[0].contract.config.frame.database.read["sqlite_database"] = str( + tmp_path / "gone" / "x" + ) + assert _post(sh.url, BODY)[0] == 201 + sh.stop() + doc = sh.results() + assert doc["counts"] == {"REFUTED": 0, "UNCERTAIN": 1, "CONFIRMED": 0, "PENDING": 0} + assert len(app.received) == 1 + + +def test_a_slow_baseline_holds_the_write_no_longer_than_hold_ms( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db, hold_ms=200) + real = sh._sql_baseline + + def slow(*a: Any) -> Any: + time.sleep(1.5) + return real(*a) + + monkeypatch.setattr(sh, "_sql_baseline", slow) + t0 = time.perf_counter() + assert _post(sh.url, BODY)[0] == 201 + assert time.perf_counter() - t0 < 1.0 + sh.stop() + doc = sh.results() + assert doc["counts"]["UNCERTAIN"] == 1 + assert "wasn't read within 200 ms" in doc["items"][0]["reasons"][0] + + +def test_a_write_with_no_route_is_uncertain_not_hidden(tmp_path: Path) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db) + assert _post(sh.url, BODY, path="/api/other")[0] == 201 + sh.stop() + doc = sh.results() + assert doc["counts"]["UNCERTAIN"] == 1 + assert doc["items"][0]["reasons"] == ["no route matches this write"] + + +def test_a_shadow_failure_never_stops_the_write( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db) + + def boom(*_: Any) -> Any: + raise RuntimeError("shadow bug") + + monkeypatch.setattr(sh, "_observe", boom) + assert _post(sh.url, BODY)[0] == 201 + sh.stop() + assert len(app.received) == 1 and sh.errors + + +def test_reads_pass_through_and_the_report_is_written(tmp_path: Path) -> None: + doc, app, sh = _run(tmp_path) + page = write_report(doc, tmp_path / "rep", setup={"minutes": 3, "decisions": ["a"]}) + assert json.loads((tmp_path / "rep" / "report.json").read_text())["counts"] + assert "1 decisions" in page.read_text() or "decisions" in page.read_text() + + +def test_the_shadow_listens_on_loopback_only(tmp_path: Path) -> None: + with pytest.raises(shadow_mod.ShadowConfigError): + Shadow( + upstream="http://x", + mode="sql", + routes=[object()], + out=tmp_path, + listen=("0.0.0.0", 0), + ) + + +def test_a_write_the_route_doesnt_fit_is_uncertain_not_refuted(tmp_path: Path) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db) + sh.routes[0].params["lname"] = "surname" # a key this write doesn't send + assert _post(sh.url, BODY)[0] == 201 + sh.stop() + (item,) = sh.results()["items"] + assert item["verdict"] == "UNCERTAIN" and len(app.received) == 1 + assert "doesn't give lname (at surname)" in item["reasons"][0] + + +def test_a_late_write_after_a_sql_confirmation_is_refuted_on_the_recheck( + tmp_path: Path, +) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db) + sh.routes[0].contract.config.frame.database.recheck_after_s = 1 + assert _post(sh.url, BODY)[0] == 201 + sh.flush() + (ep,) = sh.episodes + assert ep.verdict == "CONFIRMED" and ep.recheck_at + con = sqlite3.connect(db) # a background job, a second later + con.execute("UPDATE patient SET phone='9' WHERE id=1") + con.commit() + con.close() + sh.run_rechecks(now=True) + sh.stop() + assert ep.late_verdict == "REFUTED" and sh.results()["late_refuted"] == 1 + + +def test_a_pinned_value_binds_without_the_body(tmp_path: Path) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db) + sh.routes[0].params["lname"] = {"literal": "Quill"} + assert ( + _post(sh.url, {"first": "Ada", "last": "Quill", "email": "ada@example.test"})[0] + == 201 + ) + sh.stop() + (item,) = sh.results()["items"] + assert item["verdict"] == "CONFIRMED" and item["sent"]["lname"] == "Quill" + + +def test_a_later_write_under_no_route_makes_a_late_refutation_uncertain( + tmp_path: Path, +) -> None: + db = _db(tmp_path) + app = App(db) + sh = _shadow(tmp_path, app, db) + sh.routes[0].contract.config.frame.database.recheck_after_s = 1 + assert _post(sh.url, BODY)[0] == 201 + sh.flush() + # The agent's next write goes to a path no route checks; it moves the db. + app.fault = "side_write" + assert _post(sh.url, {**BODY, "email": "z@example.test"}, "/api/other")[0] == 201 + sh.flush() + sh.run_rechecks(now=True) + sh.stop() + ep = sh.episodes[0] + assert ep.late_verdict == "UNCERTAIN", ep.late_reasons + assert "can't tell apart" in ep.late_reasons[0] + + +def test_a_sql_recheck_that_cant_be_scheduled_says_so(tmp_path: Path) -> None: + db = _db(tmp_path) + sh = _shadow(tmp_path, App(db), db) + + class Odd: + recheck_due_at = "not a time" + + ep = shadow_mod.Episode(id=1, kind="sql", name="x", verdict="CONFIRMED") + ep.result = Odd() + sh._schedule_recheck(ep) + sh.stop() + assert ep.late_verdict == "UNCERTAIN" and "can't be read" in ep.late_reasons[0] diff --git a/packages/flow/tests/test_shadow_fhir.py b/packages/flow/tests/test_shadow_fhir.py new file mode 100644 index 0000000000..36077a0dac --- /dev/null +++ b/packages/flow/tests/test_shadow_fhir.py @@ -0,0 +1,392 @@ +"""Shadow mode's FHIR path: grouping writes into episodes, what each check is +told, and how the verifier's outcome becomes a verdict. + +The verifier (``ensure_record``) is stubbed here: its own tests cover it, +and the live Medplum run (``benchmark/fhir_medplum/public/shadow_run.py``) +covers the two together. Records are made up. +""" + +from __future__ import annotations + +import http.client +import json +import threading +from datetime import datetime, timezone +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from typing import Any + +import pytest + +from openadapt_flow import ensure_record +from openadapt_flow.ensure_record import Baseline, EnsureResult, load_contract +from openadapt_flow.shadow import Shadow +from openadapt_flow.shadow_report import render_html + +CONTRACT = ( + Path(__file__).resolve().parents[1] + / "benchmark/fhir_medplum/public/contracts/allergy.yaml" +) + + +class Fhir: + """Answers each write with ``status`` and a new id; records what came in.""" + + def __init__(self) -> None: + self.status = 201 + self.received: list[tuple[str, str, bytes]] = [] + self.on_write: Any = None + fx = self + + class H(BaseHTTPRequestHandler): + def log_message(self, *_: Any) -> None: + pass + + def _do(self) -> None: + n = int(self.headers.get("Content-Length") or 0) + body = self.rfile.read(n) if n else b"" + fx.received.append((self.command, self.path, body)) + if fx.on_write: + fx.on_write() + rid = f"a{len(fx.received)}" + out = json.dumps({"resourceType": "AllergyIntolerance", "id": rid}) + self.send_response(fx.status) + self.send_header("Content-Type", "application/fhir+json") + self.send_header("Content-Length", str(len(out))) + self.end_headers() + self.wfile.write(out.encode()) + + do_POST = do_PUT = do_DELETE = do_GET = _do + + self.server = ThreadingHTTPServer(("127.0.0.1", 0), H) + threading.Thread(target=self.server.serve_forever, daemon=True).start() + self.url = f"http://127.0.0.1:{self.server.server_address[1]}" + + +def _allergy(patient: str, code: str = "91936005") -> dict[str, Any]: + return { + "resourceType": "AllergyIntolerance", + "patient": {"reference": patient}, + "code": {"coding": [{"system": "http://snomed.info/sct", "code": code}]}, + "criticality": "high", + } + + +@pytest.fixture +def env(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> dict[str, Any]: + monkeypatch.setenv("BENCH_FHIR_URL", "http://127.0.0.1:9/fhir/R4") + monkeypatch.setenv("BENCH_AGENT_REF", "Practitioner/bot") + monkeypatch.setenv("BENCH_RECORD_TOKEN", "t") + calls: dict[str, Any] = {"verify": [], "outcome": "created_verified", "ev": {}} + + def baseline(contract: Any, params: Any, reader: Any = None) -> Baseline: + return Baseline(started=datetime.now(timezone.utc), matches={}) + + def verify(contract: Any, params: Any, base: Any, **kw: Any) -> EnsureResult: + calls["verify"].append({"params": dict(params), **kw}) + if calls.get("during"): + calls.pop("during")() + return EnsureResult(calls["outcome"], "a1", ["stub"], dict(calls["ev"])) + + monkeypatch.setattr(ensure_record, "capture_baseline", baseline) + monkeypatch.setattr(ensure_record, "verify_ensure", verify) + monkeypatch.setattr( + ensure_record.FhirReader, + "fetch", + lambda self, url, params=None: ({}, {"resourceType": "AllergyIntolerance"}), + ) + monkeypatch.setattr( + ensure_record.FhirReader, "server_time", lambda self: datetime.now(timezone.utc) + ) + fhir = Fhir() + sh = Shadow( + upstream=fhir.url, + mode="fhir", + contracts=[load_contract(CONTRACT)], + out=tmp_path / "out", + quiet_s=3600, + ).start() + yield {"sh": sh, "fhir": fhir, "calls": calls} + sh.stop() + + +def _send(sh: Shadow, method: str, path: str, body: Any = None) -> int: + conn = http.client.HTTPConnection("127.0.0.1", sh.server.server_address[1]) + raw = json.dumps(body).encode() if body is not None else None + conn.request(method, path, body=raw, headers={"Content-Type": "application/json"}) + status = conn.getresponse().status + conn.close() + return status + + +def test_a_retry_and_a_correction_are_one_check(env: dict[str, Any]) -> None: + sh = env["sh"] + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + fixed = {**_allergy("Patient/p1"), "criticality": "low", "id": "a1"} + _send(sh, "PUT", "/fhir/R4/AllergyIntolerance/a1", fixed) + sh.flush() + (ep,) = sh.episodes + assert len(ep.writes) == 3 and ep.verdict == "CONFIRMED" + # The check is told the agent's latest values: its correction. + assert env["calls"]["verify"][0]["params"]["criticality"] == "low" + + +def test_other_unchecked_episodes_are_declared_and_nothing_else( + env: dict[str, Any], +) -> None: + sh = env["sh"] + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p2")) + sh.flush() + first, second = env["calls"]["verify"] + assert first["declared"] == ["AllergyIntolerance/a2"] + # By the second check the first is checked: its record counts again. + assert second["declared"] == [] + + +def test_a_refused_write_with_nothing_landed_is_uncertain(env: dict[str, Any]) -> None: + env["fhir"].status = 422 + env["calls"]["outcome"] = "needs_review" + env["calls"]["ev"] = {"agent_writes": 0} + _send(env["sh"], "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + env["sh"].flush() + assert env["sh"].episodes[0].verdict == "UNCERTAIN" + + +def test_a_write_during_a_check_makes_it_uncertain(env: dict[str, Any]) -> None: + sh = env["sh"] + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + env["calls"]["during"] = lambda: _send( + sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p9") + ) + sh.flush() + assert sh.episodes[0].verdict == "UNCERTAIN" + assert "while this was checked" in sh.episodes[0].reasons[0] + + +def test_an_update_of_a_record_it_didnt_see_created_is_uncertain( + env: dict[str, Any], +) -> None: + sh = env["sh"] + _send(sh, "PUT", "/fhir/R4/AllergyIntolerance/x", _allergy("Patient/p1")) + _send(sh, "DELETE", "/fhir/R4/AllergyIntolerance/y") + _send(sh, "POST", "/fhir/R4/Observation", {"resourceType": "Observation"}) + sh.flush() + assert [e.verdict for e in sh.episodes] == ["UNCERTAIN"] * 3 + assert "AllergyIntolerance/y" in sh.episodes[1].refs + assert env["calls"]["verify"] == [] + + +def test_a_path_outside_ascii_still_goes_through(env: dict[str, Any]) -> None: + sh = env["sh"] + conn = http.client.HTTPConnection("127.0.0.1", sh.server.server_address[1]) + conn.putrequest("POST", "/fhir/R4/AllergyIntolerance?n=x") + conn.putheader("Content-Length", "2") + conn.endheaders(b"{}") + conn.getresponse().read() + # A raw byte in the target: the shadow percent-encodes it and sends it on. + raw = "POST /fhir/R4/Observation?n=\xe9 HTTP/1.1\r\nHost: x\r\nContent-Length: 2\r\n\r\n{}" + import socket + + with socket.create_connection(sh.server.server_address[:2]) as s: + s.sendall(raw.encode("latin-1")) + assert b" 201 " in s.recv(100).split(b"\r\n", 1)[0] + sh.flush() + paths = [p for _, p, _ in env["fhir"].received] + assert "/fhir/R4/Observation?n=%E9" in paths + assert all(e.verdict for e in sh.episodes) and not sh.errors + + +def test_a_confirmed_write_is_checked_again_and_a_late_change_refutes_it( + env: dict[str, Any], +) -> None: + sh = env["sh"] + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + sh.flush() + (ep,) = sh.episodes + assert ep.verdict == "CONFIRMED" and ep.recheck_at > 0 + assert sh.results()["rechecks_pending"] == 1 + # Later, a side write by the agent's credential lands outside the proxy. + env["calls"]["outcome"] = "needs_review" + env["calls"]["ev"] = {"agent_writes": 2} + sh.run_rechecks(now=True) + doc = sh.results() + assert ep.late_verdict == "REFUTED" and doc["late_refuted"] == 1 + assert "Landed wrong after the check (1)" in render_html(doc) + # The recheck is told every other write the agent sent, checked or not. + assert env["calls"]["verify"][-1]["declared"] == [] + assert ep.late_reasons[0].startswith("since the first check: ") + + +def _stored(patient: str) -> dict[str, Any]: + return {**_allergy(patient), "id": "a1"} + + +def test_the_recheck_refutes_a_confirmed_record_changed_to_another_patient( + env: dict[str, Any], monkeypatch: pytest.MonkeyPatch +) -> None: + sh = env["sh"] + stored = {"now": _stored("Patient/p1")} + monkeypatch.setattr( + ensure_record.FhirReader, + "fetch", + lambda self, url, params=None: ({}, stored["now"]), + ) + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + sh.flush() + (ep,) = sh.episodes + # Nothing moved: the recheck confirms. + env["calls"]["outcome"] = "found_existing" + sh.run_rechecks(now=True) + assert ep.late_verdict == "CONFIRMED", ep.late_reasons + # Moved to another patient: refuted, though no write of the agent's shows. + ep.late_verdict = "" + stored["now"] = _stored("Patient/p2") + sh.run_rechecks(now=True) + assert ep.late_verdict == "REFUTED" + assert "no longer the person" in ep.late_reasons[0] + assert sh.results()["counts"]["REFUTED"] == 1 # counted by the final verdict + + +def test_a_later_put_to_the_confirmed_record_is_not_excused( + env: dict[str, Any], +) -> None: + sh = env["sh"] + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + sh.flush() + _send(sh, "PUT", "/fhir/R4/AllergyIntolerance/a1", _allergy("Patient/p2")) + sh.flush() + sh.run_rechecks(now=True) + assert "AllergyIntolerance/a1" not in env["calls"]["verify"][-1]["declared"] + + +def test_a_write_during_a_recheck_makes_it_uncertain(env: dict[str, Any]) -> None: + sh = env["sh"] + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + sh.flush() + env["calls"]["outcome"] = "needs_review" + env["calls"]["ev"] = {"agent_writes": 1} + env["calls"]["during"] = lambda: _send( + sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p9") + ) + sh.run_rechecks(now=True) + assert sh.episodes[0].late_verdict == "UNCERTAIN" + assert "while this was rechecked" in sh.episodes[0].late_reasons[0] + + +def test_a_later_write_with_no_known_record_makes_a_late_refutation_uncertain( + env: dict[str, Any], monkeypatch: pytest.MonkeyPatch +) -> None: + sh = env["sh"] + _confirmed(env, monkeypatch) + env["fhir"].status = 504 # a later create whose reply is lost + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p2")) + env["calls"]["outcome"] = "needs_review" + env["calls"]["ev"] = {"agent_writes": 1} + sh.flush() + sh.run_rechecks(now=True) + assert sh.episodes[0].late_verdict == "UNCERTAIN" + assert "can't tell apart" in sh.episodes[0].late_reasons[0] + + +def test_a_recheck_that_cant_be_scheduled_says_so( + env: dict[str, Any], monkeypatch: pytest.MonkeyPatch +) -> None: + def no_clock(self: Any) -> Any: + raise ensure_record.Unreadable("no Date header") + + monkeypatch.setattr(ensure_record.FhirReader, "server_time", no_clock) + _send(env["sh"], "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + env["sh"].flush() + ep = env["sh"].episodes[0] + assert ep.verdict == "CONFIRMED" and ep.late_verdict == "UNCERTAIN" + assert env["sh"].results()["counts"]["UNCERTAIN"] == 1 + + +def test_kinds_name_how_a_write_landed_wrong() -> None: + from openadapt_flow.shadow_report import kind_of + + created_none = ["the agent created 0 Patient records, not one"] + assert kind_of(created_none + ["wrote 1 other resource(s)"]) == ( + "another record changed" + ) + assert kind_of(["the agent created 2 Patient records, not one"]) == ( + "saved more than once" + ) + assert kind_of(["1 other record(s) are now also the person"]) == ( + "a duplicate of the record exists" + ) + both = ["wrong or missing: phone", "someone else changed the created record"] + assert kind_of(both) == "changed by someone else" + sql_dupe = ["record_written was refuted: observed conflicting, 2 of 1 expected"] + assert kind_of(sql_dupe) == "saved more than once" + + +def _confirmed(env: dict[str, Any], monkeypatch: pytest.MonkeyPatch) -> dict: + stored = {"now": _stored("Patient/p1")} + + def fetch(self: Any, url: str, params: Any = None) -> Any: + if isinstance(stored["now"], Exception): + raise stored["now"] + return {}, stored["now"] + + monkeypatch.setattr(ensure_record.FhirReader, "fetch", fetch) + _send(env["sh"], "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p1")) + env["sh"].flush() + env["calls"]["outcome"] = "found_existing" + return stored + + +def test_a_value_added_to_a_closed_record_after_the_check_refutes( + env: dict[str, Any], monkeypatch: pytest.MonkeyPatch +) -> None: + stored = _confirmed(env, monkeypatch) + stored["now"] = {**_stored("Patient/p1"), "note": [{"text": "anaphylaxis"}]} + env["sh"].run_rechecks(now=True) + ep = env["sh"].episodes[0] + assert ep.late_verdict == "REFUTED" and "didn't send" in ep.late_reasons[0] + + +def test_a_moved_record_stays_refuted_beside_an_unknown_later_write( + env: dict[str, Any], monkeypatch: pytest.MonkeyPatch +) -> None: + stored = _confirmed(env, monkeypatch) + env["fhir"].status = 504 + _send(env["sh"], "POST", "/fhir/R4/Observation", {"resourceType": "Observation"}) + env["sh"].flush() + stored["now"] = _stored("Patient/p2") + env["calls"]["outcome"] = "needs_review" + env["calls"]["ev"] = {"unreadable": True} # and the change feed is flaky + env["sh"].run_rechecks(now=True) + assert env["sh"].episodes[0].late_verdict == "REFUTED" + + +def test_a_deleted_record_is_refuted_and_an_unreachable_one_uncertain( + env: dict[str, Any], monkeypatch: pytest.MonkeyPatch +) -> None: + stored = _confirmed(env, monkeypatch) + stored["now"] = ensure_record.Unreadable("GET x returned HTTP 404") + env["sh"].run_rechecks(now=True) + ep = env["sh"].episodes[0] + assert ep.late_verdict == "REFUTED" and "is gone (HTTP 404)" in ep.late_reasons[0] + ep.late_verdict = "" + stored["now"] = ensure_record.Unreadable("GET x returned HTTP 503") + env["sh"].run_rechecks(now=True) + assert ep.late_verdict == "UNCERTAIN" + + +def test_a_lost_retry_in_a_known_episode_makes_a_late_refutation_uncertain( + env: dict[str, Any], monkeypatch: pytest.MonkeyPatch +) -> None: + _confirmed(env, monkeypatch) + sh = env["sh"] + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p5")) + env["fhir"].status = 504 + _send(sh, "POST", "/fhir/R4/AllergyIntolerance", _allergy("Patient/p5")) + env["calls"]["outcome"] = "created_verified" + sh.flush() + env["calls"]["outcome"] = "needs_review" + env["calls"]["ev"] = {"agent_writes": 1} + sh.run_rechecks(now=True, only=[sh.episodes[0]]) + assert sh.episodes[0].late_verdict == "UNCERTAIN"