From 8738a4adcf1731a9ff937a6b8ca7604bcb50fed7 Mon Sep 17 00:00:00 2001 From: abrichr Date: Mon, 19 Oct 2026 11:16:32 -0400 Subject: [PATCH 1/2] ci(flow): commit artifact paths only; pin hashes at release public-artifacts.json pinned the SHA-256 of every public data/config file, so each pull request that edited claims.yaml, verification.json or a fixture rewrote the same hash rows, and parallel pull requests conflicted on them. The committed file is now the reviewed path list (schema 2). Pull requests and main still fail on any unlisted or missing artifact path, and every open-core path, signature and license check is unchanged. The release workflow runs --stamp-release-inventory on the exact commit it builds, which rewrites the list as schema 1 (path + SHA-256), and then validates the wheel and sdist with --validate-dist-dir. Archives that embed the unstamped list are refused. release-package.yml did not run the flow archive checks at all before this. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/release-package.yml | 12 + packages/flow/CONTRIBUTING.md | 19 +- packages/flow/public-artifacts.json | 8184 ++++------------- .../flow/scripts/check_release_consistency.py | 142 +- packages/flow/tests/repo_tree_guard.py | 5 +- packages/flow/tests/test_release_contract.py | 90 +- 6 files changed, 1868 insertions(+), 6584 deletions(-) diff --git a/.github/workflows/release-package.yml b/.github/workflows/release-package.yml index bf4ff02c55..3e3ea6a758 100644 --- a/.github/workflows/release-package.yml +++ b/.github/workflows/release-package.yml @@ -135,8 +135,20 @@ jobs: run: | set -euo pipefail python -m pip install 'build==1.6.1' 'twine==7.0.0' + if [ "$PACKAGE" = flow ]; then + # Flow commits a reviewed list of artifact paths, not their + # hashes, so parallel pull requests don't collide on hash rows. + # The hashes are pinned here, on the exact commit being built, + # and the archives must match them below. + (cd packages/flow && python scripts/check_release_consistency.py --stamp-release-inventory) + fi python -m build "packages/$PACKAGE" --outdir dist python -m twine check --strict dist/* + if [ "$PACKAGE" = flow ]; then + # Open-core, license and artifact-provenance boundary of the two + # files the publish job uploads. + (cd packages/flow && python scripts/check_release_consistency.py --validate-dist-dir ../../dist) + fi if [ "$PACKAGE" = capture ]; then # Capture's release contract: notes for this version, and archives # that carry only the public source boundary. diff --git a/packages/flow/CONTRIBUTING.md b/packages/flow/CONTRIBUTING.md index 938231d376..f451760f84 100644 --- a/packages/flow/CONTRIBUTING.md +++ b/packages/flow/CONTRIBUTING.md @@ -37,8 +37,8 @@ pytest -q # tests hooks in `tests/conftest.py` snapshot the tracked-file status before the first test and after the last one, and fail the run when a new entry appears, because a regenerated golden can be committed by accident and - `scripts/check_release_consistency.py` pins a reviewed SHA-256 inventory of - the public files. Write to `tmp_path` (copy a fixture bundle there first) + the release workflow pins the SHA-256 of every public artifact file. Write to + `tmp_path` (copy a fixture bundle there first) instead. The check reports any tracked file that changed during the run, so editing files yourself while a long suite runs also trips it — set `OPENADAPT_FLOW_ALLOW_DIRTY_TREE=1` for that case. @@ -60,10 +60,25 @@ claims checks: ```bash python scripts/check_release_consistency.py python scripts/validate_claims.py --check --structure-only +python scripts/check_release_consistency.py --stamp-release-inventory uv build --wheel --sdist python scripts/check_release_consistency.py --require-dist +git restore public-artifacts.json ``` +`public-artifacts.json` lists, by path, every file that can carry data, +evidence, static assets, models or configuration (`.json`, `.yaml`, `.png` and +the other suffixes it names). A pull request that adds, removes or renames such +a file runs `python scripts/check_release_consistency.py +--write-public-artifact-inventory` and commits the changed list; editing an +already-listed file needs no inventory change. The list deliberately carries no +hashes: hash rows changed with every edit to `claims.yaml` or a fixture, so +parallel pull requests conflicted on them. The bytes are pinned at release +instead. The release workflow runs `--stamp-release-inventory` on the exact +commit it builds, which rewrites the list with each file's SHA-256, and then +validates the wheel and sdist against it. The open-core path, signature and +license checks run unchanged on every pull request. + After that pull request merges, start the release from protected `main`: ```bash diff --git a/packages/flow/public-artifacts.json b/packages/flow/public-artifacts.json index 242a6c485c..cad16571bb 100644 --- a/packages/flow/public-artifacts.json +++ b/packages/flow/public-artifacts.json @@ -1,5 +1,5 @@ { - "schema_version": 1, + "schema_version": 2, "policy": { "artifact_suffixes": [ ".7z", @@ -56,6552 +56,1644 @@ "real_emr_datasets", "tuned_adversary_params" ], - "note": "Reviewed positive inventory of public data, evidence, static, model, and configuration assets. Validation never regenerates it." + "note": "Reviewed positive inventory of public data, evidence, static, model, and configuration assets. Validation never regenerates it. The release workflow stamps each file's SHA-256 into the copy it ships." }, "artifacts": [ - { - "path": ".github/ISSUE_TEMPLATE/bug_report.yml", - "sha256": "100b4d77af57ca9429de670630728f7593b115851bf1af8827ba8f15031f0fa8" - }, - { - "path": ".github/ISSUE_TEMPLATE/config.yml", - "sha256": "2ab6b1485954ee8873e101ad73e5b15fb7304a41218fbc9235effb31ac7ac44f" - }, - { - "path": ".github/ISSUE_TEMPLATE/feature_request.yml", - "sha256": "bb032fd5942477be558870dbf2c6615d258b6600ac2b389c5c4bf7c55b856da6" - }, - { - "path": ".github/actionlint.yaml", - "sha256": "f58f146d55a022c530f1dd35e5da6a2e9ea0cd5cbcac0e6b0e50995a8b45cf20" - }, - { - "path": ".github/dependabot.yml", - "sha256": "40a11fc00e1010db80d8788ee8c6125b51b14d642be018cddb761ea209f66095" - }, - { - "path": ".github/mypy-interop.ini", - "sha256": "f7ddf58faed4255cad6ea2c7902c04ad79073c15b5effba397a3be4e29931fad" - }, - { - "path": ".github/release-health.json", - "sha256": "afdbb8faf1ee43bdc451b06097dd690bac3d363be0efad1ecc69d6e50be1e054" - }, - { - "path": ".github/workflows/canvas-nodom-ladder.yml", - "sha256": "383ac2f646ca0e0d2beeb3c89fc9f7d4e4bbb5abab87e953b60997d5a2a7c1a8" - }, - { - "path": ".github/workflows/ci.yml", - "sha256": "fc0e1d56cc357bfd0f08ab2cd0d951e937c53cd39aae38542877a01003e5e4f3" - }, - { - "path": ".github/workflows/citrix-workspace-standin.yml", - "sha256": "b35f7f02ffcf42be4026fe261f337d285d7fe33c011621e883d85f69ab2d2b69" - }, - { - "path": ".github/workflows/docker-rdp-multiapp-vision.yml", - "sha256": "9d71d797722cc000091fcd8f5858c1c8f03da9b87aad16fb21dc23a8b1467c5a" - }, - { - "path": ".github/workflows/docker-rdp-vision-ladder.yml", - "sha256": "e87fae249d66ae6196f84d0bac8d8f3bdf9cb745bbb72a5852d7f64fb38f8e79" - }, - { - "path": ".github/workflows/paper.yml", - "sha256": "cc218be4f6b0553fd4a88efa03c85c6db86ab14d7ad6028449e69dfe7e68efed" - }, - { - "path": ".github/workflows/quickstart-lifecycle.yml", - "sha256": "c6c9b4402885281e6bdf81cf61eb067173211b912c6e399b5f9d9f5f92d8fda0" - }, - { - "path": ".github/workflows/release-health.yml", - "sha256": "36bbd52aeafa67f83512de6af5d0a608f20885d0c7826abe4e6fe3b772eb2b39" - }, - { - "path": ".github/workflows/release.yml", - "sha256": "ba50228701a5eb972baad75246439a3a7dc2ac71f95d503c01874fd08824c66e" - }, - { - "path": ".github/workflows/validate-claims.yml", - "sha256": "f28dc91b54d20e1beabe239ae5872a486c63460260e8e3287db6786ef29389b1" - }, - { - "path": ".pre-commit-config.yaml", - "sha256": "04943b58d3a224798940c2c2012dcecd4d0c781ba0111caa3aa46ec53aa444c9" - }, - { - "path": "benchmark/ap_invoice/results.json", - "sha256": "684a4c1c79b9b2bf309f601fa58716bab9794ea451da294d78b64bd0a83a1fb9" - }, - { - "path": "benchmark/appliance_validation/results.json", - "sha256": "fa577ba19af713317a914734bc621b78de48c24a90f5ef0b8a9e2ffd0ff040cb" - }, - { - "path": "benchmark/appliance_validation/results_identity_full.json", - "sha256": "9f48ef5292076c376a80571ef76a93fb118a40f4b7ab6ffb411f070bd4f13780" - }, - { - "path": "benchmark/appliance_validation/results_supplement.json", - "sha256": "d6594bf87583158de54935ae777eebbb6dc21f44636907921e79422ea5ddd59c" - }, - { - "path": "benchmark/canvas_ladder/results.json", - "sha256": "4502affb014de71e5c584e48cef5bc6a7631983e2517551d5ea9c20c8a0668e2" - }, - { - "path": "benchmark/citrix_ica_hdx/results.json", - "sha256": "8c394cbff9674b0048686f9438db26f3d1cfb5977c9aaa662b84e0ecc6c69ec7" - }, - { - "path": "benchmark/citrix_ica_hdx/status_manifest.json", - "sha256": "196154bedfeccfdbd398424382ea7c486933a71da97dcdfdc3fa0e9b772076b2" - }, - { - "path": "benchmark/citrix_workspace/results.json", - "sha256": "64d588f93bc4fcd5ade9962483aeb85d5facc6b764babddd0b90b750f59d4156" - }, - { - "path": "benchmark/comparison_artifact/comparison.html", - "sha256": "5e22e54dc92a053f1585468662b62f516a45c353c6b6c1a050d6742d47297d34" - }, - { - "path": "benchmark/comparison_artifact/comparison.json", - "sha256": "c5eb58d234ecbd5b03a687745fb6afeb53d0965459b0e42779942441b19dbbd6" - }, - { - "path": "benchmark/cosmetic_drift/results.json", - "sha256": "464b6b6f2ac5850b86f7abf469b301e778c97e36d69c2af94f43b0e137fee962" - }, - { - "path": "benchmark/dense_surface/dense_surface.json", - "sha256": "d4d76eba46ca5c25642248cdfb49743f32136cc2e011c8efda51e37610f6610c" - }, - { - "path": "benchmark/dense_surface/record_seed1.png", - "sha256": "ce02111eab9359fd0d41bc222161c5ccd9af7aa13b1a67f4755978266868991d" - }, - { - "path": "benchmark/dense_surface/replay_hi_res_arial_seed1.png", - "sha256": "148950c94e7405e77717178f314cec19ab3d5e5a3487f7e241ace9369972218f" - }, - { - "path": "benchmark/dense_surface/replay_native_arial_seed1.png", - "sha256": "4557ebbf12074bb0ede60fcefbc233d830364458337ad597b9d4845996102aa1" - }, - { - "path": "benchmark/dense_surface/replay_serif_drift_seed1.png", - "sha256": "39d09b7e63a1428b1be03c9819619a48be5436b7ff798570e58cfcef5b239979" - }, - { - "path": "benchmark/dense_surface/replay_small_dense_seed1.png", - "sha256": "6b06de7f71a0883c7e758b05de6c090ad0975fc684d35e3d21a53037c7ce8ac1" - }, - { - "path": "benchmark/desktop/outcomes.png", - "sha256": "3223ffecf56778707de1994ed8fef4fb2c164c2fe013b4995b28d5bc44a2f120" - }, - { - "path": "benchmark/desktop/results.json", - "sha256": "d5e03e53d75c353b90e9c4a8cc2e708f393f89cea6b72b200c65a9151f96d841" - }, - { - "path": "benchmark/dom/finals/perturbation_compiled_028.png", - "sha256": "248084888d64cd7c3364c691d2f6e70b92845b39b11b9a4f506873e6d92766d3" - }, - { - "path": "benchmark/dom/finals/perturbation_dom_named_028.png", - "sha256": "e0e0854fefa1795b188c5197f1b8749311d4eebde68006ab9bde379d5565d069" - }, - { - "path": "benchmark/dom/outcome_matrix.png", - "sha256": "416e6a8f0c90d6e374f07cb7d838826f0e75b66bd95eec4c8e3d415283f4313d" - }, - { - "path": "benchmark/dom/results.json", - "sha256": "e36766a16e5cf99729c8d9965b7e3aca2c32431043ac8c1114f9719ccfc29c0e" - }, - { - "path": "benchmark/effect_e2e/effect_e2e.png", - "sha256": "b34c88a60de38bf67252ff7de05db95a4b2ba0ae061d80b34299f8e2f39a2832" - }, - { - "path": "benchmark/effect_e2e/results.json", - "sha256": "35b577939f63f02580df283e478d6a729fd86bc4a4bb200bdcb0778ed4b773d0" - }, - { - "path": "benchmark/effect_readback/results.json", - "sha256": "f1cccdd85c1dafb8d8cf4c0c88095e583fcdd040920f5b636b2428c01adec41d" - }, - { - "path": "benchmark/effectbench/pyproject.toml", - "sha256": "8fc6b9efb34e49adeda88012423aaa3d7d12c0a8b26619975e359543179dca94" - }, - { - "path": "benchmark/effectbench/results/openadapt_reference.json", - "sha256": "220a37caa7f24552188524826f30e73966e800ce356ab9f196582e191d6cba78" - }, - { - "path": "benchmark/effectbench/results/reference.json", - "sha256": "6408e736c7e4750c4608b5731a055b89286488e91e3d85790650f89401442b6d" - }, - { - "path": "benchmark/effectbench/task_pack/manifest.json", - "sha256": "bafd28c75fc33bc35e7b68bf98786c780b7715051e3ba415e41c590c390680ce" - }, - { - "path": "benchmark/environments/environments.json", - "sha256": "2868f8472dbfad5c6faa6b02e0041f5c27e6c4b044953664262532c8a10d2b95" - }, - { - "path": "benchmark/environments/verification.json", - "sha256": "6af1d90e5c0f869414678597f1334a8da888ca741d8a66e83a9ae933927ca032" - }, - { - "path": "benchmark/fault_model/results.json", - "sha256": "0fb3d9a3dfd88a4d1051b4a1bbac98ce5543bb2bd3978b24f33bf6af670ffee8" - }, - { - "path": "benchmark/frappe_lending/apps.json", - "sha256": "22a889b9c1b2408c28455330d39e8f7bd17771a4b73d4fbbf8a90c5a08fd82ea" - }, - { - "path": "benchmark/frappe_lending/compose.yml", - "sha256": "268d93846c7e0037173d8bd381ab8df8ba31e465301f58b1aa8e3caf524e1c1f" - }, - { - "path": "benchmark/frappe_lending/environment.lock.json", - "sha256": "a09de4d9b279dc0ccf7ef30bca3d6f4276a87982d8bd96928892a0655a6fcdd5" - }, - { - "path": "benchmark/governed_run/results.json", - "sha256": "0f4f3968ac60d04b1542ee2c7e594e6a2c7a44b318d26defaf914281f3a1119e" - }, - { - "path": "benchmark/grounding_eval/results.json", - "sha256": "35ec9b680271300003a2830973492128ae3222570ec93500571665138f52398d" - }, - { - "path": "benchmark/grounding_eval/results_sweep.json", - "sha256": "580eef16facc7bb7fc9b225daabded6bb7344c2bf2e9aa070364a3c1215ed9b7" - }, - { - "path": "benchmark/harness2_scorer/evidence/base/results.json", - "sha256": "a562e33d7841e0baae976845522290d07c91419db89fcb6eb5f58925faa3e6c1" - }, - { - "path": "benchmark/harness2_scorer/evidence/harness2/results.json", - "sha256": "57d9e94ee6954f56628c3c93d3dc930f4fb48f09ba944e7719c95a4fd67b237a" - }, - { - "path": "benchmark/harness2_scorer/evidence/harness2_readback/results.json", - "sha256": "b6845f0eb488fc5db87100474fce16ecde4782c18f3e4f0cdca47bc55db22e42" - }, - { - "path": "benchmark/harness2_scorer/evidence/raw.tar.gz", - "sha256": "fb6f25ae9c58352183b5602fc4cbec375a38a348800cc1f8bd21e9a7251ec3f5" - }, - { - "path": "benchmark/harness2_scorer/evidence/summary.json", - "sha256": "e3a28f0d17c149abf689960792f7c88828bee4a09ce551a8ef34b667d75307a4" - }, - { - "path": "benchmark/hybrid/results.json", - "sha256": "cd4e736884b70d0f7723c7ece17bbfdd83d1553922ee576a374ff85114997984" - }, - { - "path": "benchmark/hybrid/success_cost.png", - "sha256": "93a4aac8b8013054712da9b1188102ed76879b5df84f0f52594d51e458c233c8" - }, - { - "path": "benchmark/identity_ladder/identity_ladder.json", - "sha256": "7df8820b7aae0201389175581a443d5fbf7bafd99ceb3afe93e91744ef3a6cd8" - }, - { - "path": "benchmark/known_ids/results.json", - "sha256": "d5375af0c4be169d0f8e10150541767fd239a268a6224cbc9d6710ed5c801818" - }, - { - "path": "benchmark/latency_cost.png", - "sha256": "2a336702a53fbc4a24c6eef5bfb8b7b093334b91c263010780fc48370376a569" - }, - { - "path": "benchmark/lending_fault_model/resolution_ladder_results.json", - "sha256": "91e9e16689f5314011ee4ebf4494a4a461c5320a5da66ec6ed6ea2dee1e98f54" - }, - { - "path": "benchmark/lending_fault_model/results.json", - "sha256": "d967b4046235effb61ae8d80d4085de00e33c95f411ed74527f7469f68f05328" - }, - { - "path": "benchmark/lending_fault_model/swer_results.json", - "sha256": "1dd7720a9a44bd5a453ea16fa8ac2f7050beceedf3a1f220312296cb3675bf09" - }, - { - "path": "benchmark/macos_native/ax_identity_20260720.adjudication.json", - "sha256": "4d0102f19fcf875877691e5aa18443d8b681e7a48f530f7c91e48cf09fd8f19b" - }, - { - "path": "benchmark/macos_native/ax_identity_20260720.json", - "sha256": "23848e0be694f97c0b749bf34f3aa6cb26fffe7a0ad5b29fc6ebe98e2dcb4f74" - }, - { - "path": "benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json", - "sha256": "c5a77c844c953b95cf24ca4af7074eb4fa65f89bc06b4b93af8cc21e9992eee8" - }, - { - "path": "benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.json", - "sha256": "19c62cd4b1a8ba55001925cc129af80d22cec94cf6d5c7d9f56c2b5d71c79075" - }, - { - "path": "benchmark/multiapp-standard.yaml", - "sha256": "ea619f8ef670812c80d805f9a8076a25990ed806f63966a60c0fc970d752d2b7" - }, - { - "path": "benchmark/o2c_recon/results.json", - "sha256": "a0a0a4d703a10d9e0c603b6bd6ef985691ae6de5cec853d9ea5c61fb1ac2fb00" - }, - { - "path": "benchmark/openemr/latency_cost.png", - "sha256": "293efcfbb707518e4da92ac44ffa19124193021903a8631eaa4709608dd98bc5" - }, - { - "path": "benchmark/openemr/results.json", - "sha256": "30de6dbb43ad0db4fd8b55737d765d06747b896ffae04522b6957d567dcfd89c" - }, - { - "path": "benchmark/openemr_api_tier/spike/api_bundle/compile_report.json", - "sha256": "9bea1fdb1e7caa3cd4e25d2dcf6c46bb82871a35aa18c4dbb471d2c4fb6321bc" - }, - { - "path": "benchmark/openemr_api_tier/spike/api_bundle/manifest.json", - "sha256": "a28c75e5b28720f1b2119b9dcd44541826796d79163e814f240ee71d6da2607a" - }, - { - "path": "benchmark/openemr_api_tier/spike/api_bundle/session_form.json", - "sha256": "81e1500db0c805f822328b17cf5e4d477bc2901aadf362770ffdb12828703ae5" - }, - { - "path": "benchmark/openemr_api_tier/spike/api_bundle/workflow.json", - "sha256": "173f37bee50d01fec4973caae617c34e230ea10e5973876dc672a4d6e11e5fb1" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/capture_r1.json", - "sha256": "52a786d4584c2af9605116f9dc10f20fb8997f106faaa5428e16d90beba080d5" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/figures.json", - "sha256": "2dfadb15def3d2d7f3c9389b7a922c4c0c1994f3c549ea5694481922147ae26f" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/har_summary.json", - "sha256": "a785fd26a6138b5093783309e1e7a03d6c1b9def30675e414003dedf4f0310b2" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/probes.json", - "sha256": "e2bc44a2cf1ec51a69019477c693691470dcf97e08c7cabaca8f3f803e4cd1a8" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs.csv", - "sha256": "88c8d45800c7c9842b5e92dd758976f3ef3bc0c719b15d87b27c22913f5a7165" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-api-1-r1-nadia-brennan.json", - "sha256": "c9998b75665e936d98781769a2836836e771565c14db96878595ecec283b4600" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-api-2-r2-marcus-feld.json", - "sha256": "ea84b9479f128d33c4fca08d8d46ad7cf6721eeed35aeb71b9d3b3eafc8920d9" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-api-3-r3-ines-carvalho.json", - "sha256": "d185a61b528446b9aa8a6588a713cf145cb77ed2468bd26b84fbc61a6aa93bb3" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-api-4-r4-theo-lindqvist.json", - "sha256": "16e0c93362d0f89a21fff39f7c973441e080ebf66be9388619df9305df6c5b74" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-browser-1-r1-nadia-brennan.json", - "sha256": "0bf1e8ac429d317db9cc606474f8eef1d43044b6bf6799ba731a9b5ce80d351f" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-browser-2-r2-marcus-feld.json", - "sha256": "0f0a28fae53cbb42badf23d462bef2540c24b0976e395d2698ee34ab9230bdb9" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-browser-3-r3-ines-carvalho.json", - "sha256": "e702a002fef6129387cd122f860d3ebc683ab587f40837067150d1ad3dd67bbc" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b01-browser-4-r4-theo-lindqvist.json", - "sha256": "ed9ea92b213923adca7ebf0aa1ef481de68f6e06ed3b9a60859a67b85db15221" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-api-1-r5-grace-adeyemi.json", - "sha256": "d571b617334c5c586daee4a7162e5b5c6ed4e0016aab16e495a67a09a735103a" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-api-2-r6-rosa-delgado.json", - "sha256": "88a8f14bad50acff47642b023c1251c825538d9495d0f026f6a78c2f98f919a9" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-api-3-r7-arlo-whitcombe.json", - "sha256": "3d0ace99acd9bea35431f5a28695b0331e36e273e713dc9f2893d9545a6dc03e" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-api-4-r8-priya-raman.json", - "sha256": "d013528e313b5fbf3f401bccfbc0eebc25c2d111389e20e468584654e67f18c2" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-browser-1-r5-grace-adeyemi.json", - "sha256": "034c2a95a36b48832525391240058efac23e9f9b332c18c9d1a73ab978ea4ae0" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-browser-2-r6-rosa-delgado.json", - "sha256": "9e6027e762f02d99ecf6d8441bfaedf9fa34144a1d11d96fcef0434c9fd5b0a2" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-browser-3-r7-arlo-whitcombe.json", - "sha256": "f55527b0987042045df25ed0300b63a99cbc96e0852715884d6d13f4848e9ee6" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b02-browser-4-r8-priya-raman.json", - "sha256": "d2e2b0342d63851350ad284fb367d0fd826a3692d139aca34f206e1e8a8c179b" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-api-1-r1-nadia-brennan.json", - "sha256": "deaa37829b39804a5de8734f651c49d3ed1183973874d97c21cff2a5c7282cba" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-api-2-r2-marcus-feld.json", - "sha256": "c40ff9d86db97799cb4870dbf88e21119a5e1b8238248bc06b5a1beea0c97e76" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-api-3-r3-ines-carvalho.json", - "sha256": "0a94e502e5b7598af0868e52582d47aefeccf1f147211e5746f0e0a25bce566f" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-api-4-r4-theo-lindqvist.json", - "sha256": "1dab70fa34fbcacf0f7f4757201d92da8502f1650900f3489912491a93072701" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-browser-1-r1-nadia-brennan.json", - "sha256": "93557f41a8f1e479ed7a6440c18174da667c833e868d892376388fc5777228b4" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-browser-2-r2-marcus-feld.json", - "sha256": "9f52083028bb48d004b0ec4a2f6a81dc85c84c882029086acde544e29732def6" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-browser-3-r3-ines-carvalho.json", - "sha256": "ba055846fc2380d542ec08411fde97f2f5d251712eb43ca86d01051c0276f556" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b03-browser-4-r4-theo-lindqvist.json", - "sha256": "b6900aa408ea1d03b0c846da2d63eba4e898c1a5d6db1f5c2388bc1ff52b487b" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-api-1-r5-grace-adeyemi.json", - "sha256": "db90478da75a75ae367e01d07434adccaa4928e7cf019d07d76868398fb256fa" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-api-2-r6-rosa-delgado.json", - "sha256": "15e69d0b2ef02f9ec6cd9abeb1e2b93227f8fd1e1187c6f9bf15a7a217e65069" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-api-3-r7-arlo-whitcombe.json", - "sha256": "687eae24be79cb05abe3737aa05a728cb434d67e531b30e257d97acce06dbb3b" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-api-4-r8-priya-raman.json", - "sha256": "3f4ef99e1242d192279f014758e687661ecce4015181832e705e51b19adbb8ea" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-browser-1-r5-grace-adeyemi.json", - "sha256": "4644b5e244603bbaed4d815b641b5c0eb7bf3d1b74a02f41fd1d5520ba13d41b" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-browser-2-r6-rosa-delgado.json", - "sha256": "4b5b63eb73ad4726594eb02bc5cd1219a7d4444b310de1f26e9d2487109f9971" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-browser-3-r7-arlo-whitcombe.json", - "sha256": "7879121889f8208d92d64b25a260bae304ea050f44cda0d367aad68a47b5448e" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b04-browser-4-r8-priya-raman.json", - "sha256": "18c1e2a51dc92eae332228901670f9289ab24b67cd211e42e8a4f4cd4e4cb002" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-api-1-r1-nadia-brennan.json", - "sha256": "6c329078538d13333744eb580bee310a0b44b5f943eccd040fb48cc910755af9" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-api-2-r2-marcus-feld.json", - "sha256": "afdd13fb374e493e089e42dcc7a85d4a7608ec5e361087a064be7bdb112bcea8" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-api-3-r3-ines-carvalho.json", - "sha256": "c64de15bc39fcecf4e5e71e497b26bc741e14afa962bc09e3468d7c4e266da5f" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-api-4-r4-theo-lindqvist.json", - "sha256": "200ef7c41b6a656f59b75230befe8fdaadc5b1110a3c696f72d9335b9da6675e" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-browser-1-r1-nadia-brennan.json", - "sha256": "7e3fb05b60a7b9d22ee2a8deed6cf4ecfcb4d23e40b63181ff572d4780941972" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-browser-2-r2-marcus-feld.json", - "sha256": "84f5a27e0ebdce33a29aa9d18faa33d570addd53d56509dd0b86fd0783d5a5b9" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-browser-3-r3-ines-carvalho.json", - "sha256": "310c28dba2e2bdebf93266ebcd8118e51fd1b3cb9593cd922f8b6abecd4a9b96" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/b05-browser-4-r4-theo-lindqvist.json", - "sha256": "6cf215e713b9e0c32fcdbe6e4185402a304cfc4d3ebcb18807b46bdf3165410e" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-01-api.json", - "sha256": "f4706b3f0f2014591826f210d02dede35384ab93a995a9f062791965d2fc08cd" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-01-browser.json", - "sha256": "8145af8f87f344fb42e27cf69346999152dd81889b7641ea57594ad643820127" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-02-api.json", - "sha256": "9a6787443d77f1dbc19f374699bdd089a4f2ae26e0cf49d09fa2e5c67172a976" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-02-browser.json", - "sha256": "38d5ac77cd7c80d22ce30577fa4d00fc3f33c4b9fb7c22eacc469c8c5cca3cbc" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-03-api.json", - "sha256": "a2b4c01c3b7e7279648eb4d0a98504bb06bb31d18414755fa6f5346651c2c89b" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-03-browser.json", - "sha256": "a612d0db4d11d22762189120d4b08eb2886a908be88f330be1cfe7024a74e9a4" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-04-api.json", - "sha256": "6ace481c86799ac876cf227163a5fd2d45ec6e4b0b0238dfea733b37b8c95efd" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-04-browser.json", - "sha256": "969b390048f9f6a749f89f175aeb5a9002cbda0ae388ddd05c8f5f32bb9999aa" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-05-api.json", - "sha256": "893f4f4f0ed6fdb0d6fd0304b9c883f7600f39145e7b292fb2883e8320e14045" - }, - { - "path": "benchmark/openemr_api_tier/spike/results/runs/block-05-browser.json", - "sha256": "9b5d494a088d20b0ac92017991ed0eb0473134ba205d4ffb53ebbc8ae4d8215c" - }, - { - "path": "benchmark/openemr_live/docker-compose.yml", - "sha256": "14981f7552e8dba82bf7e9020c7959780845a455a02192150cedfa297c038aa8" - }, - { - "path": "benchmark/openemr_local/environment.lock.json", - "sha256": "026dab7a2059332f8a62a7e5a24ed22ed94c14dc37a42c73eec7b1a10b4b6a19" - }, - { - "path": "benchmark/openemr_local/verify.yaml", - "sha256": "c8b8cfc97f7ba654d3b016798a5ec442570fb3361b717b53b7363c6e0dd8d6ad" - }, - { - "path": "benchmark/openemr_referral_timing/figures.json", - "sha256": "8fc9a7ae6a3d8ef84b845a785280688370fa103d1a5ddd2b202c7915290cdaae" - }, - { - "path": "benchmark/openemr_referral_timing/runs.csv", - "sha256": "b4b24eaa8df86c9a54cc3a435cb6baff1940931e893750a4896fca57bf3eaa87" - }, - { - "path": "benchmark/openimis_claims/deployment.eligibility.yaml", - "sha256": "03f46f4762bad3e465b65217f6080f203e8fe0b167288f65a7a76edfe469d538" - }, - { - "path": "benchmark/openimis_claims/environment.lock.json", - "sha256": "9861e1e01d48d2b68916adbde8071595d2bb21205af4f92155a129eb707c8a8e" - }, - { - "path": "benchmark/openimis_claims/submit_binding_probe.json", - "sha256": "567633244857235c2e77071b1f039d098718b1e6d789a62609aca003c903879a" - }, - { - "path": "benchmark/pixel_identity/crop_O0_digit_1_sibling.png", - "sha256": "c4d5328668da688249f2f9bd1294842aebeb5effaef83776cac2b6ecf1b18a1f" - }, - { - "path": "benchmark/pixel_identity/crop_O0_digit_1_target.png", - "sha256": "318cbc6efb930086138acbcc753df00683fc6e2ee413ea7726cbf13429dc9fb9" - }, - { - "path": "benchmark/pixel_identity/crop_O0_digit_2_sibling.png", - "sha256": "d391bb8b12ed9d0f2929336428ac275733152a53711cec8dd5272b829845821d" - }, - { - "path": "benchmark/pixel_identity/crop_O0_digit_2_target.png", - "sha256": "35d781253312597e9f14241e4d399e5b1cae13e7338d2dfd1ded60d4357be2ea" - }, - { - "path": "benchmark/pixel_identity/crop_O0_digit_3_sibling.png", - "sha256": "a1aae6c3320f918383f736bb7c1776514471bddd38a4e9523e375aca05233d2c" - }, - { - "path": "benchmark/pixel_identity/crop_O0_digit_3_target.png", - "sha256": "3719c993c34e0a2913a3308bca8df6cc1b0c85cfcb7a7d0447b6dd09c3cb99e8" - }, - { - "path": "benchmark/pixel_identity/pixel_identity.json", - "sha256": "cdd1dad4a3859c445978f3fc8fb00540eb19a1f27b207d77fc001c67032885e7" - }, - { - "path": "benchmark/pixel_identity_aligned/evidence.json", - "sha256": "c9763f03873c01c7977a17c899b1304e25cecde047709c54982f3dfc59707cba" - }, - { - "path": "benchmark/pixel_scale/results_after.json", - "sha256": "887acaa54a0de5b6c0038bed7795e5eae0930b4975cdaf7c83e9db772522721a" - }, - { - "path": "benchmark/pixel_scale/results_before.json", - "sha256": "6906441978365dea7d8fef335a0ab55067df9323ddfe4ad7e7823984df32e9ae" - }, - { - "path": "benchmark/pixel_scale/results_before_no_drift_check.json", - "sha256": "65a9882e56c6cb87b45d9497616e18ddfe247431ecf6c29fb43f932d5ae30fbe" - }, - { - "path": "benchmark/qualification_gate/campaign.json", - "sha256": "e54b0f27b6de8611afdcea8f647a922e784c9c998bee7a078c9701ff17e26831" - }, - { - "path": "benchmark/qualification_gate/policy.yaml", - "sha256": "338e407017dce8a33140d7f2173e8255a0924bead582435138ae298d357b89be" - }, - { - "path": "benchmark/qualification_gate/results.json", - "sha256": "e0453510a67f06a2032a1a4da139f596ce42ac217ca37e60c5a917b43018b889" - }, - { - "path": "benchmark/rdp/results.json", - "sha256": "733fe8948a423dcbf2d413a10bca924cba918d196693d30cfb30f0a425ca5d15" - }, - { - "path": "benchmark/rdp/results_82a658a_20260718.sanitized.json", - "sha256": "c6be771a567dfef8e924655ac165ea78c1eb32893bcf441908f4c6bc8c4c4246" - }, - { - "path": "benchmark/rdp/results_e2c7acf_20260718.json", - "sha256": "70b88e3f55af4cb1c9192bad838f5944ca8123e9ac81db3a15fa58f9fa2e608e" - }, - { - "path": "benchmark/rdp_ladder/policy.yaml", - "sha256": "917ad89fd738e44aefd9a776d2d3945d7b9d469b622d181d07b6adea594822de" - }, - { - "path": "benchmark/rdp_ladder/results.json", - "sha256": "3b946dd098c4a4c2ca56c1ab531a2eaeeb37804aa10c440e576f7196a03ae37c" - }, - { - "path": "benchmark/rdp_multiapp/campaign.json", - "sha256": "b00bc748a8a2d54d8e117aa267fa1669d52d2ecd5a9b11a080c7d43e032f728a" - }, - { - "path": "benchmark/rdp_multiapp/policy.yaml", - "sha256": "ff978d7755b24731c22f311b1791b4f9b70c8dd515c17e8beefb4d0e22f78c23" - }, - { - "path": "benchmark/rdp_pool/results.json", - "sha256": "6a689187c57027247671cb47dc36b256a672c78887a394486fc43b82de306551" - }, - { - "path": "benchmark/reliability/summary.json", - "sha256": "54ca722fd49a9eb4e0cb1fda7de6781e2a71f45aa872b849045dd106cce4ad1a" - }, - { - "path": "benchmark/results.json", - "sha256": "daf6f840f441ad32c1c88716ed41e2c1dec766a2f03762adda00f30f7588d8cc" - }, - { - "path": "benchmark/run_player/player.html", - "sha256": "4524402f43d172e26b3f707134b47129d22add2dea1288e7df461153005ab357" - }, - { - "path": "benchmark/run_player/player_data.json", - "sha256": "18f1a2f5eb4e1c48090da68b475c15c10fb367df61ed476b31d95f16286baef1" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/report.json", - "sha256": "14ac49ea86d299fefd50f595fc3ada75b053fdaf142bcabf084a6e75dadef931" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_000_after.png", - "sha256": "6a96f103e471644585b7c2f14e489ae5391a09ab5c99b952eb83409a0303b795" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_000_before.png", - "sha256": "dfc43b57ddf41edf05f6b3d84b546eb9141c284d4b567f8ecf9ff1d7e0577e13" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_001_after.png", - "sha256": "797d626c94591aeb86ccd5b3f0af20e2c04368f9a0f532dfce70f7d4651644c5" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_001_before.png", - "sha256": "6a96f103e471644585b7c2f14e489ae5391a09ab5c99b952eb83409a0303b795" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_002_after.png", - "sha256": "a893296277264591409b27a57b3554485d26366168fa7e9c6b45d1a2e9f1dd2b" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_002_before.png", - "sha256": "797d626c94591aeb86ccd5b3f0af20e2c04368f9a0f532dfce70f7d4651644c5" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_003_after.png", - "sha256": "1c1769ea14ecf21c241205184b29179007475e6a37ec894b5fc41df8ed372191" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_003_before.png", - "sha256": "a893296277264591409b27a57b3554485d26366168fa7e9c6b45d1a2e9f1dd2b" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_004_after.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_004_before.png", - "sha256": "1c1769ea14ecf21c241205184b29179007475e6a37ec894b5fc41df8ed372191" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_005_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_005_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_006_after.png", - "sha256": "c1a94624578e58317c488032cffc14bbb1a46c7c43bb9825999616c84ca6818c" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_006_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_007_after.png", - "sha256": "8f87ee9431ab1c004cf43512f28f38c11682aa3ab5fbd5ad3f2fb078da7bca41" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_007_before.png", - "sha256": "c1a94624578e58317c488032cffc14bbb1a46c7c43bb9825999616c84ca6818c" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_008_after.png", - "sha256": "c46e0b73d420777f5f812a287a33329ecde8be52663256b0f7255e41e9969b5a" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_008_before.png", - "sha256": "8f87ee9431ab1c004cf43512f28f38c11682aa3ab5fbd5ad3f2fb078da7bca41" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_009_after.png", - "sha256": "bd8b9866b867c72eced29368867100b8f478cab7dcb2719f7e406f24fb8794ff" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_009_before.png", - "sha256": "c46e0b73d420777f5f812a287a33329ecde8be52663256b0f7255e41e9969b5a" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_010_after.png", - "sha256": "a025aebed4c31d5ede40ac605efb3fd5b0ba5ddf6685fbf41f207395e5c8b5dc" - }, - { - "path": "benchmark/run_player/runs/modal-halt-run/steps/step_010_before.png", - "sha256": "bd8b9866b867c72eced29368867100b8f478cab7dcb2719f7e406f24fb8794ff" - }, - { - "path": "benchmark/safety_gallery/gallery.html", - "sha256": "e36827ad3fd07d1cfd5ea8803366b1f5cc34430c4908a447e5f527a742c4126b" - }, - { - "path": "benchmark/safety_gallery/results.json", - "sha256": "b831d52f5a387abda6467886e9fd1f06fdb44e8127cc9da4b23b5424e5f2fbef" - }, - { - "path": "benchmark/silent_wrong_action/results.json", - "sha256": "af71ce1db2b0bf065230d775ec63251891f4dbe1cd0d95d44974740acd3cc38a" - }, - { - "path": "benchmark/silent_wrong_action/silent_wrong_action.png", - "sha256": "4be965b47ed711a5e9c229e35c246ce97ebd54d47308314fe8360c1201c795c7" - }, - { - "path": "benchmark/structural_action/structural_action.json", - "sha256": "23505c38b6acd963c9ff647ca753a10b61a8981e31b9032eef032e1ad63d850c" - }, - { - "path": "benchmark/ui_readback/results.json", - "sha256": "7f7a1ef83fef7ecab6f3bb990e6cd257a12e0af0b49be83aca6a16bfd25a2060" - }, - { - "path": "benchmark/vision_hardening/corpus.json", - "sha256": "c64e45ce996f6b13b2e1a3f234d2931e10b5090163215a1185c639a019820e35" - }, - { - "path": "benchmark/vision_hardening/results.json", - "sha256": "ce7aa5b12072f02fcc134f8f6b1a18f21c30ecca7440911d6336c8828bf07500" - }, - { - "path": "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_AC50061_vs_AC5OO61.png", - "sha256": "e04eea4dad4459f7bbf2a787a42c773ceb0d56f032f4c71e3bfefbf95d75cb8b" - }, - { - "path": "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_MG4408_vs_MG44O8.png", - "sha256": "9d30802d9fb24fdb6385960c9c82608eda4d6ebc1406f93773a58834cbc0b434" - }, - { - "path": "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_MG7008_vs_MG7O08.png", - "sha256": "4f0f0534d39c957f7af0dcdddfc27b40a7efcf6816611bf8f6f2d97c15f0d26a" - }, - { - "path": "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_RT8005_vs_RT8OO5.png", - "sha256": "efc898793af03c0f8684d0c8821adee53b35debab9b0180443dddf27c653b345" - }, - { - "path": "benchmark/vlm_identity/pairs/drift_MG4482_dark.png", - "sha256": "47454264c725f94270624ff22b14cac4ff35306f72631d6dc3494052b571f638" - }, - { - "path": "benchmark/vlm_identity/vlm_identity.json", - "sha256": "022bc1c7b271094c8c9a5c979d65a0bef53cf6cc4024eaee8e6ab3525bfd07f2" - }, - { - "path": "benchmark/windows_uia/results.json", - "sha256": "a32b06542b4cf23f5fbd3007f0dc71632de2ac3e2de8d241f00a2576f0f4445c" - }, - { - "path": "claims.yaml", - "sha256": "f121929e16de2d0a5a0897a4b246ca97219464d4e09eee205575e8a2d2820179" - }, - { - "path": "deploy/on-prem/docker-compose.yml", - "sha256": "7ba243459366ad07b3981f4af66b74092c364654f2904457c3013aef690c24a3" - }, - { - "path": "deploy/on-prem/onprem.example.yaml", - "sha256": "a8bbc42cde104e7fb42b0fd9521dccacf71ee7a1ea2f321b7b1c03c3281e3665" - }, - { - "path": "docs/console/run-halted.png", - "sha256": "d6df1f991816cd923e507ba6f8366ec9d8b63d04cfb7c99293160907dced3152" - }, - { - "path": "docs/console/run-paused.png", - "sha256": "beec939d4c03b3f327d75e286383b329cd48266c87edea4b4141cfc7ac642b14" - }, - { - "path": "docs/console/runs.png", - "sha256": "55a4ca1a1e08f13e101e888e6ee501c146da24064ca28190f4ba0aa14a4f98e4" - }, - { - "path": "docs/console/skills.png", - "sha256": "61985b53fef704c4726853d9744eab66912715fa63c0ab1b3a6440b21039098a" - }, - { - "path": "docs/console/workflow-detail-cert.png", - "sha256": "9e5982fa09aa83b0363a3353536245d97a8482cb9a4ffb3e338a99af3a4abe2a" - }, - { - "path": "docs/console/workflow-diff.png", - "sha256": "6722d22f851497627179db2e05d9cdc4000f9d86b29a91175f56f297e77dfdcd" - }, - { - "path": "docs/console/workflows.png", - "sha256": "828bc4d040fda5073e45febd230ee0e05d1fde862b739f72e962d239b38a3371" - }, - { - "path": "docs/deployment.example.yaml", - "sha256": "9a91357075a1c860e66ed13847e88550566128cdd8ed6ef4629dd36e6ab4f44d" - }, - { - "path": "docs/program-workbench.png", - "sha256": "28c5aaec29c056de51844c77d5d5a3cb6d92d91833f7f7c697e55f4891a8d866" - }, - { - "path": "docs/showcase-compose/program-graph.html", - "sha256": "ddc707a152f9cc2c635d39ae6b81096019103201fc41ab12be8a83c63cd6114f" - }, - { - "path": "docs/showcase-compose/program-graph.png", - "sha256": "cee5e750a4e0ecabe091f5432c59c6aa4151364626d73aee8faa196261449d16" - }, - { - "path": "docs/showcase-encounter-loop/body/manifest.json", - "sha256": "ffd2198573999681f81d669423c376ab52c0975bb0f1ddffb96e6620e9d9b3a5" - }, - { - "path": "docs/showcase-encounter-loop/body/workflow.json", - "sha256": "8cc9304dece95a428334d26381f257767a0e54debe97dd920358ee19624571bc" - }, - { - "path": "docs/showcase-encounter-loop/bundle/manifest.json", - "sha256": "8f8203b28c1d1de1450177bc9b0107dec6c95b1ae28943fcdf5ed2f20de3bacb" - }, - { - "path": "docs/showcase-encounter-loop/bundle/workflow.json", - "sha256": "05572200da73d4a94fdeb693bdf6e7c23152916c68a697cd59fc0ae8ad071e2d" - }, - { - "path": "docs/showcase-encounter-loop/worklist.csv", - "sha256": "3da03b2cc68c22f920322b67736272d9bf10dd0ada542931301e8e985c209f28" - }, - { - "path": "docs/showcase-loop/bundle/manifest.json", - "sha256": "24ebcbf85646e6d96e1ba74f91a0dc1d86d3f3355b6ccd15ef3240d720d7138c" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_000.png", - "sha256": "f1828b7d1644fbe316c20d5e85904149f582bc851516a4f57ab87854e09d91f6" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_000_expect.png", - "sha256": "a191ba28eaf2691ea2bdbde6043f87eeea0bda377ed1dbd92ed8f99e4645c38e" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_001_expect.png", - "sha256": "a368fb929154c409069b8529c4159e95009de1cd90847ef8c9e6e7217383112e" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_002.png", - "sha256": "edc6f6ff053c14c201f17cca8b46ae4b91b8e80858c203f8f47425552f4a2aea" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_002_expect.png", - "sha256": "b588f9b3a2ac3c47e9f3b5482cb73e841bb1fceda2dcec1f25d76639c2d7885b" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_003_expect.png", - "sha256": "5d0d7095f8556037dca2486a9f65b811afc778e56424c60596f2701e749d8d20" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_004.png", - "sha256": "e92c4f9a9641f85ab09240761747f296a259514da6f0fa5dcb553f4cd24973c3" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_004_expect.png", - "sha256": "518fb9deade19e00173d7c3898c41e5061269a7fd297da794445f02f33bd44f6" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_005.png", - "sha256": "e21c6ca4622199cd03c4ec569d79992e275321dd633a532a8e95f9839692cd7c" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_005_expect.png", - "sha256": "c5667abd0a4634138fe14c45fb9e9db24915730f9833b380a468c192b9705553" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_006_expect.png", - "sha256": "f7e7bea1e80633fdfb6d59c0fe8a21e555258467771a4aae77e04e0ae5638237" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_007_expect.png", - "sha256": "b00f01ef23bb84596f854e770197f88b4a573dc595dec10f4641d5853dfae8f6" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_008.png", - "sha256": "daa4ed0af4be54f6c834124d428c3cc53782bf47f078e2aed3ac66b1821cc001" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_008_expect.png", - "sha256": "eb616c03c24974233e5926db0ce325efd28ba09bf7d7294b2654182056a64001" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_013.png", - "sha256": "44bcea01c29ffce089359a39defec0e9e54083af01410e9c4a3f7c0d25eb3cab" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_013_expect.png", - "sha256": "49573416a7ebe7aff262d82ee44dd54ee21cb4a76ba99a07e666e46b5a721446" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_014.png", - "sha256": "7feb81b1126ebf4da47b3d3cde66852d45df9c5c0de92271fd5967aa2191befb" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_014_expect.png", - "sha256": "4b82d961d0ab7706325dc0aaae70e0432eb7f6130871cd9bbd48fe8b26a11774" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_015.png", - "sha256": "a525c1b81d24176746463b435cfa870f27ae8851918ace8d667a91cbd429c58e" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_015_expect.png", - "sha256": "5e7fba0ba58b1d27497f4a1148934be51886a92c94edaa50582ac3045642f74f" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_017.png", - "sha256": "1952c2c78b8fbea7f97276e5ceb9a80a1f559deadca13ebb8e1526f272c8935f" - }, - { - "path": "docs/showcase-loop/bundle/templates/step_017_expect.png", - "sha256": "3bb8ad7cd2002f295c44a7d5e57a268d7dc2c712519bccb169cf8ca8f50392b7" - }, - { - "path": "docs/showcase-loop/bundle/workflow.json", - "sha256": "33e861d18ae8206098b5890000afd45d94979532a4463e1763c78814b3bd81c1" - }, - { - "path": "docs/showcase-loop/worklist.csv", - "sha256": "15b4400bbf28572b1ee3013ef92bb758fe74662bdfcf981f5eacdf0205709614" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_000.png", - "sha256": "f1828b7d1644fbe316c20d5e85904149f582bc851516a4f57ab87854e09d91f6" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_000_expect.png", - "sha256": "a191ba28eaf2691ea2bdbde6043f87eeea0bda377ed1dbd92ed8f99e4645c38e" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_001_expect.png", - "sha256": "a368fb929154c409069b8529c4159e95009de1cd90847ef8c9e6e7217383112e" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_002.png", - "sha256": "edc6f6ff053c14c201f17cca8b46ae4b91b8e80858c203f8f47425552f4a2aea" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_002_expect.png", - "sha256": "b588f9b3a2ac3c47e9f3b5482cb73e841bb1fceda2dcec1f25d76639c2d7885b" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_003_expect.png", - "sha256": "5d0d7095f8556037dca2486a9f65b811afc778e56424c60596f2701e749d8d20" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_004.png", - "sha256": "e92c4f9a9641f85ab09240761747f296a259514da6f0fa5dcb553f4cd24973c3" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_004_expect.png", - "sha256": "518fb9deade19e00173d7c3898c41e5061269a7fd297da794445f02f33bd44f6" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_005.png", - "sha256": "e21c6ca4622199cd03c4ec569d79992e275321dd633a532a8e95f9839692cd7c" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_005_expect.png", - "sha256": "c5667abd0a4634138fe14c45fb9e9db24915730f9833b380a468c192b9705553" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_006_expect.png", - "sha256": "f7e7bea1e80633fdfb6d59c0fe8a21e555258467771a4aae77e04e0ae5638237" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_007_expect.png", - "sha256": "b00f01ef23bb84596f854e770197f88b4a573dc595dec10f4641d5853dfae8f6" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_008.png", - "sha256": "daa4ed0af4be54f6c834124d428c3cc53782bf47f078e2aed3ac66b1821cc001" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_008_expect.png", - "sha256": "eb616c03c24974233e5926db0ce325efd28ba09bf7d7294b2654182056a64001" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_013.png", - "sha256": "44bcea01c29ffce089359a39defec0e9e54083af01410e9c4a3f7c0d25eb3cab" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_013_expect.png", - "sha256": "49573416a7ebe7aff262d82ee44dd54ee21cb4a76ba99a07e666e46b5a721446" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_014.png", - "sha256": "7feb81b1126ebf4da47b3d3cde66852d45df9c5c0de92271fd5967aa2191befb" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_014_expect.png", - "sha256": "4b82d961d0ab7706325dc0aaae70e0432eb7f6130871cd9bbd48fe8b26a11774" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_015.png", - "sha256": "a525c1b81d24176746463b435cfa870f27ae8851918ace8d667a91cbd429c58e" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_015_expect.png", - "sha256": "5e7fba0ba58b1d27497f4a1148934be51886a92c94edaa50582ac3045642f74f" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_017.png", - "sha256": "1952c2c78b8fbea7f97276e5ceb9a80a1f559deadca13ebb8e1526f272c8935f" - }, - { - "path": "docs/showcase-openemr/bundle/templates/step_017_expect.png", - "sha256": "3bb8ad7cd2002f295c44a7d5e57a268d7dc2c712519bccb169cf8ca8f50392b7" - }, - { - "path": "docs/showcase-openemr/bundle/workflow.json", - "sha256": "2f784d04190f965d9e86b44ad393f08ab42cb139ecee82f231ffb682c135ee45" - }, - { - "path": "docs/showcase-openemr/failure-evidence/calendar-region-recorded.png", - "sha256": "c5667abd0a4634138fe14c45fb9e9db24915730f9833b380a468c192b9705553" - }, - { - "path": "docs/showcase-openemr/failure-evidence/calendar-region-replay.png", - "sha256": "bd162d596efa33310625180be12116b3f5177463ba2b070756818b79110f30b4" - }, - { - "path": "docs/showcase-openemr/program-graph.html", - "sha256": "472eb493cd43aa35d3032687ea5027496f7c37d30c6603c78af9647d20743bd0" - }, - { - "path": "docs/showcase-openemr/program-graph.json", - "sha256": "38bbecff45f48b4d00a4fb95e4cc8186fefc83478962666f90fe82495f749871" - }, - { - "path": "docs/showcase-openemr/program-graph.png", - "sha256": "ffe0436e2548e4b6ff94498ef5b72b272db630509874fedcb6871c411945e93e" - }, - { - "path": "docs/showcase-openemr/recording/events.jsonl", - "sha256": "7e47fffb14445e209c84f3da2c357f93fb88e5389e1f4428d7083476f2e9a1c8" - }, - { - "path": "docs/showcase-openemr/recording/frames/0000_after.png", - "sha256": "6464fa634a17fe4c3addd119f3e255fd5d2a1e58944d73ff1a7fd2d12f673b41" - }, - { - "path": "docs/showcase-openemr/recording/frames/0000_before.png", - "sha256": "6b21dbb47cc54a9a5d807f4da8364af7e162409103766bfd54e1c33e80481f3a" - }, - { - "path": "docs/showcase-openemr/recording/frames/0001_after.png", - "sha256": "db277f89e0ee9c04179208298a3d9217c0c3f736a70dcf52c3306c94b2ff1728" - }, - { - "path": "docs/showcase-openemr/recording/frames/0001_before.png", - "sha256": "6464fa634a17fe4c3addd119f3e255fd5d2a1e58944d73ff1a7fd2d12f673b41" - }, - { - "path": "docs/showcase-openemr/recording/frames/0002_after.png", - "sha256": "2993c82f60b5b61375d79cdd0e5733cbaf4a0b51f5634e659dafd430b8a45270" - }, - { - "path": "docs/showcase-openemr/recording/frames/0002_before.png", - "sha256": "db277f89e0ee9c04179208298a3d9217c0c3f736a70dcf52c3306c94b2ff1728" - }, - { - "path": "docs/showcase-openemr/recording/frames/0003_after.png", - "sha256": "c070cf5450d7b21711b21903ffca747b3677010206bd8d7ea17208dab67c74a7" - }, - { - "path": "docs/showcase-openemr/recording/frames/0003_before.png", - "sha256": "2993c82f60b5b61375d79cdd0e5733cbaf4a0b51f5634e659dafd430b8a45270" - }, - { - "path": "docs/showcase-openemr/recording/frames/0004_after.png", - "sha256": "f259cf6bc98373d6a52e23658916066b4000e6a685f74585f40bab344db6efa8" - }, - { - "path": "docs/showcase-openemr/recording/frames/0004_before.png", - "sha256": "c070cf5450d7b21711b21903ffca747b3677010206bd8d7ea17208dab67c74a7" - }, - { - "path": "docs/showcase-openemr/recording/frames/0005_after.png", - "sha256": "ddc505b75145b1bba2084cf3f599efcec7fd6b2dd2f5c9bae246fa6a1d39bd81" - }, - { - "path": "docs/showcase-openemr/recording/frames/0005_before.png", - "sha256": "cef504040a3ffc741da7a8b31926ee954ede868fdf6b8e2c25932402e4d8ceb3" - }, - { - "path": "docs/showcase-openemr/recording/frames/0006_after.png", - "sha256": "458254ee333cc2d65e778955ea5e05d585c1b858278c74716c4501bbb6f5e3e0" - }, - { - "path": "docs/showcase-openemr/recording/frames/0006_before.png", - "sha256": "ddc505b75145b1bba2084cf3f599efcec7fd6b2dd2f5c9bae246fa6a1d39bd81" - }, - { - "path": "docs/showcase-openemr/recording/frames/0007_after.png", - "sha256": "668d0113e8c3580801a56bbf1d428ff19036eff08953fb49ef98f25d24b273b5" - }, - { - "path": "docs/showcase-openemr/recording/frames/0007_before.png", - "sha256": "458254ee333cc2d65e778955ea5e05d585c1b858278c74716c4501bbb6f5e3e0" - }, - { - "path": "docs/showcase-openemr/recording/frames/0008_after.png", - "sha256": "bfa4ae091f07661d53485c49ec707d10f8d2e832da540707056b578753a1acd1" - }, - { - "path": "docs/showcase-openemr/recording/frames/0008_before.png", - "sha256": "668d0113e8c3580801a56bbf1d428ff19036eff08953fb49ef98f25d24b273b5" - }, - { - "path": "docs/showcase-openemr/recording/frames/0009_after.png", - "sha256": "68d2b170e82128d4ccec6a776c804e88484ff4c539a2cfbf3166224eeac50894" - }, - { - "path": "docs/showcase-openemr/recording/frames/0009_before.png", - "sha256": "bfa4ae091f07661d53485c49ec707d10f8d2e832da540707056b578753a1acd1" - }, - { - "path": "docs/showcase-openemr/recording/frames/0010_after.png", - "sha256": "def988c12b07fb05f490c92f12249fb2752a44cd45527a5d3a6d85ba560c0374" - }, - { - "path": "docs/showcase-openemr/recording/frames/0010_before.png", - "sha256": "68d2b170e82128d4ccec6a776c804e88484ff4c539a2cfbf3166224eeac50894" - }, - { - "path": "docs/showcase-openemr/recording/frames/0011_after.png", - "sha256": "ebb24b4c4f48a8714ff18139d58c4f62d3e6d5a596fcca0dee50b3ba22cca40b" - }, - { - "path": "docs/showcase-openemr/recording/frames/0011_before.png", - "sha256": "def988c12b07fb05f490c92f12249fb2752a44cd45527a5d3a6d85ba560c0374" - }, - { - "path": "docs/showcase-openemr/recording/frames/0012_after.png", - "sha256": "dbde0cd453432d82af9eef528aade9734d398e34577d9ca20f92c76106c4526f" - }, - { - "path": "docs/showcase-openemr/recording/frames/0012_before.png", - "sha256": "ebb24b4c4f48a8714ff18139d58c4f62d3e6d5a596fcca0dee50b3ba22cca40b" - }, - { - "path": "docs/showcase-openemr/recording/frames/0013_after.png", - "sha256": "23ddeed1e9f762715b9910ba94ff5cce5fd24015a00c95b47de32db8df6e57a3" - }, - { - "path": "docs/showcase-openemr/recording/frames/0013_before.png", - "sha256": "dbde0cd453432d82af9eef528aade9734d398e34577d9ca20f92c76106c4526f" - }, - { - "path": "docs/showcase-openemr/recording/frames/0014_after.png", - "sha256": "c9f8f8f155f69799e99f0a40ece22aada4310b3d9c470c02ff5268132f0c240c" - }, - { - "path": "docs/showcase-openemr/recording/frames/0014_before.png", - "sha256": "23ddeed1e9f762715b9910ba94ff5cce5fd24015a00c95b47de32db8df6e57a3" - }, - { - "path": "docs/showcase-openemr/recording/frames/0015_after.png", - "sha256": "ac67a64e510318ba3e208c3c94ad0d638b4395c0a76acbe7d858d34533852aa2" - }, - { - "path": "docs/showcase-openemr/recording/frames/0015_before.png", - "sha256": "c9f8f8f155f69799e99f0a40ece22aada4310b3d9c470c02ff5268132f0c240c" - }, - { - "path": "docs/showcase-openemr/recording/frames/0016_after.png", - "sha256": "f125255220573e2359d86d1e88934e7529441b6c123ff903bb8335106da9099a" - }, - { - "path": "docs/showcase-openemr/recording/frames/0016_before.png", - "sha256": "ac67a64e510318ba3e208c3c94ad0d638b4395c0a76acbe7d858d34533852aa2" - }, - { - "path": "docs/showcase-openemr/recording/frames/0017_after.png", - "sha256": "58a78630f657680c7ec4576b908ee2d4ff7068a607ea8d8bcafca494b05fd23e" - }, - { - "path": "docs/showcase-openemr/recording/frames/0017_before.png", - "sha256": "f125255220573e2359d86d1e88934e7529441b6c123ff903bb8335106da9099a" - }, - { - "path": "docs/showcase-openemr/recording/meta.json", - "sha256": "54926d0dd6839505e53b326ee9f1b250c8e646f91f3e7a814844896e43ec71c4" - }, - { - "path": "docs/showcase-openemr/runs/run-1/final.png", - "sha256": "d78a42f71f21e63cf69286e5d6a8aa27c7fc9abf86af33db1d7185f0fc253382" - }, - { - "path": "docs/showcase-openemr/runs/run-1/heals/step_013/heal.json", - "sha256": "48b8ace65feb306a166a95ad12599ad59068952aa380ef6b2e48092af558dc3f" - }, - { - "path": "docs/showcase-openemr/runs/run-1/heals/step_013/screen.png", - "sha256": "decd46bec17ca7b0527c86748c2ee85a327594ab7ef4213fb24934159294c133" - }, - { - "path": "docs/showcase-openemr/runs/run-1/heals/step_013/template.png", - "sha256": "5ffa3f1f4cd4bf64260800fe05f20f5b09446787b8188f6d3432a33ba3e66e77" - }, - { - "path": "docs/showcase-openemr/runs/run-1/report.json", - "sha256": "a84d4a8b8374c952ed83e66c73840d1c06c6412e07340b24f529f65651d65ff5" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_000_after.png", - "sha256": "6464fa634a17fe4c3addd119f3e255fd5d2a1e58944d73ff1a7fd2d12f673b41" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_000_before.png", - "sha256": "6b21dbb47cc54a9a5d807f4da8364af7e162409103766bfd54e1c33e80481f3a" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_001_after.png", - "sha256": "db277f89e0ee9c04179208298a3d9217c0c3f736a70dcf52c3306c94b2ff1728" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_001_before.png", - "sha256": "6464fa634a17fe4c3addd119f3e255fd5d2a1e58944d73ff1a7fd2d12f673b41" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_002_after.png", - "sha256": "9b521fd7dbb937578b75cf17097c89800953ff59cf137abc64e4644495fbe01f" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_002_before.png", - "sha256": "db277f89e0ee9c04179208298a3d9217c0c3f736a70dcf52c3306c94b2ff1728" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_003_after.png", - "sha256": "8fc5bfb73c8865efb438290813d04e998a13a38fdd7be622ee0174b7c6e77746" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_003_before.png", - "sha256": "9b521fd7dbb937578b75cf17097c89800953ff59cf137abc64e4644495fbe01f" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_004_after.png", - "sha256": "a5d4eb212e68e2937f5ab491cde6b71fdc06cb70a716989d352106b8dfccb260" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_004_before.png", - "sha256": "8fc5bfb73c8865efb438290813d04e998a13a38fdd7be622ee0174b7c6e77746" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_005_after.png", - "sha256": "f6a1a07c758b3fa1e15aba3a33f1fa021abbfd4d80a34158dd631e4b03fc253c" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_005_before.png", - "sha256": "488275553743c4bfed2dfa60170bc836b86012a52fdeeed8fabfd514696a1896" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_006_after.png", - "sha256": "b8c0737becdf29b46adab93f66bbf193071b677bad1985a31333a9e5dc5a342b" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_006_before.png", - "sha256": "ffcf8f52f2a4ea8c89b934630eb5f72e2c6523ed08195c9ea1ce55a5b43bd109" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_007_after.png", - "sha256": "9dae4768bd8403a4b00ee0783340c0e316a927415926f63d9d319f740952b813" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_007_before.png", - "sha256": "b8c0737becdf29b46adab93f66bbf193071b677bad1985a31333a9e5dc5a342b" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_008_after.png", - "sha256": "4c2222eb8b3b96123095e90464bb883abb13858cb70671621406b9a44bf33a6c" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_008_before.png", - "sha256": "9dae4768bd8403a4b00ee0783340c0e316a927415926f63d9d319f740952b813" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_009_after.png", - "sha256": "843435b9ab576dcbb3ba3ea297b8323f28e74b674cd33b04ababc96f958a02c4" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_009_before.png", - "sha256": "4b35096a6c3faba256b64b00ec9b7cec7cbba8e85a3a37b1e527fd6d0b9714e9" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_010_after.png", - "sha256": "decd46bec17ca7b0527c86748c2ee85a327594ab7ef4213fb24934159294c133" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_010_before.png", - "sha256": "843435b9ab576dcbb3ba3ea297b8323f28e74b674cd33b04ababc96f958a02c4" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_011_after.png", - "sha256": "decd46bec17ca7b0527c86748c2ee85a327594ab7ef4213fb24934159294c133" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_011_before.png", - "sha256": "decd46bec17ca7b0527c86748c2ee85a327594ab7ef4213fb24934159294c133" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_012_after.png", - "sha256": "decd46bec17ca7b0527c86748c2ee85a327594ab7ef4213fb24934159294c133" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_012_before.png", - "sha256": "decd46bec17ca7b0527c86748c2ee85a327594ab7ef4213fb24934159294c133" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_013_after.png", - "sha256": "ccc6f3ea111e6df81ff927b60b64c6f6023c8af4388a56f57706dab67626ea08" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_013_before.png", - "sha256": "decd46bec17ca7b0527c86748c2ee85a327594ab7ef4213fb24934159294c133" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_014_after.png", - "sha256": "9feca25c844356340c69a87a4f1e92a949a4ce5bb1011433333c54467d3b1030" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_014_before.png", - "sha256": "ccc6f3ea111e6df81ff927b60b64c6f6023c8af4388a56f57706dab67626ea08" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_015_after.png", - "sha256": "a08daaa5ae8e0b3028856ea64ee18cecdc09f646bc52479751d4c5d61c18b580" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_015_before.png", - "sha256": "9feca25c844356340c69a87a4f1e92a949a4ce5bb1011433333c54467d3b1030" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_016_after.png", - "sha256": "c7eb61d94936ea1c4c22eaab108364c8cd5104fb5745d99f8cb200dd699729ac" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_016_before.png", - "sha256": "a08daaa5ae8e0b3028856ea64ee18cecdc09f646bc52479751d4c5d61c18b580" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_017_after.png", - "sha256": "f16613f28b64fce9d5eced7b307d9f7826819e9477fc377a07c606401b896975" - }, - { - "path": "docs/showcase-openemr/runs/run-1/steps/step_017_before.png", - "sha256": "c7eb61d94936ea1c4c22eaab108364c8cd5104fb5745d99f8cb200dd699729ac" - }, - { - "path": "docs/showcase-openemr/runs/run-2/final.png", - "sha256": "76a93e543834439772de4a2bcbab33dd64e80fe41ad09da2eb2d1b536b31f6bb" - }, - { - "path": "docs/showcase-openemr/runs/run-2/report.json", - "sha256": "13ecdc1df46d5799dbf991e581e059c86ba0e791c665bfe3c62659256bdf1a82" - }, - { - "path": "docs/showcase-openemr/runs/run-3/final.png", - "sha256": "7c7ed7a55ea7c08ccf1058ba2ea00ff244eeaf2b79168b4a6257004537cc5bfb" - }, - { - "path": "docs/showcase-openemr/runs/run-3/report.json", - "sha256": "061141943a380a2191695899ba3a9fd17490e4f9ff717e84e99fc996371d5bc6" - }, - { - "path": "docs/showcase-openemr/runs/run-4/final.png", - "sha256": "2f9ec68d3389dd12ed37003fd4db373f07488a797aa468ed24e5efce70d2c383" - }, - { - "path": "docs/showcase-openemr/runs/run-4/report.json", - "sha256": "8eb326719700dd5d9ae1d03a9a64d60a31cda69adf0631755013ca12ec0a181d" - }, - { - "path": "docs/showcase-openemr/runs/run-5/final.png", - "sha256": "520332c18b343f92762f04651a7fc9b4f7cf8a9e26610c7e0d92eb747e8d8b1a" - }, - { - "path": "docs/showcase-openemr/runs/run-5/report.json", - "sha256": "697584b71fcc62b6b7ccb547f5a69e4be50a54e53dacc1f666966367791712f5" - }, - { - "path": "docs/showcase-openemr/runs/summary.json", - "sha256": "8c0e63a1eb2f8e1e88526f5dc3a5952f703d1504b0de2d81ee16944d42f38409" - }, - { - "path": "docs/showcase-openimis/eligibility_halt.gif", - "sha256": "0a088b1be63ad55f91c76f27e470b339dcab1d3eaeca8557252e271faebcd01f" - }, - { - "path": "docs/showcase-openimis/eligibility_replay.gif", - "sha256": "9185da261ed141042497505eddb54a4280a09824e8783cd6e74ead32079b0065" - }, - { - "path": "docs/showcase-openimis/green-run/report.json", - "sha256": "e53bac5868ac1fcc3cb42570456f3739744ba11ed7e8d1fff47efa0d281fe355" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_000_after.png", - "sha256": "a423c69783652b5f9df627d13805a452cd5b6b117626aad2d4da08bca24f1d9d" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_000_before.png", - "sha256": "aec68f54d6c64b77a6468c45e4ef84411193d769f95fd6b86940fade56303a06" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_001_after.png", - "sha256": "5d5a32fd7d61e27356638677bd1ac3fb38185428efd203fae5bde00518dcbf42" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_001_before.png", - "sha256": "cf13e305c65e39f9a51e1a88d08fe3c00225260a51cdc6674d4f8cfe1703b201" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_002_after.png", - "sha256": "d0c4938116477e13363151db626049275fdaa2ace0cdfec80df67585bcd7821c" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_002_before.png", - "sha256": "5d5a32fd7d61e27356638677bd1ac3fb38185428efd203fae5bde00518dcbf42" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_003_after.png", - "sha256": "623bb880ca332855398225928ae5b6aff9504a0af134120f449f5335ecb36ac5" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_003_before.png", - "sha256": "d0c4938116477e13363151db626049275fdaa2ace0cdfec80df67585bcd7821c" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_004_after.png", - "sha256": "10b5848810f2027132ce7618ae2cae770b1c4a71ebe75de0aa41cc93386e692f" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_004_before.png", - "sha256": "623bb880ca332855398225928ae5b6aff9504a0af134120f449f5335ecb36ac5" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_005_after.png", - "sha256": "a9f159aa2cdd4cc705d2af18529a9704371b30e3a492caa9d337a03725f48b28" - }, - { - "path": "docs/showcase-openimis/green-run/steps/step_005_before.png", - "sha256": "10b5848810f2027132ce7618ae2cae770b1c4a71ebe75de0aa41cc93386e692f" - }, - { - "path": "docs/showcase-openimis/halt-run/report.json", - "sha256": "07c780544ced5ad011b065421e5a00e89727ef81cba3e5ed2d17d8390835d017" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_000_after.png", - "sha256": "cf13e305c65e39f9a51e1a88d08fe3c00225260a51cdc6674d4f8cfe1703b201" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_000_before.png", - "sha256": "aec68f54d6c64b77a6468c45e4ef84411193d769f95fd6b86940fade56303a06" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_001_after.png", - "sha256": "1f7df44312c7cbd8686a549a6122a34d95a171e5364d5d9c2728429c97723f63" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_001_before.png", - "sha256": "cf13e305c65e39f9a51e1a88d08fe3c00225260a51cdc6674d4f8cfe1703b201" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_002_after.png", - "sha256": "7f3d3ee7c818b311ab3be014630e2586cc40581358fad7199452f66ff08f36b7" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_002_before.png", - "sha256": "1f7df44312c7cbd8686a549a6122a34d95a171e5364d5d9c2728429c97723f63" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_003_after.png", - "sha256": "452ee078707776e87e907a921813c5d903266143dee564d645d6092c270a06e2" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_003_before.png", - "sha256": "7f3d3ee7c818b311ab3be014630e2586cc40581358fad7199452f66ff08f36b7" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_004_after.png", - "sha256": "989ce2dde333ce88c61e14030f19ad743793fdf3e194c2a2f43c4a26e8801e89" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_004_before.png", - "sha256": "452ee078707776e87e907a921813c5d903266143dee564d645d6092c270a06e2" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_005_after.png", - "sha256": "4d84382e22c0b84be6c2d7fc9b96f7ea98159661f66ed9323e4abdafc4632968" - }, - { - "path": "docs/showcase-openimis/halt-run/steps/step_005_before.png", - "sha256": "989ce2dde333ce88c61e14030f19ad743793fdf3e194c2a2f43c4a26e8801e89" - }, - { - "path": "docs/showcase-openimis/stills/coverage_active_dialog.png", - "sha256": "a9f159aa2cdd4cc705d2af18529a9704371b30e3a492caa9d337a03725f48b28" - }, - { - "path": "docs/showcase-openimis/stills/coverage_lapsed_dialog.png", - "sha256": "4d84382e22c0b84be6c2d7fc9b96f7ea98159661f66ed9323e4abdafc4632968" - }, - { - "path": "docs/showcase-openimis/stills/verdict_confirmed_card.png", - "sha256": "8aca159b9d207a5527d5e4aff9c501baa9d644f0d3c02e3f60c4dcafb39c4759" - }, - { - "path": "docs/showcase-openimis/stills/verdict_refuted_card.png", - "sha256": "6383bab553e3ef240895d083fd043a24d624795c19b6bf46edf03e879f01801d" - }, - { - "path": "docs/showcase-process/program-graph.html", - "sha256": "11b309bea7bfd8d253a67f4659e69f0f447c0c2dfd3c66b30d7c48d1e3c89f56" - }, - { - "path": "docs/showcase-process/program-graph.png", - "sha256": "8350f30f9940018d3b0fbe988145ca224dbfe8ad48f844fa2cd633d1bbf6bcca" - }, - { - "path": "docs/showcase/baseline-run/report.json", - "sha256": "9e0c8c06856196216cce88d776a6dcdb1455d79d33fc3efb6a1b04946283e3c0" - }, - { - "path": "docs/showcase/baseline-run/steps/step_000_after.png", - "sha256": "6a96f103e471644585b7c2f14e489ae5391a09ab5c99b952eb83409a0303b795" - }, - { - "path": "docs/showcase/baseline-run/steps/step_000_before.png", - "sha256": "dfc43b57ddf41edf05f6b3d84b546eb9141c284d4b567f8ecf9ff1d7e0577e13" - }, - { - "path": "docs/showcase/baseline-run/steps/step_001_after.png", - "sha256": "797d626c94591aeb86ccd5b3f0af20e2c04368f9a0f532dfce70f7d4651644c5" - }, - { - "path": "docs/showcase/baseline-run/steps/step_001_before.png", - "sha256": "6a96f103e471644585b7c2f14e489ae5391a09ab5c99b952eb83409a0303b795" - }, - { - "path": "docs/showcase/baseline-run/steps/step_002_after.png", - "sha256": "a893296277264591409b27a57b3554485d26366168fa7e9c6b45d1a2e9f1dd2b" - }, - { - "path": "docs/showcase/baseline-run/steps/step_002_before.png", - "sha256": "797d626c94591aeb86ccd5b3f0af20e2c04368f9a0f532dfce70f7d4651644c5" - }, - { - "path": "docs/showcase/baseline-run/steps/step_003_after.png", - "sha256": "1c1769ea14ecf21c241205184b29179007475e6a37ec894b5fc41df8ed372191" - }, - { - "path": "docs/showcase/baseline-run/steps/step_003_before.png", - "sha256": "a893296277264591409b27a57b3554485d26366168fa7e9c6b45d1a2e9f1dd2b" - }, - { - "path": "docs/showcase/baseline-run/steps/step_004_after.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "docs/showcase/baseline-run/steps/step_004_before.png", - "sha256": "1c1769ea14ecf21c241205184b29179007475e6a37ec894b5fc41df8ed372191" - }, - { - "path": "docs/showcase/baseline-run/steps/step_005_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "docs/showcase/baseline-run/steps/step_005_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "docs/showcase/baseline-run/steps/step_006_after.png", - "sha256": "c1a94624578e58317c488032cffc14bbb1a46c7c43bb9825999616c84ca6818c" - }, - { - "path": "docs/showcase/baseline-run/steps/step_006_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "docs/showcase/baseline-run/steps/step_007_after.png", - "sha256": "8f87ee9431ab1c004cf43512f28f38c11682aa3ab5fbd5ad3f2fb078da7bca41" - }, - { - "path": "docs/showcase/baseline-run/steps/step_007_before.png", - "sha256": "c1a94624578e58317c488032cffc14bbb1a46c7c43bb9825999616c84ca6818c" - }, - { - "path": "docs/showcase/baseline-run/steps/step_008_after.png", - "sha256": "c46e0b73d420777f5f812a287a33329ecde8be52663256b0f7255e41e9969b5a" - }, - { - "path": "docs/showcase/baseline-run/steps/step_008_before.png", - "sha256": "8f87ee9431ab1c004cf43512f28f38c11682aa3ab5fbd5ad3f2fb078da7bca41" - }, - { - "path": "docs/showcase/baseline-run/steps/step_009_after.png", - "sha256": "f4ac7cafbb72604db7dde572ab8724561b3f6c0426bb998e25ac3c05fba2e423" - }, - { - "path": "docs/showcase/baseline-run/steps/step_009_before.png", - "sha256": "c46e0b73d420777f5f812a287a33329ecde8be52663256b0f7255e41e9969b5a" - }, - { - "path": "docs/showcase/baseline-run/steps/step_010_after.png", - "sha256": "3c31d1ca3a7f94f87163563b564d0284a10c503873c5a03afeb7474a6086c7ca" - }, - { - "path": "docs/showcase/baseline-run/steps/step_010_before.png", - "sha256": "f4ac7cafbb72604db7dde572ab8724561b3f6c0426bb998e25ac3c05fba2e423" - }, - { - "path": "docs/showcase/bundle/templates/step_000.png", - "sha256": "b355da2f01f2311032460231a15b025d5ebad7dd49cee26b422bc1b08a8c2022" - }, - { - "path": "docs/showcase/bundle/templates/step_002.png", - "sha256": "b355da2f01f2311032460231a15b025d5ebad7dd49cee26b422bc1b08a8c2022" - }, - { - "path": "docs/showcase/bundle/templates/step_004.png", - "sha256": "9922dc35306de246478851ca0b48e4f288693b5ad290c4414fc951759c90e0dc" - }, - { - "path": "docs/showcase/bundle/templates/step_005.png", - "sha256": "46a75b5d63ceaad4bee942ccf2a6ca3d2b4f6327509df7eff2cc7ddb2c9fd389" - }, - { - "path": "docs/showcase/bundle/templates/step_006.png", - "sha256": "9d17fc905b1902add82cad885c72fe446a23e0334fc4db58592d2369e85f26a5" - }, - { - "path": "docs/showcase/bundle/templates/step_007.png", - "sha256": "e6a0e0718b00c26280e32928b744217d00a7e010ab9825da27724e2debc9b805" - }, - { - "path": "docs/showcase/bundle/templates/step_008.png", - "sha256": "9c6d01b81fb4c5d42bf7e07dd8ccccbae82016fc90bcc42060c20a9cd38aa338" - }, - { - "path": "docs/showcase/bundle/templates/step_010.png", - "sha256": "5d8163520ba8355f44ffe0cd06a26be6bfe5d6660bcff1395dc82d4da3aa0ac1" - }, - { - "path": "docs/showcase/bundle/workflow.json", - "sha256": "1c7281f44523d366f6d5479d45b6d34c6786fa5e5b847494fc3d9b1567d3d4c6" - }, - { - "path": "docs/showcase/demo-proof.png", - "sha256": "a4d57d980abb2e5cc7dacc198cf8469729096238799df288090530e097812c30" - }, - { - "path": "docs/showcase/demo.gif", - "sha256": "fab97f04ea2f0e5f5f7947718768db409283b3ff9897580ad341609f84404bd0" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_000.png", - "sha256": "4930eab7cec79b52b18213b0713865488edb77c24b75fe7d48103d31d124b972" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_002.png", - "sha256": "4930eab7cec79b52b18213b0713865488edb77c24b75fe7d48103d31d124b972" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_004.png", - "sha256": "de1ccbe1d5c55ff0f3c62370b0d137e6a8f4179bf520e1bb5bb2bd8fcda36a1d" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_005.png", - "sha256": "b7b530e81f41c080133eee7aab8fe63b13d47d3539b3955ba917dbbe316cbda5" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_006.png", - "sha256": "e755a4d8a3ce87c3d530225cbf23e9d056ef74d425997426cf9073183d133a0d" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_007.png", - "sha256": "cb50ef2994ce532121583f7564802b7538ed22452cbc3302d7709cb70ab29d9e" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_008.png", - "sha256": "9dbc7f8ceaeb555463079938c11ff4f65a2296c1bd23ae6587ae1d2b257024dc" - }, - { - "path": "docs/showcase/healed-bundle/templates/step_010.png", - "sha256": "9d57264a3a457494914f926bd4edfef3531cebce998a80a3b25a5fff5958c344" - }, - { - "path": "docs/showcase/healed-bundle/workflow.json", - "sha256": "326f67be0a399437bdf7b766ee63b74777c9983ea3432c080190ab1067ffc05c" - }, - { - "path": "docs/showcase/recording/events.jsonl", - "sha256": "ae56cf02bbb0f3dd388a6c0361188a842d348c1553b901721f09c377a098443d" - }, - { - "path": "docs/showcase/recording/frames/0000_after.png", - "sha256": "6a96f103e471644585b7c2f14e489ae5391a09ab5c99b952eb83409a0303b795" - }, - { - "path": "docs/showcase/recording/frames/0000_before.png", - "sha256": "dfc43b57ddf41edf05f6b3d84b546eb9141c284d4b567f8ecf9ff1d7e0577e13" - }, - { - "path": "docs/showcase/recording/frames/0001_after.png", - "sha256": "797d626c94591aeb86ccd5b3f0af20e2c04368f9a0f532dfce70f7d4651644c5" - }, - { - "path": "docs/showcase/recording/frames/0001_before.png", - "sha256": "6a96f103e471644585b7c2f14e489ae5391a09ab5c99b952eb83409a0303b795" - }, - { - "path": "docs/showcase/recording/frames/0002_after.png", - "sha256": "a893296277264591409b27a57b3554485d26366168fa7e9c6b45d1a2e9f1dd2b" - }, - { - "path": "docs/showcase/recording/frames/0002_before.png", - "sha256": "797d626c94591aeb86ccd5b3f0af20e2c04368f9a0f532dfce70f7d4651644c5" - }, - { - "path": "docs/showcase/recording/frames/0003_after.png", - "sha256": "1c1769ea14ecf21c241205184b29179007475e6a37ec894b5fc41df8ed372191" - }, - { - "path": "docs/showcase/recording/frames/0003_before.png", - "sha256": "a893296277264591409b27a57b3554485d26366168fa7e9c6b45d1a2e9f1dd2b" - }, - { - "path": "docs/showcase/recording/frames/0004_after.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "docs/showcase/recording/frames/0004_before.png", - "sha256": "1c1769ea14ecf21c241205184b29179007475e6a37ec894b5fc41df8ed372191" - }, - { - "path": "docs/showcase/recording/frames/0005_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "docs/showcase/recording/frames/0005_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "docs/showcase/recording/frames/0006_after.png", - "sha256": "c1a94624578e58317c488032cffc14bbb1a46c7c43bb9825999616c84ca6818c" - }, - { - "path": "docs/showcase/recording/frames/0006_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "docs/showcase/recording/frames/0007_after.png", - "sha256": "8f87ee9431ab1c004cf43512f28f38c11682aa3ab5fbd5ad3f2fb078da7bca41" - }, - { - "path": "docs/showcase/recording/frames/0007_before.png", - "sha256": "c1a94624578e58317c488032cffc14bbb1a46c7c43bb9825999616c84ca6818c" - }, - { - "path": "docs/showcase/recording/frames/0008_after.png", - "sha256": "c56ad2b972b9a746c03b7d304160e75951b709d793eba90c23128c075ac39e20" - }, - { - "path": "docs/showcase/recording/frames/0008_before.png", - "sha256": "8f87ee9431ab1c004cf43512f28f38c11682aa3ab5fbd5ad3f2fb078da7bca41" - }, - { - "path": "docs/showcase/recording/frames/0009_after.png", - "sha256": "bd8b9866b867c72eced29368867100b8f478cab7dcb2719f7e406f24fb8794ff" - }, - { - "path": "docs/showcase/recording/frames/0009_before.png", - "sha256": "c56ad2b972b9a746c03b7d304160e75951b709d793eba90c23128c075ac39e20" - }, - { - "path": "docs/showcase/recording/frames/0010_after.png", - "sha256": "3c31d1ca3a7f94f87163563b564d0284a10c503873c5a03afeb7474a6086c7ca" - }, - { - "path": "docs/showcase/recording/frames/0010_before.png", - "sha256": "bd8b9866b867c72eced29368867100b8f478cab7dcb2719f7e406f24fb8794ff" - }, - { - "path": "docs/showcase/recording/meta.json", - "sha256": "b22c27adda85e6b282919432feab5f192a0a192eeb63dc1b60ab0ce797a5b4d9" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_000/heal.json", - "sha256": "3c79aa7b3820ed74b4d45058aaa5e86fb62f9e5a4e5b243b4aca020764941594" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_000/screen.png", - "sha256": "e07e1ec0eff2b22faa826db06dff54abffb0c804811fb16cf0961073e48bd99e" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_000/template.png", - "sha256": "4930eab7cec79b52b18213b0713865488edb77c24b75fe7d48103d31d124b972" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_002/heal.json", - "sha256": "709b2ba942c7f21d83de7b99906793242919fb283907cb872f4e25ab638b4033" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_002/screen.png", - "sha256": "ffaf57d90958d13c548b3476e2a12fe47350412fd67b9c15493e3c099df0dc98" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_002/template.png", - "sha256": "4930eab7cec79b52b18213b0713865488edb77c24b75fe7d48103d31d124b972" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_004/heal.json", - "sha256": "3cb96f959a11291ab4f7ed9502407dd42016634a96b1e3f0911252664aac8c5e" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_004/screen.png", - "sha256": "0bf6ee6f7ae73ae8fd45e660017d30e20f2c95b3ea38a4851a7e7289b8a7692f" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_004/template.png", - "sha256": "de1ccbe1d5c55ff0f3c62370b0d137e6a8f4179bf520e1bb5bb2bd8fcda36a1d" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_005/heal.json", - "sha256": "aca822e6280a94cfa6c4b169f71ee2d3c26d0763431a48332f6f5710f623af4e" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_005/screen.png", - "sha256": "5e426167e56b65a7524bc378abff5699cc5432b2a304915cfef6c5b2befd4dcb" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_005/template.png", - "sha256": "b7b530e81f41c080133eee7aab8fe63b13d47d3539b3955ba917dbbe316cbda5" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_006/heal.json", - "sha256": "595214872c90e913646ccb66defbe13120464355a3df7413c38b38d111837765" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_006/screen.png", - "sha256": "c795e7d63fb4c0c23f54dd9bcd1940974e014cdfdbca52d2b31072c352b29572" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_006/template.png", - "sha256": "e755a4d8a3ce87c3d530225cbf23e9d056ef74d425997426cf9073183d133a0d" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_007/heal.json", - "sha256": "d4202e0a08ca24352a98b7841c41ee7b68635069b9228203fb5815dd30136901" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_007/screen.png", - "sha256": "a03b719b94bdd766f4eba4358ea3c3908238edd1db8265fc481576ec0fd31fcb" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_007/template.png", - "sha256": "cb50ef2994ce532121583f7564802b7538ed22452cbc3302d7709cb70ab29d9e" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_008/heal.json", - "sha256": "48fb5c77e687999049ebc57a91c5585e0bd43ce4043a8f9d1e9c8c0d5afe8e5a" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_008/screen.png", - "sha256": "9ca9bb2032be54679fa43639f3962accee68821a33eb8426abfbee18a9fb6876" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_008/template.png", - "sha256": "9dbc7f8ceaeb555463079938c11ff4f65a2296c1bd23ae6587ae1d2b257024dc" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_010/heal.json", - "sha256": "e0dbd11f0e439f217237880a0aad9a29930731ec49a8c0ef4e40c18baddb908b" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_010/screen.png", - "sha256": "4174eb2b784c375083a2fc2c70ae41f97347d346fedaa9bbef04e6a0ccd75e2d" - }, - { - "path": "docs/showcase/theme-drift-run/heals/step_010/template.png", - "sha256": "9d57264a3a457494914f926bd4edfef3531cebce998a80a3b25a5fff5958c344" - }, - { - "path": "docs/showcase/theme-drift-run/report.json", - "sha256": "0defca8af36ad0ac2cd9401bc08032d158e0048024e87ae42c00d8b97415f073" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_000_after.png", - "sha256": "335da7da554312f78336a6daed27720e9a82df2f7f30bb74eaa9b09a17bc9001" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_000_before.png", - "sha256": "e07e1ec0eff2b22faa826db06dff54abffb0c804811fb16cf0961073e48bd99e" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_001_after.png", - "sha256": "ffaf57d90958d13c548b3476e2a12fe47350412fd67b9c15493e3c099df0dc98" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_001_before.png", - "sha256": "335da7da554312f78336a6daed27720e9a82df2f7f30bb74eaa9b09a17bc9001" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_002_after.png", - "sha256": "dc63669ae11459fab0d1af30f25c73816e1c44decf7243644f50832586a0efc4" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_002_before.png", - "sha256": "ffaf57d90958d13c548b3476e2a12fe47350412fd67b9c15493e3c099df0dc98" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_003_after.png", - "sha256": "0bf6ee6f7ae73ae8fd45e660017d30e20f2c95b3ea38a4851a7e7289b8a7692f" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_003_before.png", - "sha256": "dc63669ae11459fab0d1af30f25c73816e1c44decf7243644f50832586a0efc4" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_004_after.png", - "sha256": "5e426167e56b65a7524bc378abff5699cc5432b2a304915cfef6c5b2befd4dcb" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_004_before.png", - "sha256": "0bf6ee6f7ae73ae8fd45e660017d30e20f2c95b3ea38a4851a7e7289b8a7692f" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_005_after.png", - "sha256": "c795e7d63fb4c0c23f54dd9bcd1940974e014cdfdbca52d2b31072c352b29572" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_005_before.png", - "sha256": "5e426167e56b65a7524bc378abff5699cc5432b2a304915cfef6c5b2befd4dcb" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_006_after.png", - "sha256": "a03b719b94bdd766f4eba4358ea3c3908238edd1db8265fc481576ec0fd31fcb" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_006_before.png", - "sha256": "c795e7d63fb4c0c23f54dd9bcd1940974e014cdfdbca52d2b31072c352b29572" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_007_after.png", - "sha256": "9ca9bb2032be54679fa43639f3962accee68821a33eb8426abfbee18a9fb6876" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_007_before.png", - "sha256": "a03b719b94bdd766f4eba4358ea3c3908238edd1db8265fc481576ec0fd31fcb" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_008_after.png", - "sha256": "480d8ee697fd9bf3db68762bd90af2c61c76092606dcb5abdea6558387e3cc3e" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_008_before.png", - "sha256": "9ca9bb2032be54679fa43639f3962accee68821a33eb8426abfbee18a9fb6876" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_009_after.png", - "sha256": "4174eb2b784c375083a2fc2c70ae41f97347d346fedaa9bbef04e6a0ccd75e2d" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_009_before.png", - "sha256": "480d8ee697fd9bf3db68762bd90af2c61c76092606dcb5abdea6558387e3cc3e" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_010_after.png", - "sha256": "7b761bd609a73f2ef57df376e6294360f480aefb75c7f23bd74485d302536431" - }, - { - "path": "docs/showcase/theme-drift-run/steps/step_010_before.png", - "sha256": "4174eb2b784c375083a2fc2c70ae41f97347d346fedaa9bbef04e6a0ccd75e2d" - }, - { - "path": "docs/validation/decision_triage_synthetic.json", - "sha256": "35c64a73c0915db9a50afd49d8494d9e081288a902deb0230f358a90b0b4cadb" - }, - { - "path": "docs/verification.json", - "sha256": "40232425d440bd3b20ebd418f21cf543f1cbaa0b6c38fa53984f9085612c6461" - }, - { - "path": "examples/claude-code-demo/demo.gif", - "sha256": "b4dcdf941ec450d54c287bd852993341e47bd9f99e485da69a5e4905df1f1e13" - }, - { - "path": "examples/claude-code-demo/effect_contract.yaml", - "sha256": "d3272056e1d6bac6f78e57aa5c12e63c6eba055ab79196ad5da46dce88879d31" - }, - { - "path": "examples/claude-code-demo/halt.gif", - "sha256": "91139d82dcff23a314b3097b9830223d2f01587bc2d8cc07cf24ab6ceed64276" - }, - { - "path": "examples/claude-code-demo/policy.yaml", - "sha256": "831387f3481c7ea2d064b713361cc7650e46d30caf7ab54f72608e011676973b" - }, - { - "path": "examples/legacy_records/answers.demo.json", - "sha256": "ad7454bb8842613cd93bce930a640ca1f5033b2a499b8aec3beb9d38c902de04" - }, - { - "path": "examples/legacy_records/answers.ledger.demo.json", - "sha256": "7224b959de2dc681862bd6c28781360680a9b9a809efb2f23da6965491424bf1" - }, - { - "path": "openadapt_flow/console/static/console.css", - "sha256": "24c23e7bc857eec761781388762e3d97d2506c88ea801b3f644f129064ad0f64" - }, - { - "path": "openadapt_flow/console/static/console.js", - "sha256": "9533bc6170a604ebcf86e5b56ba9082a713641466d524f20a578536ddc821cec" - }, - { - "path": "openadapt_flow/console/static/index.html", - "sha256": "388d3b60e1e8efe6542b530a4c8cdd3cdcd7ab925a392074d885a61e8d47ca90" - }, - { - "path": "openadapt_flow/eligibility/payer_routes.yaml", - "sha256": "52c620badc980013fbf95bd910d2ebca25c9f0fbbaf1dfe86ea6771446343041" - }, - { - "path": "openadapt_flow/mockloan/static/app.js", - "sha256": "5580accb8f4ecd94b48cc452ec84941da3814f0b1665bf8d239f2c241303765a" - }, - { - "path": "openadapt_flow/mockloan/static/index.html", - "sha256": "f94cc34c6b7842f3a13f1a1a4b7c1db4e0b6c37c1d8e7f8c13fc8075ac00a44a" - }, - { - "path": "openadapt_flow/mockloan/static/styles.css", - "sha256": "3a078b6d15a48f40aa1daf24152d65f4badbe67399b7f7b8a9185d53fe52bf0d" - }, - { - "path": "openadapt_flow/mockmed/static/app.js", - "sha256": "437d6bf85b1eab0a45e0df1e47c4fdd7fd0c56bce39b270099da93ab1c02f0bb" - }, - { - "path": "openadapt_flow/mockmed/static/index.html", - "sha256": "26d68e6601212a6ea63b87cd1cca8915b7d46092ad489dc78c0a0f71a56fa9c6" - }, - { - "path": "openadapt_flow/mockmed/static/styles.css", - "sha256": "8c38bdaf46eb238c95f75ae0d55804b690cb09cd123068074938e87769385fe2" - }, - { - "path": "openadapt_flow/mockmed/static/widgets.html", - "sha256": "ad434660a74e5fccb2702d320839177655b7e30236919b7a7d8b3119deb67999" - }, - { - "path": "openadapt_flow/mockmed/static/widgets.js", - "sha256": "e144e135e2e73bf7069205d1c7f5e377670070a9c32e3c54244337b75b2dc6d8" - }, - { - "path": "openadapt_flow/policies/clinical-write.yaml", - "sha256": "e6c782bd22b12a29c5ce9a6dada66aa3c37d965340cc0ed38d49e15c92353b4a" - }, - { - "path": "openadapt_flow/policies/permissive.yaml", - "sha256": "7df04666122b6a84f38ee864333b4c92ef6ec1e289be427259252ff7ffe292c3" - }, - { - "path": "openadapt_flow/visualize/static/program_graph.css", - "sha256": "2678cda69a8305a3646979a1cbf80d229aa36f8ae3c630e933cbf83281a7ddfd" - }, - { - "path": "openadapt_flow/visualize/static/program_graph.js", - "sha256": "468a2849dea3027ca170429c320898c9a5406db5c44087706c349f8f9cb6c047" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/manifest.json", - "sha256": "2fbe1c61e57d8503e9c6766882aa3e96b1d3ad83708445049b5d911a888e1839" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_000.png", - "sha256": "46a75b5d63ceaad4bee942ccf2a6ca3d2b4f6327509df7eff2cc7ddb2c9fd389" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_000_expect.png", - "sha256": "337e403fec476cc955bcf5f1d96902119d9c2fadc03e201c0c2fbc2475d03646" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_001.png", - "sha256": "9d17fc905b1902add82cad885c72fe446a23e0334fc4db58592d2369e85f26a5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_001_expect.png", - "sha256": "ccbbb335c8160188198df18beb48bd88082b7bb1e5c1cd987d6766afb62c0773" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_002.png", - "sha256": "e6a0e0718b00c26280e32928b744217d00a7e010ab9825da27724e2debc9b805" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_002_expect.png", - "sha256": "f66608f19f3acf0ba8d86a39ecdd04781eb320787885039ab1eefee3835c83de" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_003.png", - "sha256": "2cb01de3e45c7c6cd6526f1b6f9c1a4f86bee1a5e4f8e3f6fbf7150470cf5f2c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_003_expect.png", - "sha256": "68cd40d6bd0abdf81beb40dd4202bac784a4b55492f803cdd5fb1e7ab8f76941" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_005.png", - "sha256": "5d8163520ba8355f44ffe0cd06a26be6bfe5d6660bcff1395dc82d4da3aa0ac1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_005_expect.png", - "sha256": "0919dca8fe883ad52eae6359f9da3494cb57c68e006ea4ba314d61e15787ea47" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/workflow.json", - "sha256": "aaa20e1e002fc6f468ae3e859932c47930317a418b117e768b6a8ed704959558" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/events.jsonl", - "sha256": "a91f85da34bf137e7fefbb1d5ec7baddd9a2256d931cfdbec238bdc52a7559d7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/halt.webm", - "sha256": "b2c811ff0b09a9581c34c1fa5524158b1eb3e204d5c63b3dab82d668d34a6576" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/outcome.json", - "sha256": "a7b667ef5f71d8be0e732c532eaf19fbdae23146eb207c6e3e06d839691abe28" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/checkpoints/_manifest.json", - "sha256": "402f4361bdae6493aadbf65566eb5841074910d5d6b432c7d7854c3124a9a7a7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/pending_escalation.json", - "sha256": "170d58083ce390ded498edb1427088716150ad2ae6e3634f4e6677c1a917fa85" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/report.json", - "sha256": "74986c72b6d04c81ec3ec781a9d6f203553d5657c114a9649734da5489161b67" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/events.jsonl", - "sha256": "745d5621c909d11df8b77107c80df517ec9f91e12e20ccfbbbba39ba7e0d294d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/outcome.json", - "sha256": "a4e96a22cf3d287daabf7d254e1356f7079f42616bd9644cbd46df52b5baf102" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/checkpoints/_manifest.json", - "sha256": "47f21cffc006271a1f8271f1586373fb0cdf500444f34cadb3e065cc4963f10a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/pending_escalation.json", - "sha256": "9dfe2dbf62d903a84c215c6021888f2e9dfb02d3f8e540fbdaee0a453b3b3d3f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/report.json", - "sha256": "58866879d1f61049927609ec341871ef90396aca07996c04504d153d92b675c4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/events.jsonl", - "sha256": "75fa66b5308b61bc305efaa0cd5e4ea5a99af8a3695888945b8e89fd19616d2a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/outcome.json", - "sha256": "f455d82abbd11f32f1a8beee3bd9fd90dcf414921fa4de5d2cefce0e59b2ebe0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/checkpoints/_manifest.json", - "sha256": "40d7b3028f47cc4bb9a22f42b132c06ae162598a8608809637d76a75fdbbe82f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/pending_escalation.json", - "sha256": "1fa104cdb6d6f9702af4c5a5df2ea52e37dbd5e995e0caca021761c65b1d0221" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/report.json", - "sha256": "2a3cc12faaee8987c9e3c20b7575935e09ddff7e9426b4121336160b57422ea4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/events.jsonl", - "sha256": "bfad48babc94d76a4cb369cb04df6c8e38278143f64536425e179f0344a15bf2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/halt.webm", - "sha256": "af085356dbfed4cfda483df07fd9da088c349bad28a9261234da5358732f7dff" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/outcome.json", - "sha256": "2b8d8c9f598f74493d9c0d6599d861620f2c559cc8ded9f2f737149f27375346" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/_manifest.json", - "sha256": "a95db0021a2a06e1633943a731821d072dff141830f001c84f9e5830837f642c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "021a1629c261459f8020e0776b4e1ebcd5318f9811942abc99111cdc5afd3c08" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "c76df2700a638060e32f40bc14eeed486764397f8f9be466c035cce9a90102ff" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "25c8a2afe9d15ba3260c9a437debc1631a8c9df4c918f8b94e5185536c328c80" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "07ca61c2b31b9d6e015e5106f11dd253b9ef4658aa46d7b13c202fae76b537f0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "bb1ced741369f03e62e2c0dbc35e2fef31957be76b4556cbc507df247a326937" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/pending_escalation.json", - "sha256": "167bf8bf4534ad32b91a079d876e90ef3ce173bbc2c40f505519a2be176f938d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/report.json", - "sha256": "6ee3f3a9d4885fc985459db9bf61428ffef3093cb0530c1c744e922b3dd8e0f7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/events.jsonl", - "sha256": "89bcd660d929e6b1d938c0ab63fa3842e3ffaf6f07518497f5888049fba00049" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/outcome.json", - "sha256": "a2088a27c79d1fc0eb5baeac9506e39c49836b65070076daf8ca2c38ee307b0b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/_manifest.json", - "sha256": "d5ea75710a00ca21fec0319fabbf3b6866bc76456bf0c5a15313bfc2d3accf35" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "73217ab6b6950b070de134ff3f6ea9263aba3f86d747c5708edc4cfee06fd29a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "c154717b563431736de526f9b68d4f0aec2cae14563a0039c9bd50ad7879537c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "c7fc94e3b22d37369181faac1ef3a67d0db8fe1ebf530b34b0911fc42711ede1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "bf2652ee11e6749f2c43cc9d00d027cb34cd0888d261bd8ac89588653858b855" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "41dc791d39eaf7d2f5b4c75077750e07c824ebfc325a4e7781773aff67363a4e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/pending_escalation.json", - "sha256": "f79bfcf68c19412460a428dea76124da1b7554b595e9d43f13cb9e4b3547c69d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/report.json", - "sha256": "6afd1bdbebe933411661dfbab4dd87d18e88f6e014ec9137dd2c16f0db786e53" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/events.jsonl", - "sha256": "15f1cc1b34e437c82b7f1709eb81e8546cf3a4e6ca070699468aa079aa8d0cec" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/outcome.json", - "sha256": "8e794eb9fa3c8986866ce638274d8cd3e43dffd1f1f3d7648e493045b010ef0d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/_manifest.json", - "sha256": "4343feaa11c4eb5852854a1504bb47476f4b00397d2387d58f641ab58b5f284e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "a90dd22443765ce622158ac803f0b985368289bf843233790b68a89a14e82e51" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "8e1c47048d4eaaa09fd2279debcafc0daa2194da3bd67041ef34ca27707d54a2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "1b9097d0f89c0e3814cd6738acecaed8f6dc7a0c1a163e820165407edf32f86b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "8b06f5f3eaec1425872b8b58c3b55dafb32c03ca0e70417687f3ff6fd0753faf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "c0c4f2000e4081f50aa40e5a3f07a3f78a0d7a8167f8b82ee95586bc9ab32bbb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/pending_escalation.json", - "sha256": "42fa56e4f842a976af65b372c02ae9cf865f409b0a92d45076aa1dd43a69a22f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/report.json", - "sha256": "8db86671e4a201a7f5e23b8ab18227273c786c01e167370c5ce93a7bbc161a40" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_before.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_before.png", - "sha256": "88c5c3e8d39579d6e11389459ae38256f57a12841526e45990dc52f4401d0870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/events.jsonl", - "sha256": "e9aac6e38059cefa2952765e3692ae2931da17c972ba8ef06fc57022c49bc224" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/halt.webm", - "sha256": "6af5729a96f281f1ca386093850ababfcfe2dca053d0c58c2c56ce5d73052442" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/outcome.json", - "sha256": "796f142a0c70dd5cd8f7b80056c46ac311c5ecce9ff391f02d6272792907cd2d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/checkpoints/_manifest.json", - "sha256": "8c1adecee37a37cba1c222aa808dd11f4661d76aec960b9b48495dfaf7a8eb98" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/pending_escalation.json", - "sha256": "2eb0ee92bfffe3ea875cb22f0700259a22f59ea2834e61b200b6e26c1b99b17a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/report.json", - "sha256": "48a3419a3b9ae758aeddebc180905c67e0b867775a438466677f3005fafaeb29" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/events.jsonl", - "sha256": "7561f07fd575bcf435cdd77cf127bd3a250b430bea15446612d3e62b4ba046da" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/outcome.json", - "sha256": "8e16c38d68ebaca89ebba7c11eea6879d65462ac226ea25b83ccaa577f1c6bfa" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/checkpoints/_manifest.json", - "sha256": "e79bef782af6134a7c20655534ac06e2b863c644cd32051b3acd6b0f13434722" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/pending_escalation.json", - "sha256": "4ae9f69b4ac3556ef7ba928fe274c792b8a18771b5907c55449a0e7332e438dd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/report.json", - "sha256": "4d97a3f308a1f911ea1f61ce46f086d96aeed89e93d2c4477f48cbbab6a6f0dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/events.jsonl", - "sha256": "7885340649d9945067f42de615391de1323faa7ca45bbd41f087e35b6224ec0c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/outcome.json", - "sha256": "d17831244a79a52a43793ac94fe1b3238366d017f3a77791cbd756468837ea0a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/checkpoints/_manifest.json", - "sha256": "c75b88b5e6649c77a595f560c49ba27fe5c50b349ee7753d8d70929bab238be1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/pending_escalation.json", - "sha256": "d8a8e5f55746c525090aea8e86a8e46c10191a04cc709a42c77e5ae92c149b23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/report.json", - "sha256": "537ba9ee1244a5d915efa4976ffdf595a1eb8e2e09dffb42f25417e68dd8fd53" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/events.jsonl", - "sha256": "633fb2c63f0a72462b11739edfd88dab2e8b22e39287379aac636df636d4dfc2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/halt.webm", - "sha256": "b1f1dd8d11429d3ffd53a488c1d5ad34628532a67fe1cf27918dd860ddc5024c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/outcome.json", - "sha256": "ea9ea406feb5347e439cfb871252694740ecceee96f63b1b363b0bd667396b0c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/_manifest.json", - "sha256": "755b2005281ea8368f0e9d47faef151e4be567c8b5b7bf41c7867e01270feb8d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "c6df9271008a6c249f39c07f2528614beab2d4534d912a23cf67a24815339274" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "419478aefecc0e2ef0de94e26c3d3486a180bb334fdbcd2e4b46e6cb5d25e9e7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "b0ffa29ab535c7cc1be3ec91649e52769cde3252aad6b0bbafb4cb3887e1c5dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "0d60d10559cbde9ee4f7d5cf24a179ef325dc6e139e0ea1b7c9362c0cfae1395" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "69603bd9f7f4dba1f05104f5f747ab172f661ab0ad0af8103acf2b09f773b0e9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/pending_escalation.json", - "sha256": "530ba990d12dd6451132f2cb85fc9f07a5f0dc373ebc1b84367d069808693cf3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/report.json", - "sha256": "81c547d418928f12689060ca9894f2527cfdc5e868535598ffbadd5bbebed1c0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/events.jsonl", - "sha256": "032be2368e17a3241d1e3f70c708e0447ade8746651556249167b67c5a7542da" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/outcome.json", - "sha256": "6cdeb9ceffed7128107a6833e9864f4b0c4632d1a77906d6fe7f911372529291" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/_manifest.json", - "sha256": "f4c87b5c9083452c9a191d95898fbe0c958b536d501390970928c03b1ff3d927" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "fc31374ccc89fc29c81a03b5c0c54c3329bf5862a2d9be01517cb6ba8f8e06d3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "9fcc27f0f66c489ccdef9546dd69f87b60c8fe5f17772976d9aff3f43cc69ffb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "11ae40e843f182790ae5a764f11de1b880f0119865a04e9fcb9a429112445df3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "b1ae21b9c91a56680ee525068429975032976938b0eaccca1bee8a27abfa5a57" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "46c6821814b5c063e1b8b46de54a4f54b1a56e768eaf9f4f3ae554e25e424976" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/pending_escalation.json", - "sha256": "8458c1138be899518acd61e48569178de75f90bb141ef7ae4547b5c9c1cc58e1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/report.json", - "sha256": "a62ded23484e7eb555b1f3041503bdb78ed6ff4cdab009a16cb796b21f1bcda3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/events.jsonl", - "sha256": "5b459f5820ca32c337ed3a8e88f02451ba10fad123456bac5cbf7dd396e89b89" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/outcome.json", - "sha256": "9c4a4df37c2289a30e66ef59ae2b650155295a3aa94fdf13be91d8374a2fb974" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/_manifest.json", - "sha256": "d5bce51741674a2e4bfa25a84a88e9e96de6fc3e34e6771217e2e626730cffd5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "d7c1b40322dacd5bbedae128b5033bb16cb0877d1034bfa8c6b9c46271edbf3f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "4bb9672b255334681185c4ad07bd0a3398f15cfea3f637e35beb241d63bb9f35" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "e097b6b258fab090af0de42f3a997ecc33d65ef82ca93dc42b5302c7f584fe98" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "37ac80619b2045f665e74a57cc1b6f090852f80c48c8806b88399f948f623399" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "0dbf703d890bc6e0b7fb2c62ef57fcdae1916f8a1e76121579f41d9df4b80e6d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/pending_escalation.json", - "sha256": "c29d4b6f25db507cec607dc3d9181a016060d0e929172182be2f0ece27d07e90" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/report.json", - "sha256": "367862f0153857358692edd1dc5c7bc1ccdc7588b93156ef658905634d1c937b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/events.jsonl", - "sha256": "50acc12e737f2008cef9ec8d1f112606ee4c20e531d169ad07c240de022e7a84" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/halt.webm", - "sha256": "b15e927a6828e4154649d26d1ac1b4de6f11841f0eed94c5a4ae66097bef1197" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/outcome.json", - "sha256": "04bc1bc124872ab6540d498525723a8d07a52dca9800a8d159452eaeb402eb66" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/checkpoints/_manifest.json", - "sha256": "9c6771b23b3885c90c5c7f5102d0733e1d442cdaca08969e2bd5eb7cc4820f14" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/pending_escalation.json", - "sha256": "a77e34a43dbb037a2adf1088f4a7abf052695a8120068567d4b9e43252559aaf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/report.json", - "sha256": "ed06ffa2c5bacce6f323ce0c64fc8af3d1b5c4039c50bff45b2626c465ceb387" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/events.jsonl", - "sha256": "cbf4f6047d7f8b3fab5052e5b03eaf35347169499738c5b7e3c8ab97a7ba724c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/outcome.json", - "sha256": "5d0e20ff4762e686c381285fc6d1b97ddc44b63a886267bac382a7411585b3f3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/checkpoints/_manifest.json", - "sha256": "9031ea02f167cfc1239ad355baae03e4e1f63cf90e47862fe10fd384ef3ed94c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/pending_escalation.json", - "sha256": "41ab84741261a05fe08c99690291205621647ddfa77adebb97aaa6bd65615d3d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/report.json", - "sha256": "7689976a15d82fba1c2392121b740d8863c4ff7a9302e756605f1aa4dd016993" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/events.jsonl", - "sha256": "437c31056ef7bfc2cb3ad4369df7230ee6d52f88b33bc7857359e7338e348b88" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/outcome.json", - "sha256": "0fb2e929fa47075806f2dc5ca19e3fd6e898cee4b92632f8149078f530e1409d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/checkpoints/_manifest.json", - "sha256": "ced455ddb18aaf0da678c20149c4c5ca89dff7e619ed629ef7343e779c1cb5fc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/pending_escalation.json", - "sha256": "d16b8db6090f59b1db0c595f438372b2ee465c5d2de720ba6f74a776d725ed26" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/report.json", - "sha256": "2d5f01bd01327a391083494abffbd6473358c58a82f1dff0ff8dda5fedfc5ff2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/events.jsonl", - "sha256": "67b014adb846fda5d9cb824b416ca2f04f48108ebbcc0749fb4836e47ef558b2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/outcome.json", - "sha256": "742e1fe45d5be237e069b31c48a85132c04fec1fd3384c8b4c9a0f896cd5d718" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/replay.webm", - "sha256": "bcf4e20e50134e84529b28312087b077ef3f0c1c3e519e9ac7a4d9e657bb6069" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/_manifest.json", - "sha256": "8bedccacf1bb90a1d9d62a43ca8bb686d8482a6b4d43b3b2ddf692f471dbf58b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "0d33b3a61e7f7778385042b83c6a6c494becc44d1c0a93f5307fbd6fad3f7c0b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "b9e4600a232808f12ba13d8e5953170d88ac50f84f026e0a72bbbe0d2a93b810" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "cb829e0f3b78ab9024bdb951339a02f8bdd8f3c6cbebe23fe146931776ef50c7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "05f29b14246e28c58097fbd54c60316a3d1303bcf9cc99807f5700e5281f1dd7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "6421c2a2b923a99f38891f6e248e40f19b41e2d0314092e55ed0b46e5f16a81d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0005_step_005.json", - "sha256": "8253b6e9856f5abe21086fc68fed920bfb2ccec8e04815283ce541673b1755bf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/report.json", - "sha256": "79bd5810918bb6e71951dd7ce159736f31844b94333e249e5b001de5a5162672" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/events.jsonl", - "sha256": "b80f49b8ab554e94060de9b8a42dc9524e517524e2134052eab658919892cdeb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/outcome.json", - "sha256": "95073da10fd8a52a507b79a940d8b95d501d51ea44cb9d1705fdf5144e719fdb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/_manifest.json", - "sha256": "b2e72c0466b9aec50540ee064b89f84fc30b991901aa4fbc2c7b3870ed2523c1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "f6bdd8910d62fc2a5b3f898c128152c1245583c1cd4e4eb677601850ad23f0f7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "8da155ff11537ae7b903cd9f210f2af12130b69e0b7e14b0403bca898734b6a9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "a871e7dc4b53f916333249564c3d598625d5393d834152d39732b31ac0f505b5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "3c59c822b430f3121f5ab9265a4364c1c5424d44e375877d7fcdaa650e1b643e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "ea1400ac50cce1774d4794ba78393d33642b1e8f56f2e0b5c9e0f8a6e37cc55d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0005_step_005.json", - "sha256": "0ea90d5e9b5dc51b6acd635d00e9a0eb9bcb269a1a6b2691ce7c86745403f1c9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/report.json", - "sha256": "cd2fb589653040363ddde5ca0b162811c3be97ec03e7bcd0b555967fdee5218b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/events.jsonl", - "sha256": "40a3b4795527a24c5b34a84baed1e5d56397d528755e7d3a07cef39f70d50797" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/outcome.json", - "sha256": "6770610a0903ef95e2a85dca6452e8feffe982f5e141e4a5c81ae82d1c2975d1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/_manifest.json", - "sha256": "e703d4fe91090f2a5fc3a0cb9f02e7190ecebfdcb27716b9c74ff243cb9ab5b8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "57f2f566a5ca77972302f84121dc41d8770822350436b6fc3e0af526daf98102" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "6bb15c7a1e841e198171efbd1801e1528969e7ebf119cbd324a85b909def2934" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "4c2a652a9567fe6e784d58ce9d82a10a7a9a09216291b3aadd8f08b8b801debb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "cd7270772112bb82582da346be78dcfe8550593e73672b68aec6eb1f292e21b2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "4d71b5d4b0449b63fea61b352ccfe8e0f515b155ff5a3053505bcfff67d5f8b2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0005_step_005.json", - "sha256": "53d795fffd5bdfd0511abffc4dff1ffe975a9c559fd307037967b3dfc491d2a3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/report.json", - "sha256": "f7f3c4cd74903f3e5d48767dd4f24dfe5eaf1d3289f42e073e56399fcb4bf31b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_002_before.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/compiled/program-graph.html", - "sha256": "c4922ed220fee77bea676d4e9a15c797685573e5d31ff6616f80d3223caac6dd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/compiled/program-graph.json", - "sha256": "0c346b7bb23ad508d1731655c2c7e7947776fcd6256334b3b6fb2194b477e461" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/media/recording.webm", - "sha256": "f15bea447b26fd2c9f55c22d0e8e065aa4bf009af779a1b8e75be808491c908c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/qualification/project.json", - "sha256": "a6819c3dcf91d99ecb325be3d44cca6404dae6cb134c2fd8187299f1a95490a7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/qualification/report.json", - "sha256": "9c19080ca09ece90744092e5af492b8058db527b00324370fc33f984e761932c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/events.jsonl", - "sha256": "bbd1cf7c7d8a3ad09d1f5a4b4a2373690a16697c2f3702ce55f2cd22a159a0f2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0000_after.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0001_after.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0001_before.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0002_after.png", - "sha256": "8d2d2d2a56a8d089b11f1e97926c06f0c1d7076e080d0ffbd70b0bf1691aeae3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0002_before.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0003_after.png", - "sha256": "8a3c5f2a1a6d1816b42227a818afe24a0c1d7362791773cb6f18d1fcd1b314d9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0003_before.png", - "sha256": "8d2d2d2a56a8d089b11f1e97926c06f0c1d7076e080d0ffbd70b0bf1691aeae3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0004_after.png", - "sha256": "d4da8dbaf7fa257e89d78a08854ccd50c8277c3fcb12efe2614d3fa4508a3026" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0004_before.png", - "sha256": "8a3c5f2a1a6d1816b42227a818afe24a0c1d7362791773cb6f18d1fcd1b314d9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0005_after.png", - "sha256": "09b63152f50688a01352cbab13a1ea33e2d837b36180c866849ec4cdfaeaa599" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0005_before.png", - "sha256": "d4da8dbaf7fa257e89d78a08854ccd50c8277c3fcb12efe2614d3fa4508a3026" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/meta.json", - "sha256": "ee8971d171b963a383e45cccdd7aba1576ac01d20777c4fee30b93b1ec7b7d0f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v1/manifest.json", - "sha256": "4cadee17e091a1edd7a8db4b7a3a169f7fc767b70955611a375f67e3559c3e04" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/manifest.json", - "sha256": "0ef1524887443c0dfc5a34d83cb01e159b97f808ec5231364c17fc442f56fb33" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_000.png", - "sha256": "46a75b5d63ceaad4bee942ccf2a6ca3d2b4f6327509df7eff2cc7ddb2c9fd389" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_000_expect.png", - "sha256": "337e403fec476cc955bcf5f1d96902119d9c2fadc03e201c0c2fbc2475d03646" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_001.png", - "sha256": "9d17fc905b1902add82cad885c72fe446a23e0334fc4db58592d2369e85f26a5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_001_expect.png", - "sha256": "ccbbb335c8160188198df18beb48bd88082b7bb1e5c1cd987d6766afb62c0773" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_002.png", - "sha256": "e6a0e0718b00c26280e32928b744217d00a7e010ab9825da27724e2debc9b805" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_002_expect.png", - "sha256": "f66608f19f3acf0ba8d86a39ecdd04781eb320787885039ab1eefee3835c83de" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_003.png", - "sha256": "2cb01de3e45c7c6cd6526f1b6f9c1a4f86bee1a5e4f8e3f6fbf7150470cf5f2c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_003_expect.png", - "sha256": "68cd40d6bd0abdf81beb40dd4202bac784a4b55492f803cdd5fb1e7ab8f76941" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_005.png", - "sha256": "5d8163520ba8355f44ffe0cd06a26be6bfe5d6660bcff1395dc82d4da3aa0ac1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_005_expect.png", - "sha256": "0919dca8fe883ad52eae6359f9da3494cb57c68e006ea4ba314d61e15787ea47" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/workflow.json", - "sha256": "4ef8527936c7ffc2faf2adabf890e8a367114d32093967d19bb55c259355ac5b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/events.jsonl", - "sha256": "bca25dce7eec8d9317c4a7051aab40480c15ec12db5a3823041181e463043a40" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/halt.webm", - "sha256": "79b525fc6a16982c3857165704b1391b0bf289957870efa9ed2781d2c7f6a5ea" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/outcome.json", - "sha256": "994084c556b8526f527dfd29e1510d51951267cbf9f4c27d462768524dad62d0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/checkpoints/_manifest.json", - "sha256": "b37710a9517e73b8d3202ddff5c33dfba9caeb74e89e725b7896b73b3816db6a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/pending_escalation.json", - "sha256": "0fc05f338c89ceff783b9576d122b6405db2ec71ed65ef3316923839425fd746" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/report.json", - "sha256": "1ea81f2b2e0c5ca131d93da296a1d10e46ddc979a1909f008dfb4eb5d811b8cc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/events.jsonl", - "sha256": "f784f041b7be966d0b7de823d0223481d0c79cc55b9bf26a5b2d7c96ea091a61" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/outcome.json", - "sha256": "5966478ae1c6264970e62b0e39e8e7c2f3c17f581249434a1bf0f79b5ae29a7a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/checkpoints/_manifest.json", - "sha256": "291e09cbc13a33d81f036b92519a6d6a8ef8c8a1eb42bc888fd7c4da3abf75fd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/pending_escalation.json", - "sha256": "77b7e14673f6b8007a4b06bbe342c8d0117286219ff2b625794a47aeba7d0188" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/report.json", - "sha256": "3dfed0836d32760af354c7b5707633a8d2bd16d315227a5d1dacd810705d7fe0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/events.jsonl", - "sha256": "8e32c74b024b2082501ae1c0251beb2085989089126666b4f9086ef20ea07aa4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/outcome.json", - "sha256": "5f1e2420b9328186a3c6e8eb2f382a0ff9e5c145bf64e4b54ad92a4691b57efe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/checkpoints/_manifest.json", - "sha256": "56da846a7b418ee5cf3dc03fc7e635dc7caf7310ac453297eac2c0f5f59fa665" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/pending_escalation.json", - "sha256": "055d2952098abcaccaa27c9619172506750263e98d7ad2442fe55faf064c3c53" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/report.json", - "sha256": "b9e853ec626d957ff5e47538d8431d5de26884619286dc23e189507fddd7b434" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/events.jsonl", - "sha256": "6ac475acf54bb53a66a1b2a044e318be7e130ded6a8b87e15aedf782d260c147" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/halt.webm", - "sha256": "0d513a530baf60d04bf135197e5c5da83315d85c509969f8da3538d8dfa96c86" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/outcome.json", - "sha256": "bd46af7d757dbaa8666a5d38130d0ffcc0883088fc49db4ea767b3141e51bde2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/_manifest.json", - "sha256": "961ad9d5ac55adcba4c5ebbb5aa9fdac4be485dba538ecf3655cbfbacf4af3b2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "fdc95ea5a6d8d05976a448b37582ddf254a50b9d0d9ef55468412618734100df" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "d767c309bfb0b49b36e5f0020aa6a8413490c2dd12ea8e8706e4f2caec9330a0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "74e4455e3a764443a2a3cfdc249ebce64ea7b07bb62f93ad0a16b0c9a11c03d3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "5aefda29116e53d5a006d8ab5c789c0b5e31975414ddd8fceb7673a096077995" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "36c98dc14a3d2bc0ed2c27153518889bfa44f07435c8c082ddbd5985bca0cf1c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/pending_escalation.json", - "sha256": "c923a03e9b7258575eb8beb0600b0813374744d2cf8cd5abdec72783bded734b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/report.json", - "sha256": "4aefb7644c82ee9c612beb1313a22fddb6fc684f8d616405de483dfff9ef1b76" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/events.jsonl", - "sha256": "085e1a5a5b3ecd020415e6c171010eb65dda6908d2a82042f2843ac27e56428c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/outcome.json", - "sha256": "17c8afbe9a529738313530cb4f446623dfa1c2e350d651e2c066137505b87b9d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/_manifest.json", - "sha256": "f5997555e7ac2c8d06d5eb6ad6fed2d2a596ba42f1dd77645a3ca028050c52d5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "da1bfbf129fcd12476756dbd0c679ca646810877efbf90cc592236d3f46032e1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "3873bf18654ec2fc0e4c0f67fbf78f987948fb6e9878835acf5a1de48ffcb2e4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "46b0ec25a1de16c1e9d4e9aed79657d1936f2e8714604fddabd34ec09dc38ace" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "ad494c235a1b44e4f0ff90bf68d6d7d59d1c12c4e4a5728565691a93f97a99ee" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "d0c7717c292b276a5be0400ec02dd69b82e75aaae379371719bdf8ee1da41fe8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/pending_escalation.json", - "sha256": "9706c419b65c651c4f8069ef0c37bbae79fe1b5bbe1b2cd65e27c2afc2cfc078" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/report.json", - "sha256": "97a59c886579c76349c8a8492b23eab401494c3483310845e9fe93c1a9d2950b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_before.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_before.png", - "sha256": "58f1714e31a3f511b5310539b433536169163c74f224402b7dafed32588d0c72" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/events.jsonl", - "sha256": "1cc6edc693ccb131a7f0dcbeac4ddeabdd5306053f464b4db7f826d012a023af" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/outcome.json", - "sha256": "f3c5285249d64d97bbd7e770d8188638cd3a1b07c223575d241e7a024a1e282b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/_manifest.json", - "sha256": "749fffd95654417bebb4740267624733b4574358c65ee5d05f69cead9f8d9bdd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "e149f57333310371c06f8f8104d46be896a6ecc93f4e6be2335df8f839387f93" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "b7ebc9b8f81c91a0d6ce762d305f265c67610fd1184a40c72243a0c8313a4f6b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "80bd73a0055af90605d0288ed7f65a7cf623d127bf5a012af17e0e939d429756" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "15d55f1e29d95398eb4ac7b8a6b28c155cba36085f7d1bae726dde6a4ed4f1c1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "9e86ac0d33037f732f716170573976a70bcbc6a7989610a27551d904478715d8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/pending_escalation.json", - "sha256": "bdaef4dc495624c84baa5faa2c2cffa4fcee7c5d5d36bf88782aa26dac6b101d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/report.json", - "sha256": "0fb36dcab3d016dfb888099dfd547eb10b79fea91a07d14a85d3099dfa54f3c2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/events.jsonl", - "sha256": "96880fae22a6d690bb318baa57a694df8104ec7355e55b8e282ba4068c574e61" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/halt.webm", - "sha256": "11047fca0880108a20f2f6465cde1270b223663a6dafc94cc0c94cb1dd8d6a3d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/outcome.json", - "sha256": "2b5d3062475c47a175f074c17ec44957e495775bc0ba9c03fad6e5c10ed92b58" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/checkpoints/_manifest.json", - "sha256": "405d0990ec45f8833c3e5de21bf57b44057213c2693b2e8552b78031d8dc821e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/pending_escalation.json", - "sha256": "665e62b0004c106a216c78f2ae3939eda240be96cc9060ddbba62ad8b9fdc55f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/report.json", - "sha256": "31382c1ff3093502a4367a4bc5bea51390b81380c94b6ea95659643c7b228a18" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/events.jsonl", - "sha256": "a0ebcf9f154d4da1c8eaa2b8e3896deec10118ef4dac4f9953d2bbf7947f5133" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/outcome.json", - "sha256": "7c03f4881164737d20073fbdca0a8e39b969a4c4f7bfa40067c928c149c43972" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/checkpoints/_manifest.json", - "sha256": "3a62f7e6b2d49f11621e344930f71c98791670b0d2a1b1c941a3648739774b5d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/pending_escalation.json", - "sha256": "da4f53a061778590ada26cef37ea4553cd6df3797d2955c9818a287c6b6d0c4f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/report.json", - "sha256": "97466e8690b69550a1434b1af1238347691143fd8135b8eb2d6fd065eb6bc3cf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/events.jsonl", - "sha256": "bbd24b8c3193f70c0664b1139630012450db8f6f6e911f9dedacecbd256052f8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/outcome.json", - "sha256": "b675f4636ef56ade2f0577000addd22708c148264e7804a2d342fcb93d3903ed" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/checkpoints/_manifest.json", - "sha256": "74d91097399b80efe950282c12750f5cd5e48dc13e1390a5a9c4a34bd2ddab2d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/pending_escalation.json", - "sha256": "ac3edf64defd878206ba6e02d696fd2721bc5bdc16b2a1354a92813a00fe749b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/report.json", - "sha256": "9816ba074811864007349872d625cecc6abb630bd2915b1589014595ae66c870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/events.jsonl", - "sha256": "806d8f76c5a5433b092a3f56e761a3cce0db18134fee3660553a8db9e97750f9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/halt.webm", - "sha256": "9304add04ad97d35dc2cb698f5e1340305d53e34bdef2e86743e26fab53201b8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/outcome.json", - "sha256": "07cc9eadd6316d75555ded488c281d807b81ee5fa479e8f452981312b463857a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/_manifest.json", - "sha256": "53f712f193d77e187fd2fea32dd9e2112e95a624c84ecd918ff5bcd27b62b350" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "20a99dd925623a11b10201ff8d7cb159ac3f0198eafe4a0304d49089ca2488cd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "da253abb169e086b93b3d3ed97f5f540fdf0865d029737d1f91c4d3f3d077f54" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "6b1197584384fd42e7fe84a46058f30d9aad8fc8db97b0dd181740ffc5b95f74" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "6881276f233206a50cb45e14697e5c4f837dabf7db6d42901893a15b883c4590" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "32220dcfecd9a959a8039dc430c70ee6e88c37537714a7567ea091828e758dfa" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/pending_escalation.json", - "sha256": "b7445ef86d05023051224b3cbe69fc1320390046a8a2b6d619cd94d353b88e4f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/report.json", - "sha256": "e121033fd21b6c140faa27d2cae7d2621299ec3a9be910782c021d03c0e75fd3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/events.jsonl", - "sha256": "5bdb4b8baa29c4a0684aea2f0674b1ab5fc48540cf21588e64d5e4d251f711cd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/outcome.json", - "sha256": "41ff098d8aaa68e56529b4ca348214db1177fa1b30aab4b064f71b8bab3c8883" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/_manifest.json", - "sha256": "1292241015cc3ce3958895b2f66930b3028c9f9e1db58479f09f804a01c6030f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "dfba008540e89cb6e0ebd74f8304d1102fd8036c370c56e7ca96a88961b6174b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "b3761499be3563855dbcbc67b0b0ea52007cbd4cd2b3fba0c75c5f38f1d7fd81" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "e3733e0b1ffd97e7f80a9eef29a0f51b7d7246c53318388d78a82b189fbb7c90" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "a19808c50c7e043560681fdde5c40d09afe47598bed1a3bdc100cf03caaec2ee" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "85ad02995010e964d3f21bd21020d1d71294ca576905689bc7d4a3e4ac6dd072" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/pending_escalation.json", - "sha256": "207b430a5a11adf1d18875d40c8810a5b4e8ebb83c7564e052e064d6e368372c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/report.json", - "sha256": "6c3a5544225f8de2d4755a338bc34a31f536b11f920b5f0e7f5e3938b3ddd353" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/events.jsonl", - "sha256": "7e9d745ec20143f75d7584cc4c2f8edb8a654c98a4d31a2dd7d6d3db9d8071b2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/outcome.json", - "sha256": "4be7aab5c8b382ce6c992a203eb5b5a36a2269180f4f78be4885bcb125cab24a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/_manifest.json", - "sha256": "e46e39f91b90c9e0a060f2b02fe18b8b7f11c3968e09db5208d23b8912e9238e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "208e65a3328a1b59a90a7e48bf460006c846a28d9627f1f84c474e82868223f8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "ff275b16c86f6c0849e9008b502c0f73be000fcfcd7bbb3f27451e84b55e3dce" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "10d86851d88a005f2d34bf73a7b7f02f331abfd1d0399b06ac70fb34f885f7d3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "8afce529dbed281007219503ace2e585c443b53bb27a0a576fad0e22407e8b4f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "286b04b16e201091cf2913c46cadeb41299b451be4c4940371bb79723e05c7cd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/pending_escalation.json", - "sha256": "14b9e0a1169466ee4e896ab8d3dc4699e4ed750536caebc660093698a8ad1a4c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/report.json", - "sha256": "d9019ad84bc604e412a07a06362523efb72bf9516642dc2a4b843aeee4a80a3f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/events.jsonl", - "sha256": "d158dded31b9256c9c1454e880cb0bde935e297704d412c44ff73ad8f77a39a0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/halt.webm", - "sha256": "2c72c7bcb44ca0cf274c280c890f7afce6620afa569f02a4db0d5f98c735b33b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/outcome.json", - "sha256": "2f59d93c364bc59f0edc4c229195af3c0b2eb36744bfa40fb4a100485e9d4af2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/checkpoints/_manifest.json", - "sha256": "b4aa91b82c5a98981fb4595a31fde07efa58250d5e1b719667ae138bec9b9593" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/pending_escalation.json", - "sha256": "8c6c6b1a2dd48bd0a092ca383f7d3a2e9fd54734aedcaa8d1dbdac8646c5557f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/report.json", - "sha256": "5ba7c7e17259b4f8d49975060e9865317607472fc0d5885901fef6ee086fc823" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/events.jsonl", - "sha256": "10b94d53ddd6b867c99705891afd52c8c53030233fac43cbc7216c9b7a9469cc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/outcome.json", - "sha256": "552a4f3e544511c6c4ad4fa48c20a5d358dffc6eb20c8a8b6f11901524414dd1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/checkpoints/_manifest.json", - "sha256": "7b27d1a1c6781e1721f2bc3de14e5255e0f65ec2737e6e8b88c4e8493c8a2874" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/pending_escalation.json", - "sha256": "3784db3c752e554600c19a57895d8cae6f854742ce0af62356f6b64f124f0c9b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/report.json", - "sha256": "6f07351aa5498611146871309ace4bc2380c0d58aa56985c72b2c4fabaf33398" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/events.jsonl", - "sha256": "7c61867f75347b76fd5596596f7e5e56dd4963a6e7e0fc5c157de97aa7e93283" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/outcome.json", - "sha256": "0ffad07ccc0bd68d52c97f36d468f1922acb6b78ee4c6e370823ded172ed8e61" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/checkpoints/_manifest.json", - "sha256": "81c62c8eb218a06655b783d64724fc275cd55837967166f0933ad89dc8923af2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/pending_escalation.json", - "sha256": "1bd6ce519e9dec9708d25226cef53ca6d15c1ceac08f43207a977c274bc33615" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/report.json", - "sha256": "223ba9ab6831d742f2bb132f02d73ad15725adc1d4924a140478a2899571b74d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/events.jsonl", - "sha256": "a13121b4a9139a117eeedb31f9478e4afe178579f786ae88e7cabf9f1980194c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/outcome.json", - "sha256": "61c6ce5e1dbbe350f935e243461f864416f49b4d7bf8f2bb71386baac6ff1e29" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/replay.webm", - "sha256": "7e1bbe78f2573d18772504025701effcb91103d24b9cffdd8c6a1f029da46425" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/_manifest.json", - "sha256": "58b2c45fb206cf769078d71e317c50be580fbc2d89c5da2f6be713252c2f6ccf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "9f5cb299da7d6f260657a31aead23e8fd236f681ae3816b52130dd93a2acffda" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "39b6929c6eefa8415ae0878e819b2ed55c8e8c2f6f17f93d0568d62da2e3883a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "06b5751d59d4889846aa49e4d8429947638977fa7ef46516e39ce0c77db60714" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "8136cbe5efec953503f8281876bca6eb46730a3519412173d8b3b814a6ad51de" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "3eabfd9cf175e10aa86615fe67191599924e0a916984019cd5fa56f065b4f8e2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0005_step_005.json", - "sha256": "faad45381bd87638af9e4a1793d63a746f7e6425cbd0c4245f2504ff102ce8b3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/report.json", - "sha256": "614d5793ce728cc8af5ed11dbf053f63e02e1e99356b55affe13d9ff84d49078" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/events.jsonl", - "sha256": "0d80d087722aee615aff3f1ae5e7d23b048c9ef1ec5d3ea624345c68fe89511f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/outcome.json", - "sha256": "e7be07086f85373393124a2b62ba8e75d682f7855d403be602bd131e7ea18c53" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/_manifest.json", - "sha256": "217845693bc17d900a4b6c23f3ab4e1d82addbe43fed263362303c5a18e05d7d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "c77f047725705363b22b598f677931e90358b738b009438ee34e1bedaed4908d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "aa4b025aef366a08741cb30a9f6937acf0ba6aa42708033358ab9c608ebccdda" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "8aefd509930542e7c911d0908bec8418c1786d54a0c182b1e357ecb230c1a9aa" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "45005f316d9df67ca4ca4d83dbfc8ad594be7f57d67966ffa39128679965803a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "bd71713f0355459fe54efb270e81742ef4ca4dfd869307f393cff0cb2c3f2848" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0005_step_005.json", - "sha256": "7fade4756cf5e1d3093786dce713f90567adafc01c6a45bd32dc2b94305d8a13" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/report.json", - "sha256": "2a5488e5d364f0d582b1c29e96425e85f048a9b9ec0739a6a24ace522076e54c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/events.jsonl", - "sha256": "2b519fb0dbd2d981cc470e2ea9dc176aed736dc963387e662d1e6c6901631d91" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/outcome.json", - "sha256": "71251faf1e3e216b83849ed92de0e8ba53b31663e6b0a392f5c378f7a94703e7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/_manifest.json", - "sha256": "7b377d70f0e7fbf4b1e58555644dc2b862e40dc865477a9c5cfa96dda68d516f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "9ed85173a54018d49d2f0b96ea7270e60cc1b41944bbd59d08c0e8432b3c3de2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "a7764aa9b73439555c9a961ad6f908fb07f0a111ad39deaba231412683b5d6f9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "0b97aa8358a873d995dfab5731762e23d57660fe90640381cecd91196df18288" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "b54021fb714a5e6f0977637eda7ce0459741f414a1ec6185fcb8f78a57695bb2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "0ed180394dcf39e4c94641cc7f3aebbcdd0075552df3098898b08cbd017f4bd6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0005_step_005.json", - "sha256": "1abbcfd86eff5af776fcd73dfde1d7c5f00cf37cdf389b811c9008a54fef02cb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/report.json", - "sha256": "f63f2e54f5d24027e5e8980275d5c06a800c0d9355e02cef7098b194ac6c2a1b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_005_before.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/compiled/program-graph.html", - "sha256": "845b4aff2bd3ce524739db67cb36ab5b4929785779a2105cbda24c014a56500f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/compiled/program-graph.json", - "sha256": "b3e6862e1c1e142858e4e5237a4af90af26c9515ce0e8cec194ba6998558d6b8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/media/recording.webm", - "sha256": "5004a40404842d44b579622b838e406145d271ce93869c71f6827a18238087aa" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/qualification/project.json", - "sha256": "eee3b764cb0d52a0fa4f7f3d801b32205d2002d0313d6562c6c4f9a18791c4c8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/qualification/report.json", - "sha256": "8190d084842c73f4f152c5cd136da9c03b8ee5ae1e0d3fbeb609a950f3f89a0c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/events.jsonl", - "sha256": "5ca7067da0eaa1194f890cc65fdacd617d563866d2dbbe5abb16bef97935ed6c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0000_after.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0001_after.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0001_before.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0002_after.png", - "sha256": "8d2d2d2a56a8d089b11f1e97926c06f0c1d7076e080d0ffbd70b0bf1691aeae3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0002_before.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0003_after.png", - "sha256": "8a3c5f2a1a6d1816b42227a818afe24a0c1d7362791773cb6f18d1fcd1b314d9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0003_before.png", - "sha256": "8d2d2d2a56a8d089b11f1e97926c06f0c1d7076e080d0ffbd70b0bf1691aeae3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0004_after.png", - "sha256": "d4da8dbaf7fa257e89d78a08854ccd50c8277c3fcb12efe2614d3fa4508a3026" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0004_before.png", - "sha256": "8a3c5f2a1a6d1816b42227a818afe24a0c1d7362791773cb6f18d1fcd1b314d9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0005_after.png", - "sha256": "09b63152f50688a01352cbab13a1ea33e2d837b36180c866849ec4cdfaeaa599" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0005_before.png", - "sha256": "d4da8dbaf7fa257e89d78a08854ccd50c8277c3fcb12efe2614d3fa4508a3026" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/meta.json", - "sha256": "2d223e49ea971b6eae8b178b5d77b2aeff6a6da52d3b6ff4b8b065a641a5e071" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v2/manifest.json", - "sha256": "e6afc4b18bbff1f685dbf461e3496337f151a329c1c854c5d0b12393e3018051" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/manifest.json", - "sha256": "8b304d279409ef6ae384d715274e3ad4bc35be49d2e6a12f918b61da31ba74f0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_000.png", - "sha256": "46a75b5d63ceaad4bee942ccf2a6ca3d2b4f6327509df7eff2cc7ddb2c9fd389" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_000_expect.png", - "sha256": "337e403fec476cc955bcf5f1d96902119d9c2fadc03e201c0c2fbc2475d03646" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_001.png", - "sha256": "9d17fc905b1902add82cad885c72fe446a23e0334fc4db58592d2369e85f26a5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_001_expect.png", - "sha256": "ccbbb335c8160188198df18beb48bd88082b7bb1e5c1cd987d6766afb62c0773" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_002.png", - "sha256": "e6a0e0718b00c26280e32928b744217d00a7e010ab9825da27724e2debc9b805" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_002_expect.png", - "sha256": "f66608f19f3acf0ba8d86a39ecdd04781eb320787885039ab1eefee3835c83de" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_003.png", - "sha256": "2cb01de3e45c7c6cd6526f1b6f9c1a4f86bee1a5e4f8e3f6fbf7150470cf5f2c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_003_expect.png", - "sha256": "68cd40d6bd0abdf81beb40dd4202bac784a4b55492f803cdd5fb1e7ab8f76941" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_005.png", - "sha256": "5d8163520ba8355f44ffe0cd06a26be6bfe5d6660bcff1395dc82d4da3aa0ac1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_005_expect.png", - "sha256": "0919dca8fe883ad52eae6359f9da3494cb57c68e006ea4ba314d61e15787ea47" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/workflow.json", - "sha256": "1744b74833670792da00b02f61e89506b322864ffcbf31f6c002f456da0d7ace" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/events.jsonl", - "sha256": "a9dcbd93f5fb329c837a99aa38f53037c5289989859232e3e837e4773aee9181" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/halt.webm", - "sha256": "021e51c33ea6275b7013db0a727ffb2deb98fe8778bd3b529ebf97184f6c8247" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/outcome.json", - "sha256": "8cb4a9ee3f4e9a07c58dd162df3f71d0fe877b8e3e78658fba0b5181fad8dfb6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/checkpoints/_manifest.json", - "sha256": "8db2feee452506f7c1d8a21869a3544a0486339689b0e07bb59b524e6fa3fd57" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/pending_escalation.json", - "sha256": "c65459eb889f7c50887703cb567f7d09c6769b5224c16659f5f5921784af8cb8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/report.json", - "sha256": "0199fd3396cb1f38707f20bd1df878cccc6faaf73a362c95d022fca4cd9e504e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/events.jsonl", - "sha256": "01c775093f426afefc07258e38c2f6c54986a8856c1d271bef6102f35691f06d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/outcome.json", - "sha256": "3493370d319101ec7dd1f9b8c0f28864f2ec66d3a240c42b4f5c1eb3f993ab63" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/checkpoints/_manifest.json", - "sha256": "13bbc582a5c0f955cfdf48095cb05750211094a81754f109156ed53b55375573" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/pending_escalation.json", - "sha256": "731847bdd955b40b0037672bf4b1e9b131aed6cea4aac3bb8a286d5546a598cc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/report.json", - "sha256": "a0b46dadd309c371099e0173c3e95e6c64783c6803c9236d29ad74670b6cc9fe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/events.jsonl", - "sha256": "754f8fb53a577102e7d788ca9dcff5eb3ad1e1259b6a838ffc418d40219d4daf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/outcome.json", - "sha256": "9a738876e3210993d1f6a6afc2fc8ac898a5230e2143b46180f93d1903db420f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/checkpoints/_manifest.json", - "sha256": "88682d8d15dd6a0160a9be8f6f0e5f1b33ed46b1f2b0cc253f85044a9700c90b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/pending_escalation.json", - "sha256": "70d602353201bd5f9332284c63e87b057f4308cb948ba0791d44e2f21904ce93" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/report.json", - "sha256": "389d3890f2e06e6dab6479e6edd960fa3a7fbbcf475131e9eb804de9e2ff8ba5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_after.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_before.png", - "sha256": "395adf2a20b0b258343d77b521240dc0adf8229ac9957661aa6855e3d8d4148f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/events.jsonl", - "sha256": "b06812e5d70d08f1e0541198384faeed2c6e761195378fc1914e7e7a16931d6b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/halt.webm", - "sha256": "7eb3a32687049eae20bd4a114d3f7561be77e6c6d0678c38cac4d19d420b2317" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/outcome.json", - "sha256": "9200874f2a500208b57d4a139e38bfcbe2764ee453bc4d9698a88bbf0f258e14" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/_manifest.json", - "sha256": "48de396a45219641c6631b2fa2a02c573df2a585c85ea636a7373e95a7590146" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "814decd92968bc3bcf806cd2054639c2309c237d53d0e3e3ed740ff7259d47b0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "2ba3c88fa8c8a6d36146d219eb7ac90f62ab005de25c97e9389e89410001cd9e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "9a05ee6cc6df9b57bf39b22098ab83be01e738e481c2c03e6ad827bc2145528c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "a5675e04a9b42af9d31c28c5434d88bf68cb03b49cacf0189a5da5addf7a9ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "4ac68705abc17bb762716f1478f2a4dd8b13dc3f915cbb2dcf104c8931da6c81" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/pending_escalation.json", - "sha256": "7ecc0e49a256975f82c0a3071082d965343ba754927d39cd9c00140021c94498" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/report.json", - "sha256": "9888ec067b7f7c05d4e67e638a29493b6e5e2f764d6f2eab363a6c607488b0ff" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/events.jsonl", - "sha256": "4d55ca68adf0f359fe0fa45b804b0e2b8a23a3b088de6412d39050b748285964" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/outcome.json", - "sha256": "d44ca70b9756bace314bb27a8964d3292079c0702e9448d2f4ba203dd0cceb4e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/_manifest.json", - "sha256": "51cbd0f8e3b7cb3270a09a2d6a6ffbb68a429b19de8291121ef41f68e46bba53" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "e67952329148384eb8fa207297cb050a7af22b230db5d85f2118574d70aee4e7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "6693530faa7fe1ef09b0fafc5fff911af6cb6a64326f0a9d276e75cb3686136e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "fcdcad265795c0d939e9de06dfcdcaec9c01ada20bcb22eb2ff44df51fa4cc6f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "513042c8454f22289315a5dfc9b2e78632fbc9e908c72416810f6e14709c71b7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "c205aa56f8ee22b7d3e9252dfda2b48a86562bf6103cd1f8e1e0c08d3b3c2c2a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/pending_escalation.json", - "sha256": "0dd76766cd687b0048595e1a302ae37c216e93a02ac1f54e8acce4ba6d395ed8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/report.json", - "sha256": "eef8a4cb4c6efa841c5649d3328866f29265937aba3eab8306ab11d2e0b21626" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_before.png", - "sha256": "d6c6c2d29da6ee4ab499388f4f66f05c39fa4d64bc39888c85bea76872c50a45" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_before.png", - "sha256": "9130e1d0c88efd3e3f6b4e8a80ece1e58ba2c1cb86a9cd8381f5753f3fe185ed" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_before.png", - "sha256": "019102af701afd1c0103fd3fefe8af7b88f0f1fae2d75e28b79875efee143e93" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/events.jsonl", - "sha256": "21a6e0b3080e32b46fe0d4b42f0a55038199828491cc317f4e4c25d6b7cfe469" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/oracle.json", - "sha256": "3a55ea754f1fd03b3393a6a3abf9570a7ebd0bd90c0a9fe8f92a5e7689b132ad" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/outcome.json", - "sha256": "d11a823161311ad40d0d34774c087ed1cf90a60bca1baa7e5aaede75190ba171" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/_manifest.json", - "sha256": "2b7683f5845d18217037b701d32a360dc8442b7db6ea96ee3e08f531abfce881" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "af72ba361b2e388b1c7dd40efe06ca410b886f2dfb4f0f055dd5c4c6a38c5cc5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "691219140254286808bba388b8bf26386d7d4482a95b5e40deb17d3797eddebd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "012f7406bdec2bcad62c1c80b27f9aa10eb89049cb9342ed1f4e852950d05b39" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "57d3f431804993efc87e2f0886ca17e76ac8bf5d3ff0adf9de2422c887c633ba" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "7588a898e3e183bc5534991bad677dddb8c29741e3063ef7eb714f62bd55bcb0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/pending_escalation.json", - "sha256": "ec91d742252599fd03677a6d75ccc1a617a30c697b03731a96b27859949234bd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/report.json", - "sha256": "2a550f53de9c8c2a24e492574705fecf0cc5183718ebebada1f9e6333876a325" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_before.png", - "sha256": "58f1714e31a3f511b5310539b433536169163c74f224402b7dafed32588d0c72" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/events.jsonl", - "sha256": "c8765f112880d5bdea2838f358bd8c008437c15667fe8740212607d112f6ba0e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/halt.webm", - "sha256": "bf4088606ca140b2ee1fe3fc57c693a1e9bb3b199de3e1c5ae9b27fc5739dca7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/outcome.json", - "sha256": "c4ae9f7ecb4eaf95080f9f91f100a8fb97d5cb2bcda1efc0b6eb451919d88fdd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/checkpoints/_manifest.json", - "sha256": "9bbddd29a6dc5953603fb1c75042e5f0e3aa87059de1e08b9fbebd3ac2a27a97" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/pending_escalation.json", - "sha256": "45282bbe8ea7b867ef0f9b764f9650b3136c7b7b61daf672fee34db7efb7582b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/report.json", - "sha256": "dca15bf16fe0195f5c3dc68873365c16fa09f45f9ca8ebf1e60dab82c284530e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/events.jsonl", - "sha256": "d037138e6334a61804bf3230eb9d020bb745d7ecb7bbaee1c6f2c8d7639c7e5c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/outcome.json", - "sha256": "920cd25c90560c2961402a0f5710a47d1149a5e88ce63253a0705f627eed7ee8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/checkpoints/_manifest.json", - "sha256": "29d07aa793191a7c3d33834362cd5a560adee8bb5a5870bea90473e0c0612407" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/pending_escalation.json", - "sha256": "f2371b984668661d145f458dddab30b18596bd74ff6a51a324e9d5840e55daa3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/report.json", - "sha256": "ee7aae31e2484417c9c0a2f14825e03373676e12e62300b839acbe45f2f66047" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/events.jsonl", - "sha256": "19aa64247e7bf1fc2fbd99f16f077cbf386c6a328185bfd3a4442dd30733e1ec" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/outcome.json", - "sha256": "f57c04fd555b86f6e6b2a0ae77125e0717670e62ea42df387df650798aaef6e0" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/checkpoints/_manifest.json", - "sha256": "f0cfcaf14c8bbb5cb79e5ca07c82548d09b2aca397c243827130046e976c3cdf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/pending_escalation.json", - "sha256": "058dc7684d0374b60dcf2a6e0d435caec50250117b0d6d65d5686d7f398d9346" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/report.json", - "sha256": "631ff5e1da6d7e8378a57de74cefb99f1f69b355d1fd32bda2cbdc1c33b641a8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_after.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_before.png", - "sha256": "00dcb835d496c495f07e56390ee635114243f8643f287fb17c092ef59cc72cf8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/events.jsonl", - "sha256": "acb3bcc31a489bd719d098115e9b53305b87d8bff37be4109fc4d7ca69e7b857" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/halt.webm", - "sha256": "6f14e316ffeb24dcb8ce97febc045ae8f251df442680b90f0ff3407be49a0ccc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/outcome.json", - "sha256": "adb517d20498f540a459c2fb0193b732c740aa81b8a554a2cf08630de032cf73" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/_manifest.json", - "sha256": "3a0548c66e8ceb3017797ba60d001688ba4305e9af74c90fbedfbdb534029d76" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "304f444e5a052ff8cba4bd53b2a80c66c10f810818d3eac462081f19c1f2d891" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "42cd307f1681f42008963393f0b5c21d54ad147dab54c0491bd2268307e4d67d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "d6b1a792621c8c768c2d1f33396f2c3e15e7bc415ba691cd4017aa5887a32a4f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "ea6aa97652382e7194265077277a259a7c0afe969f0b57857bdb01dca02aba44" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "65a6f68a4e3218ff52b2a7adcbf898b3cb8c9c269d18668f93986f8f6c97f8d2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/pending_escalation.json", - "sha256": "16e0d80c3338b20135c83c4ac84dca5187fae68088590dc8d4b7c9aa281fef16" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/report.json", - "sha256": "b4d5b9c01abc0d902f7a57afd89b32cae6574d42851372f6a4f4cad6f7807afa" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_before.png", - "sha256": "d6c6c2d29da6ee4ab499388f4f66f05c39fa4d64bc39888c85bea76872c50a45" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_before.png", - "sha256": "1ffca11ead5fee98b4f8c11f330152a9765edcea3b2979c51c19f36b47229a4e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/events.jsonl", - "sha256": "ef206aae2902e32c4942fdd4a50cf08451a7704aee7cf48647bd7ab85d557dfa" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/outcome.json", - "sha256": "fddaee34409389259c1437e6f9ac3bae6fb1e5dfa0be48f9a6a44c9718eb8be3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/_manifest.json", - "sha256": "57cb68b7364740aeefc56426784d9c555303e8c5504541fd4cd14ad7be2a1329" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "e1037f598ed2086b6aea6c4fabd592238e7afce3e72947895bead6af6ed1546a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "5785e92cda87cabc21ba85ad6ba187f1bddd11340acff61c78f71f2e291afd1d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "8113812e60224cf302bf98d7428a249aca60b526959efccb0c7477a5d8935eb1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "2ee83b200195ed418dc7fe4167c86f3eefc71d3f44dd3eb08d739ed9de973ad6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "8d9de578f018275cd31799b639f1c5d9040fa861f0f3073029e180737e3f56be" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/pending_escalation.json", - "sha256": "be7e4348be16a2f7e7b4901b979e16331b03c461a550c6d4a4ec4038556bcecd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/report.json", - "sha256": "8143ef2f20bd6b42a00a8cd63827bf18ca99940745b7c435878e512cb2c8bf3f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_before.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/events.jsonl", - "sha256": "035ad252365df35c1575a353d530fdc321de8f9d6e969d4597f64a9044973175" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/oracle.json", - "sha256": "25ea4b0ab9a8225cef1a40b1b8fbec4a40b24e13303f2a44efa8848ebfc55af4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/outcome.json", - "sha256": "2b567a347febee7ff40b626e3379df0772ed2d79be6c4a7be44d81d8e36f6d1c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/_manifest.json", - "sha256": "b71e61fc56fe03b0720c878fbe1afa4dbe03cd0955eef97da1e2554e4af77ac7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "658bb9a4fe36fafb6e926a8aba781595707c7bab984bc9ad5db6d9cd5a9e38da" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "04d1251cdd2798383230128572cb135c5f20ef922e0063fdd42559066a2bd025" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "8ea2c34bd4a3bd3fd094901a08f0fd19b551b4ddd31f5fe9cb3339a4a512f874" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "4cd8567fcba71da00bec11d78174fe14b3e9b5f573cb5d86fb0443e3443bf4f7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "00017a0bfefd2d6da17406d8c648670257b142eae21c18df990ec5899a67cb5a" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/pending_escalation.json", - "sha256": "72187b266e652899ef07acf05aacda19b9f5f6ac63444d3bcc298fcd849723b3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/report.json", - "sha256": "217acca2cdf139ff7e8b53cf8b69f7d704abe8da170e8d880adf6200b9c0d5ee" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_before.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/events.jsonl", - "sha256": "17cb06e6e6c454cd5a646c09a3a2f84a6681ebb6615ac30c1320f4e6db7e26fb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/halt.webm", - "sha256": "987ddf3f74b26102e6877de45b2ad4f558b643062253c5fa5058cb8b2490f146" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/outcome.json", - "sha256": "a1987aeb639d36a8b346e48e4762f4767ecc97d5c8fc5f164c83ed0d5ea6e951" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/checkpoints/_manifest.json", - "sha256": "4a7bfcb3583cd6ae7e74e02923527bb4bea4d1d600ab7cc32cd4f81f233be5ee" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/pending_escalation.json", - "sha256": "cfc412811b4dca04bb56499d2def2d972d4bfb1a8b47a25a074f9e68c7ff846c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/report.json", - "sha256": "e1c742fac9cde46d9ae25d950005f40af0e2b5957d0fce13f4cb26bc20a7ff9e" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/events.jsonl", - "sha256": "ce5dbf2378ebee2bb99ad87cc405cf635e092321b09d954b71bf476dc4544dcf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/outcome.json", - "sha256": "98b0042e8cbbd25ee9632e5db57bb4206e38005b2420e357d0865db915f85512" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/checkpoints/_manifest.json", - "sha256": "af8bbff370e0512d4664e4c62b2bb9edf4e5f68cdd426624563d576faf7603ec" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/pending_escalation.json", - "sha256": "34c5aace35f54266009fa6a6664f348459500540d1d2dbd639c7396644e6735b" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/report.json", - "sha256": "7ae08bb375505df852fee3594884bc27326f1eeafcdc2b48824bc6cc7e5934cd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/events.jsonl", - "sha256": "ae6393fd33a83b3524fb55080dca38ed1fe7c853f61f5e7a89737e86d0f99921" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/oracle.json", - "sha256": "53505ae34f1d494855f9d1ce5fb12561c36a86884834255270d973d57945bd1f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/outcome.json", - "sha256": "34d4cbd08fb746e62e765d53a39444403f676361917ce5006e449aca7cfab8aa" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/checkpoints/_manifest.json", - "sha256": "508dff905abe48b6fc24c5a4d21bfaf6184198f8c842c94df9bcd1ec009cdf68" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/pending_escalation.json", - "sha256": "248fca8ba29629384d18327ba565097aa7a714a49ec5b2c91cfb327ea3d0f258" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/report.json", - "sha256": "f9f73d20c1c98fa7d03fef19e70089a0231a49cb06bb1cf764cc66c10e01c238" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_after.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_before.png", - "sha256": "d99076ca95354216c80ea82a3be00908b680b998879ac0bdd97f435d12bbdecf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/events.jsonl", - "sha256": "16c457b60fed99b9e8e77ac449f30e3d2c9bab20302bec9a094f5809bf935b68" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/outcome.json", - "sha256": "9fe5537806507fe364e32683b9fc39b17bfd996ffbaae221ff3ecacc37514a89" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/replay.webm", - "sha256": "b84184382c9cfeeb733776a2be72d242c7b21d5e6c2e4e7b249b897e5e5c73bd" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/_manifest.json", - "sha256": "1adb36cf8e55daf95f283486d6746554e37c5ea51433f57ac6a073c6757c5738" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0000_step_000.json", - "sha256": "35ce6b839a6ffb54f2766d7eb15c3b9b2ae8f25cead2f02c3e95eca2fa1cb19d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0001_step_001.json", - "sha256": "b25134478eef367269c448ec99724196482e0de11a07a55937889761b84d7b6f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0002_step_002.json", - "sha256": "79cb1810e036fdbaa91a6bbe7eaa151a34fe1133358c7c00ec43dec80fcc4dd4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0003_step_003.json", - "sha256": "e8b1e7280c68307956ad9c6e0ec4360a4a4db959aba442adb0eec7d4c1ed4506" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0004_step_004.json", - "sha256": "391844051eca3c449e070711157ce910c65eebf902b9c2102a56791b4c01dd56" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0005_step_005.json", - "sha256": "ac60acd0ae5385aafd10d5846e06a948f4cc7c742da1b782fe8d189bc8c9a94f" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/report.json", - "sha256": "10d7e85225617c5ee98a357f5b2b9098b451373f6f0e367d7f84185c46806fcf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_001_before.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_002_before.png", - "sha256": "58f1714e31a3f511b5310539b433536169163c74f224402b7dafed32588d0c72" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/events.jsonl", - "sha256": "911084d767b52fcb9955a9a3b52e64848aa2d444cd263b116e0b7636b263adf6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/outcome.json", - "sha256": "7e035ce556cbaa0b810d5e0d7164f8739956ab0b523803e87aea8920cbdc0643" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/_manifest.json", - "sha256": "cfbd75260c107f1dd37ff09f8973400eb408616599d7caf4a2a80d8f9e71ee84" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0000_step_000.json", - "sha256": "27342a30d986e092f15818f60b26dcf29cbadc1127e8ad12490f2f7138d71082" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0001_step_001.json", - "sha256": "f77f0e231054afe11778dcece240e92f9ac5df930d004261c3059d11aadbaedc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0002_step_002.json", - "sha256": "2f26cf6c608c501195dfd3f44d82e195e661f5d64632bb61da12cec1c0356681" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0003_step_003.json", - "sha256": "5d10cc81902b935eb2ce53d8f7e691701acb497a0f6580cdbe0aa1711d725eca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0004_step_004.json", - "sha256": "fad67f0751b96824ec423100de3a37336a3fde2ae2f9d279167ae96ae0af69a5" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0005_step_005.json", - "sha256": "9e80298ac69fed791a6f729418f6c00603550a1ef00092748c757a7d8d3959d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/report.json", - "sha256": "74571ea3f509a07e570a3628325501e503e684a452bd14713121dd77bd7da5b7" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_001_before.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_002_before.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/events.jsonl", - "sha256": "7204bc6d968bee2932fc83a8701ca763e32699c4547a8ab0cc88fd7741dd1dc8" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/oracle.json", - "sha256": "788c60eeecab7de31d5e90c0784d7eee1ac34a84862ec138f18a3178caa8f987" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/outcome.json", - "sha256": "dd3e5b88e62166a75c11bbc91d0f0015b9bc489d078649a8e529a07ab134a5e1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/_manifest.json", - "sha256": "cf19e5bda0e6731bb9b3da701740b64b96a84142d4301c32d5e8c4a3cf82fd43" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0000_step_000.json", - "sha256": "285cbed7c30d014dfa34b0ae6ba42ca6bae6209952970e455aeaa67fe5cc23c2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0001_step_001.json", - "sha256": "436d7635b1731ee815993598bce7d552a3bf2381d299a13bafc0bbe3a2e4eec9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0002_step_002.json", - "sha256": "49567d7332e299ce257ee9d3343da3f1ba10ae4d294bc68a6542496776ff0c5d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0003_step_003.json", - "sha256": "be93b6229e20c4481fed797baac5d3820841718d78c5ba1166046948e7b46494" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0004_step_004.json", - "sha256": "a7664a09d18cb568bc212d99b3712b84e17609186e7ea00d12c94df71de67c5c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0005_step_005.json", - "sha256": "a648f8cb18385f7d416298037c7887f5712b59caa09b0bc964b2074c3d37db60" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/report.json", - "sha256": "c2a3606345c3baffc881f4fcb5ff76d209278476787dbf65c6e92a2ff00bc68c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_000_after.png", - "sha256": "bc5ecdd6b0b6becdf72fd736840f9ceb3a8f5c28a94b7ca93d18ac47b113e3b6" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_001_after.png", - "sha256": "c93494363bb067164bd0da1d4f48ee33acde619800f66f2b91b297477336c4ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_001_before.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_002_after.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_002_before.png", - "sha256": "58f1714e31a3f511b5310539b433536169163c74f224402b7dafed32588d0c72" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_003_after.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_003_before.png", - "sha256": "5b0d35f3b6f60ac321573c3a6ce36c096dc0abe44dbe6c756ba344b3eec820ca" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_004_after.png", - "sha256": "d47fd457fc12221ca37db9aab4a098d754fbb086f4e5f6607c12b5090d4bf97c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_004_before.png", - "sha256": "7f6806cac79efad47ed1472e525954cb5f65b1a18943f785bf13c336cabda03c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_005_after.png", - "sha256": "ba6033fa67a091fd53200f591cab85e4b8e1759f38d4f11def4f3ab8f989b2d4" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_005_before.png", - "sha256": "a8201e29326123adbf2662cbce74d9de7e636210904b41038ae84e17bce8fa23" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/compiled/program-graph.html", - "sha256": "15f97a7e127bbea3188f421ffd3b2bc8a18d6bffa0d61e117dabee43da355883" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/compiled/program-graph.json", - "sha256": "016e509e71d6f649f8f3ff37e723f551ee0c32e081a1f1fc00713eab6ef3ebe3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/media/recording.webm", - "sha256": "3ac77627340b5f3ef3adc37b9b8f05091bdc886e0d65d2ec2baac9ed591cc438" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/demonstration.control-overlay.v2.json", - "sha256": "cfab1104ffaf3726eded86cf0378e5e5d3386802f5bab5b4179cf7a2ac2ead1d" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/demonstration.frame-pts-us.json", - "sha256": "f6ed892ccc0a64a969ec12ec4a37f87d7cfcad5cafd5e002ff4871aabf626469" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/demonstration.webm", - "sha256": "6a15175effc07fa737f3a1c020baa6a13e7548f382cf5f25d419e6ffb64b91bf" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/halted.control-overlay.v2.json", - "sha256": "d97b7c13a0724989e292b45a4ea1435338db6889503f06f52e15421e0d3faa7c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/halted.frame-pts-us.json", - "sha256": "64e5b69483ae0c70a2afb10eebe6e9917cacb2dd766bb672f94424a073240bb2" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/halted.webm", - "sha256": "59cdce33ff0fbbf0aadc78ebe9eabe6cf189dc7f8aa2e9f2d1724d90cf8270f1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/verified.control-overlay.v2.json", - "sha256": "5742b18dc4532f6470f41ff9a21baf1dc637d5fab5d484defd36ba542ffd569c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/verified.frame-pts-us.json", - "sha256": "821f6c48c2d5cfe00e86a44c886508e258678cb8f863a2dff26f5736dce71674" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/verified.webm", - "sha256": "41b3d412220827678696d8c06a111c79118f201ebb3a48be459ae4126892d087" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/qualification/project.json", - "sha256": "d4a2db89a83f7aa7c28d233903228d82a323a4788b2bf5ea5e9a31a370cf4c78" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/qualification/report.json", - "sha256": "24f34c46f6feff7d2ac369416dda13a193b9487e360ffe7c00b36725474afa3c" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/events.jsonl", - "sha256": "c5ab16f16eacf2d81c060084c63ea3a29cc803a14ca4d7bcd5055fa8daadc9fb" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0000_after.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0000_before.png", - "sha256": "44ec36e83492639eeb90ec6a8888be4242e85de3a508cea28a2906bcb12e2ebe" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0001_after.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0001_before.png", - "sha256": "95f240328c3e7e5b8ba9fbb3adebe48891c378a5b9ecc5aa4de55c613189b870" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0002_after.png", - "sha256": "8d2d2d2a56a8d089b11f1e97926c06f0c1d7076e080d0ffbd70b0bf1691aeae3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0002_before.png", - "sha256": "c9a35595904c645af4664987a5f94d6665c0cbf6efb74c3bf69920ca8ad950dc" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0003_after.png", - "sha256": "8a3c5f2a1a6d1816b42227a818afe24a0c1d7362791773cb6f18d1fcd1b314d9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0003_before.png", - "sha256": "8d2d2d2a56a8d089b11f1e97926c06f0c1d7076e080d0ffbd70b0bf1691aeae3" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0004_after.png", - "sha256": "d4da8dbaf7fa257e89d78a08854ccd50c8277c3fcb12efe2614d3fa4508a3026" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0004_before.png", - "sha256": "8a3c5f2a1a6d1816b42227a818afe24a0c1d7362791773cb6f18d1fcd1b314d9" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0005_after.png", - "sha256": "09b63152f50688a01352cbab13a1ea33e2d837b36180c866849ec4cdfaeaa599" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0005_before.png", - "sha256": "d4da8dbaf7fa257e89d78a08854ccd50c8277c3fcb12efe2614d3fa4508a3026" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/meta.json", - "sha256": "17494cf94c54918f37e6237b2024809cc53160ec870b357e946149ea1e9183e1" - }, - { - "path": "public-demo/evidence-packs/mockmed-triage-v3/manifest.json", - "sha256": "a4c531de62d875355a359dce4655fe80963ab1be421c99c1be317d82cdccd49d" - }, - { - "path": "public-demo/mockmed-verify.yaml", - "sha256": "27257a28ed148fcbb19fe98791be4c100d45bb0ebff0739cb6be410d49daf311" - }, - { - "path": "registry/bundles/openemr/new-referral/benchmark-contract.json", - "sha256": "7f0854cc6e462ab1e2527b5d14cecb0610dcb917bd84bb7611c75c3208de5c3e" - }, - { - "path": "registry/bundles/openemr/new-referral/manifest.json", - "sha256": "48ba1f97b89d687b1a5661f843a81d784644ec10902047864f15a31aab3d4c38" - }, - { - "path": "registry/bundles/openemr/new-referral/param_hygiene.json", - "sha256": "0f3fac1d287ec829a0a92bb6c91d867060cbf709e18d5e610e591430192c5d5f" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_003.png", - "sha256": "b693196ac8edf83161d924fa56d49bc5fda779a2ad1d5702433cd7409827beab" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_006.png", - "sha256": "b6cd63e23d39342f17ec0bc0f12feff631c7b1c054d2b3cad8a93c2d1b99e71e" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_009.png", - "sha256": "b5c66e87286eb999d34c5c7f8658d955ad37d100dac0a21159e010fab9a86729" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_012.png", - "sha256": "e84a110767440459a2f208c2b4ad60858e7891fcfbeb159bfa27419e1aacf21b" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_017.png", - "sha256": "18cda86805432352ad97a1fb5bc468e3ea6614e8a773cb1b15b1eee0b8e339f3" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_020.png", - "sha256": "737b98cb243bfa956670f7f230c6c1578e588465ba647490063f6c46c0270d7a" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_023.png", - "sha256": "accaa210652c3ff1c7fc23ac6a4b653fade8e984c25acd9954c6292a6861963c" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_026.png", - "sha256": "d84feb23abebe58fe30aa227429317076fcaf4042f16418710a489b748ff379c" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_029.png", - "sha256": "59325888f26c87af708abc6f71966786cc6abb18a14e077e41074fd6115ad38f" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_032.png", - "sha256": "8b3b1ebf6837979e366e11d8139356ca04dbd821fe9c438b03f169e55f86ff3c" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_035.png", - "sha256": "53b4ab5acffa3c6a278c441459b85f23ecc84914d2e4ea9608d162c49eed9f87" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/identifiers/step_040.png", - "sha256": "f00c8450d77b738ef0255988598de83555ff3e82e225af9f4747de6cc5afa994" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_000.png", - "sha256": "a89624b03e7e50df70c3f3c706c4e4e17017ca31b979cf06e8c5aac699878761" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_000_expect.png", - "sha256": "8e86ae2413addff68e89d6d37b9222e800654484caa1a28d04a756f87906ff02" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_003.png", - "sha256": "1545b4b325728862ff38bbd0d82e71563212d5ec46fb1382c3bfd64827c1f336" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_003_expect.png", - "sha256": "087fbc35f6f04062e7f557deea1c840d80623ae56998cd5f58de6c4aedf3b70a" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_006.png", - "sha256": "0deb73c41ef344090022436bc577d8ff94a4bb74193b3392ceef19ccfb713602" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_006_expect.png", - "sha256": "7cb7eeda6806270a30bfd093255fd401cc3b20935f2435b8543af2b961b747fc" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_009.png", - "sha256": "517c77489043a2dd9ac5bb089144dff4b3a112a7e34037aad40d1f9751aee85e" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_009_expect.png", - "sha256": "2454ab4aada80dcc299827a13760b47ee554ea05859bd000913d521c1d8b9857" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_012.png", - "sha256": "3bdb5648e24835d3133040098c78b13817894ab347ee062f085aa06d47ea3cac" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_012_expect.png", - "sha256": "17636f226bfdbd3b580dc2e6cac3e2f819e19ba8487a2b048d5cde32e95eaf18" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_015.png", - "sha256": "7084e62d5c593657302b9a0c1f121549cedcdb969b6428e5ff2dc4b8041b1dc4" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_015_expect.png", - "sha256": "a9641cf5e390e9a30bf1e391586601dcd0a591cff2f37a9fee9fc8c3e5255016" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_017.png", - "sha256": "6ceb10078596b627ed12d71a5610de1a8fc94b97de392b86b34a66915e0aa07a" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_017_expect.png", - "sha256": "090f13ec41c698966840d5372507b7e4da048085dbdfa9e0b0a2b271e8965329" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_020.png", - "sha256": "810da56e4f05549d5c59b5002ffcbbab9677f031cf2a56e0549139d24f30b34e" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_020_expect.png", - "sha256": "7b5504240529ca391f47e676e008ce13db954243b384f0e16a34664041393b20" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_023.png", - "sha256": "3b8449493928ef24a570e1d7ac65b5b25584c8b3cd68eba071af842bfbae9399" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_023_expect.png", - "sha256": "88b28b0dbe899bd8b46c165fe4ef53f4f2f8218a09f093a2ab619f8c48488374" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_026.png", - "sha256": "c25ad4b941b8392ddd64223b9cddaab39f0f68a0fc25958441dc09b6943264f2" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_029.png", - "sha256": "0e551c8fa8f8e2eb4cfef0ccef68c35862e8a3c1dd6e654ec0185edcab047b28" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_029_expect.png", - "sha256": "1b71bfe520e1b6c8a1d41b990bca4f2f6dd5e15a4bf931595917894ad56d1c46" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_032.png", - "sha256": "28ee56d03479ba76a938532854fbca55bab26ed8ba738b9a44185f4db04368aa" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_032_expect.png", - "sha256": "298a1691c7832c2eeb29e00a15457b005b5222f304d6c41530cfc2dc91cbc36c" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_035.png", - "sha256": "324ba84e4eaf0d3fbc6b18da3218de44da4f464f6a6b8bc7d0329e4f5f9fca67" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_039.png", - "sha256": "01bd72ded2316233b66af4e50b63bdf54c3f2ca12d5aac2a5462a88893f30b43" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_039_expect.png", - "sha256": "708ebf4bf36f854120956898f662dc030e64b12b6fc2362d3008a472114fa4f6" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_040.png", - "sha256": "22dd0ae0fba63fbcaf4222de690199ef88fa71a386a186db9c03b813f981aa87" - }, - { - "path": "registry/bundles/openemr/new-referral/templates/step_040_expect.png", - "sha256": "dc945b1a646ff3809b036efec30c84208916a7846eec7bef975ca67e45f6c949" - }, - { - "path": "registry/bundles/openemr/new-referral/workflow.json", - "sha256": "bca87d82d053859c6ee5c364a6a8c551f477a29953fc8ea49a1b68ae1bffd74d" - }, - { - "path": "registry/index.json", - "sha256": "117a9808a8ce8e16c024e92431fc798f15e3ca00d855f23e3e623ffa6e20319e" - }, - { - "path": "registry/sources.json", - "sha256": "615326c49ebeeb8cf56e2dcfdfbb24171e0765f8919b8be39b73b36103da2c15" - }, - { - "path": "schemas/process-contract-graph-v0.json", - "sha256": "fab42e7b607d61ddbc1d1452615109cc5b0e2a1988b9be8a001bcb20b48e9bc5" - }, - { - "path": "schemas/process-contract-v1.json", - "sha256": "b8eafabe4dc22777dc7fbee7549ef7f5a2ef90e7f03be7dbb2d66c6299e0fb9f" - }, - { - "path": "schemas/program-graph-v1.json", - "sha256": "99facb6e1a726127c1623e0432e48fd7d96fe7747c835e5e069c68eae4ff2889" - }, - { - "path": "schemas/program-graph-v2.json", - "sha256": "bd675b831d87b2f57e619fdff1f405d89465225b6ce193e0e983e256a38054b8" - }, - { - "path": "schemas/public-demo-evidence-v1.json", - "sha256": "fc7bca6e1ea0cfc9c70c11368d7b59d542f75f98f2dbaf4d869247225e53c1fd" - }, - { - "path": "schemas/push-result-v1.json", - "sha256": "d0b719735fd81aa9291629d6aa5dad5d67565bf7e752a4b90170da74dc9098cc" - }, - { - "path": "schemas/records-interchange-v0.json", - "sha256": "5d60d23214328b61bf6ed87068d395346e638b2a7c9a65b268bcfbef7b4b1cf8" - }, - { - "path": "schemas/runtime-validation-attestation-v1.json", - "sha256": "5168eb014c8559d5e722fdd3af4fc2cf394d0c1ae065e1176075c029881cce7c" - }, - { - "path": "schemas/runtime-validation-attestation-v2.json", - "sha256": "7aaa25f172842d87560db40cf6e233fb2742710cdde4a0b0126ddb734a327d62" - }, - { - "path": "schemas/runtime-validation-attestation-v3.json", - "sha256": "67bcafde91d6332cd3f6ff0eff12a739d9fdce1759a755491cd0aff8e82634f8" - }, - { - "path": "schemas/sanitization-ingest-v1.json", - "sha256": "3c906fe51d4c6836878ded4194693562d2829df29aedafb423744031e51bf029" - }, - { - "path": "schemas/sanitized-artifact-approval-v1.json", - "sha256": "51b9150eed4fd51e30cdd545b990eb4267f755fa058a02c3c7330475a6729c4c" - }, - { - "path": "schemas/sanitized-artifact-manifest-v1.json", - "sha256": "cd150996fcad1bde5dc1535da8eaad46bf0881b74a540ab520cd84d8710a74bc" - }, - { - "path": "source-policy.public.json", - "sha256": "7b16bdc1800a0585c8f966dbce5be6d6d9b2abce4327b1a32d631c2de3c8ef29" - }, - { - "path": "tests/fixtures/flow_v1_34_0_terminal_verified.json", - "sha256": "395573c928cee8c5bc61a0658cc2ada41698266e6fcf54af00d899f21502cc1a" - }, - { - "path": "tests/fixtures/interchange/cases.json", - "sha256": "7c3182fe1345e58c350c677839448416460de0ab375621378defc4532295a6ba" - }, - { - "path": "tests/fixtures/interchange/invalid/ambiguous_identity_to_executor.json", - "sha256": "2133c611e39b960841d20160487846fc15abc6929fc55d01bed529cc02135632" - }, - { - "path": "tests/fixtures/interchange/invalid/checksum_tampered.json", - "sha256": "70f2243f90774cb67e1fdfac217e72ec0bab8c4378e5594f04a05cef644a2aba" - }, - { - "path": "tests/fixtures/interchange/invalid/choice_differs_from_output_field.json", - "sha256": "7764ffd6b98ce1612f8fbe0f50fcb977c2f2ee9ea88de5ba4b61c6411df0f450" - }, - { - "path": "tests/fixtures/interchange/invalid/choice_not_option.json", - "sha256": "dcabca7001e6c196fe42752844b81338346b9daa53ceaebfcd8405dba16067de" - }, - { - "path": "tests/fixtures/interchange/invalid/choice_without_decider.json", - "sha256": "82154fdcfef036626683547d77ad2473081afc9673e056b0497bd1bc7de1d923" - }, - { - "path": "tests/fixtures/interchange/invalid/committed_to_executor.json", - "sha256": "5c826f65529c66202634ef2780a88109165cb88b84587507efc6c82b0bf14abc" - }, - { - "path": "tests/fixtures/interchange/invalid/committed_unresolved_identity.json", - "sha256": "e36772de56aa9a86eb6b46bcbd73bf0c855919415a1638b02c150c905ee77fe0" - }, - { - "path": "tests/fixtures/interchange/invalid/committed_without_evidence.json", - "sha256": "0ec4357b076cfdc677933baa478de01dbd12518febdfc197a7baa51dd2192f06" - }, - { - "path": "tests/fixtures/interchange/invalid/confirmed_without_person.json", - "sha256": "47a1d89cdd5831581e78864e28ba7790badf82fbf3511f6a3e2f953aead29ea9" - }, - { - "path": "tests/fixtures/interchange/invalid/dangling_artifact.json", - "sha256": "ae534c2de923556f391b214f2cc66a4c22ebcb0557886603b5ebf4576965b2bc" - }, - { - "path": "tests/fixtures/interchange/invalid/domain_field_in_core.json", - "sha256": "323034db23ee3949851025ac2ccfde6cacb5ad1456710c90895dfa2d5f4d6999" - }, - { - "path": "tests/fixtures/interchange/invalid/duplicate_field.json", - "sha256": "b38ab0e2a2c04e3a3f3113a44a5b4cd4ea6f3737943138c5ce87db1b4e5c7d0a" - }, - { - "path": "tests/fixtures/interchange/invalid/existing_without_record.json", - "sha256": "def540bcd18b3da8892b292e2171c8a232c95fdc87b6acfcb57225dcbfb09f04" - }, - { - "path": "tests/fixtures/interchange/invalid/export_without_source_kind.json", - "sha256": "716f95040921b963fa1c479aaeb537fc5fa0792af5161a8bf4443a6781153408" - }, - { - "path": "tests/fixtures/interchange/invalid/halted_without_reason.json", - "sha256": "401e7ff5da615995e634a58c6807268172644583eb1d9f18f7b1521668278994" - }, - { - "path": "tests/fixtures/interchange/invalid/model_decided.json", - "sha256": "19d59cf6f2484d1416c7983db5bd2524e91f6e73ace0d4460a196607af93eb80" - }, - { - "path": "tests/fixtures/interchange/invalid/no_action_below_commit_level.json", - "sha256": "30e3de6af18a05ba32639c2b2d9e66d25828ef887460212b13c71b950a1c1ad7" - }, - { - "path": "tests/fixtures/interchange/invalid/no_action_decided_by_model.json", - "sha256": "4896cb0fc037fb0a5b23852f162837ea4a911f72f597085effd383ce4b4f10f1" - }, - { - "path": "tests/fixtures/interchange/invalid/no_action_to_executor.json", - "sha256": "b5f3517c1a60671ba579cb5b20ae96e8c5ff02e9c5315167989ac8a11ceac607" - }, - { - "path": "tests/fixtures/interchange/invalid/no_action_without_before_read.json", - "sha256": "8515b28f9d3e61b66fde0ac38cc7602db8af9e6f9c846100400011689a3c7bc6" - }, - { - "path": "tests/fixtures/interchange/invalid/no_action_without_evidence.json", - "sha256": "e04b221d147d3ae3cbd32a9840c717ace48de2499c971ab22c3370214590683b" - }, - { - "path": "tests/fixtures/interchange/invalid/no_action_without_record.json", - "sha256": "56d07a0575658f297a38d403b2e472f967e6d6877db4f0535390adb986994eef" - }, - { - "path": "tests/fixtures/interchange/invalid/no_action_write_detected.json", - "sha256": "f8d55806ad0f40ca24fb112633f1b7afa92e88c2afba74bf5250e5925ed5276e" - }, - { - "path": "tests/fixtures/interchange/invalid/payload_backslash_path.json", - "sha256": "96fa35ddb534df949cb6e75a697464b208b198850a6da07eee3e83ba576610b3" - }, - { - "path": "tests/fixtures/interchange/invalid/payload_drive_letter_path.json", - "sha256": "b1a07d7c20173f1b9401fc235812d88fc19b43b9e9ef47212625148ba1293fd5" - }, - { - "path": "tests/fixtures/interchange/invalid/payload_escapes_dir.json", - "sha256": "e1f02aec18d3e8cf351e674da17f39d0fc80419595ab6784dda9479d3ebf67b7" - }, - { - "path": "tests/fixtures/interchange/invalid/payload_hash_mismatch.json", - "sha256": "f143c667032c3a4f628f2368607e520de330b335d1d2a534fe5895b473607843" - }, - { - "path": "tests/fixtures/interchange/invalid/payload_nul_path.json", - "sha256": "a6963e6441acc536967abf69c973154302ea71a568252c361827b2af748bc43b" - }, - { - "path": "tests/fixtures/interchange/invalid/readback_without_screen_read.json", - "sha256": "5f5669eeb93bd97db4e14d142d7e329e0855ca002c9fed3892ab81839fb578ad" - }, - { - "path": "tests/fixtures/interchange/invalid/record_ref_mismatch.json", - "sha256": "3925a51c4732bc247a810c8adb71cf74ba41fc22a49a70c4bb62c6f415304348" - }, - { - "path": "tests/fixtures/interchange/invalid/reopened_read_differs.json", - "sha256": "0f0f3c5f54dabe1a5e1ca664e7ba67a43c6cf2fde794ec72ad964a744af983cf" - }, - { - "path": "tests/fixtures/interchange/invalid/reopened_read_not_on_screen.json", - "sha256": "469ffd0bb0939d92f46b1a3dd673a374deb0b0cee5198b91e8f1ced865593431" - }, - { - "path": "tests/fixtures/interchange/invalid/reopened_without_acting_read.json", - "sha256": "9175eb5f27e97143c41627919c9f07c0b87b63b21a34d11acf06baeb887de24f" - }, - { - "path": "tests/fixtures/interchange/invalid/reopened_without_reopened_read.json", - "sha256": "d21790cfa7082972bee927b1fde4bff7b76e0de9d18133877a6cc0fbba8eed54" - }, - { - "path": "tests/fixtures/interchange/invalid/result_without_in_reply_to.json", - "sha256": "b9703605154dd8682f5f714e08ec72e34f03c97330782ad128265f71e78026ca" - }, - { - "path": "tests/fixtures/interchange/invalid/review_without_reason.json", - "sha256": "6e845f7ae4110f089b9d288ef4b6f8ecca8ca1d32a2c41a37d4ea97bcecdbf44" - }, - { - "path": "tests/fixtures/interchange/invalid/seal_covers_other.json", - "sha256": "02c5ba7bc127c467dc226cc13a7495f0de47b0c0748de5b88d9a84a8616e5c7e" - }, - { - "path": "tests/fixtures/interchange/invalid/self_approval.json", - "sha256": "b0b9b3a0958d198a46f95d5ccbf98e48c7084cdda7174e87523ae550d31fe8b4" - }, - { - "path": "tests/fixtures/interchange/invalid/self_confirmation.json", - "sha256": "1328819add8415e34aee7dc479a790e3bf6edfe1143062388e3f0623daba56d9" - }, - { - "path": "tests/fixtures/interchange/invalid/system_of_record_from_live_session_export.json", - "sha256": "107c3b217b56304ca49cb0645757cd8751b44187a46ff780916738c0390324d0" - }, - { - "path": "tests/fixtures/interchange/invalid/system_of_record_without_independent_read.json", - "sha256": "427f866a31f3b8bd12470c3b7094403d6ae39b34d9e11c818ffbbb1e3f43a7c4" - }, - { - "path": "tests/fixtures/interchange/invalid/unauthorized_role.json", - "sha256": "69085e34f4b6ff6a492bf8300eeb1670374e267f626a9db9c6788179835127bb" - }, - { - "path": "tests/fixtures/interchange/invalid/unknown_identity_field.json", - "sha256": "3a102b5ded0272d0250f473bd365d0eb8999ae1128626afa27c06f1d6c5df31a" - }, - { - "path": "tests/fixtures/interchange/invalid/unknown_output_field.json", - "sha256": "06e575a4253e8b3b2b36396d5ccb7985f817ee689ef6a2643cfbb7683dc9162e" - }, - { - "path": "tests/fixtures/interchange/invalid/unnamespaced_extension.json", - "sha256": "57aaec8c3929d60e066a9a504c6573bb86e50bcd540e779a48fa61c8028576d2" - }, - { - "path": "tests/fixtures/interchange/invalid/wrong_value_type.json", - "sha256": "49ab7a8b1f2d71ae90da68a45b1423961f76399665451997e475933c03cd2d87" - }, - { - "path": "tests/fixtures/interchange/valid/invoice_posting.json", - "sha256": "72bf43e5f436858bdfa870fca93c8313e200c8dc378192f9046f0b9276c10d50" - }, - { - "path": "tests/fixtures/interchange/valid/invoice_posting_result.json", - "sha256": "317e33f8eb7e05de3e1dbebed1d72e17621f7a7323da00f06fa60752d3c04ff7" - }, - { - "path": "tests/fixtures/interchange/valid/referral_halted.json", - "sha256": "ad865cb1890cb09960268499a9e732005d4b7b00d72f6caa65f712152ac56ca8" - }, - { - "path": "tests/fixtures/interchange/valid/referral_intake.json", - "sha256": "b1c3416bd1e4f362977bc5bfc3e56fd0489767efefcdb17e1de36c97066b8c4b" - }, - { - "path": "tests/fixtures/interchange/valid/referral_no_action.json", - "sha256": "57d207817f745ea6827e53fe67555db85864bbec08a1f22b96c20f7c19521a29" - }, - { - "path": "tests/fixtures/interchange/valid/referral_result.json", - "sha256": "33122ddd0d48b2230a2265fe2c6ff615e966a8d8a9c6eb8eaf9f0ca395673c1d" - }, - { - "path": "tests/fixtures/jit/anthropic_add_note.json", - "sha256": "28b2b0f48873021ec5472caa89fef667cc08e9eddf57b1295aecc8be02ed171c" - }, - { - "path": "tests/fixtures/jit/openai_add_note.json", - "sha256": "bf82745f08485bc10dd2beabe653d446e32300946e81d935417599c3510b80a8" - }, - { - "path": "tests/fixtures/jit/playwright_mcp_add_note.json", - "sha256": "e15ae34f5a851bd7b92d565394b3989aad4f31cfc94378d536a098eca7c5e91e" - }, - { - "path": "tests/fixtures/jit/playwright_mcp_snapshot_refs.json", - "sha256": "1506ca759e5298fc67d7bb44119625b19c8111f0a722e8933566f2850ae18653" - }, - { - "path": "tests/fixtures/match_ridge/openemr_accordion_rdp.png", - "sha256": "96baeda5e5cb84da804897ba573b4b12bb9f1a6b5008855a6f18458ca8adc558" - }, - { - "path": "tests/fixtures/remote-safe-synthetic-flow-release-verification.json", - "sha256": "bf170018cd1d3519f40ebd2788e158dd34a789c7bfe1e85e30e3a445e5e40af8" - }, - { - "path": "tests/fixtures/runtime-validation-canonical-vector.json", - "sha256": "a238b23846705f081603c7fe8a66ee16a88281ad21acfd0d047052716a49b912" - }, - { - "path": "tests/fixtures/shadow/invoice_exact.episodes.json", - "sha256": "e555e3913c02df609cdf490872fad30574a1c438b2c110b0ff3345e1a31c26ce" - }, - { - "path": "tests/fixtures/shadow/invoice_variant.episodes.json", - "sha256": "cc2d9508eac86e6115485025525e7529b4830f720eb28c21e258622e7a70ec79" - }, - { - "path": "tests/fixtures/shadow/report_mail.episodes.json", - "sha256": "4e3f1fed5b5bfba9220fd37d53eff1bea2655df4903fb6a59ec215bc3e2d2ec0" - }, - { - "path": "tests/fixtures/terminal_verification_v2_delivery_consumer_vector.json", - "sha256": "f2e32472ad562b5b67d95d3d9cafaf08b4a2adb9fb5ff3cda2813307beb61c96" - }, - { - "path": "tests/fixtures/terminal_verification_v2_delivery_vector.json", - "sha256": "20a1ae7f1878315c100c58894ec14bbc6af4848a6c206c467ca82cff025325f0" - }, - { - "path": "tests/fixtures/terminal_verification_v2_terminal_consumer_vectors.json", - "sha256": "8b84b80705de47e511fcadf1b2d6d15a95615dbbabb247f2eb1ab1d542fc903a" - }, - { - "path": "tests/fixtures/terminal_verification_v2_terminal_vectors.json", - "sha256": "0934335fca3324af3d1ae40f8c1cfa7b4e49c25b5c5975ab5e41961689b16278" - }, - { - "path": "tests/fixtures/theme-region-stable-overhalt-v1.16.1.json", - "sha256": "4bf055e6c11f837ed6daa4a5b89ab28dd431a7eccd2ce3044758ba260eed52cd" - }, - { - "path": "tests/fixtures/v4-qualification/decision-receipt.json", - "sha256": "6ffe691f8e40e06b73e24391d180424ed86bb289ddae001cf7b49de2e745312a" - }, - { - "path": "tests/fixtures/v4-qualification/qualification-admission.json", - "sha256": "dcdb32a762aca87fbb1a7c9df5d346403b167ec5850d35fe47fd64d942684a04" - }, - { - "path": "tests/fixtures/v4-qualification/revocation-state.json", - "sha256": "18633b8cc243f686706606162bfa249a29733811563f63b9e68cc7c4a3507676" - }, - { - "path": "tests/fixtures/v4-qualification/signer-registry.json", - "sha256": "7a81bf3d213c74673f3c6b5fa179234cbee534c9432aaea6ae09e455562f96b6" - }, - { - "path": "tests/golden/tutorial_run.json", - "sha256": "14242973a8fa8355e39633d23a51f5615f3f7bf9e956bc5ac6909d57ccfac3de" - } + ".github/ISSUE_TEMPLATE/bug_report.yml", + ".github/ISSUE_TEMPLATE/config.yml", + ".github/ISSUE_TEMPLATE/feature_request.yml", + ".github/actionlint.yaml", + ".github/dependabot.yml", + ".github/mypy-interop.ini", + ".github/release-health.json", + ".github/workflows/canvas-nodom-ladder.yml", + ".github/workflows/ci.yml", + ".github/workflows/citrix-workspace-standin.yml", + ".github/workflows/docker-rdp-multiapp-vision.yml", + ".github/workflows/docker-rdp-vision-ladder.yml", + ".github/workflows/paper.yml", + ".github/workflows/quickstart-lifecycle.yml", + ".github/workflows/release-health.yml", + ".github/workflows/release.yml", + ".github/workflows/validate-claims.yml", + ".pre-commit-config.yaml", + "benchmark/ap_invoice/results.json", + "benchmark/appliance_validation/results.json", + "benchmark/appliance_validation/results_identity_full.json", + "benchmark/appliance_validation/results_supplement.json", + "benchmark/canvas_ladder/results.json", + "benchmark/citrix_ica_hdx/results.json", + "benchmark/citrix_ica_hdx/status_manifest.json", + "benchmark/citrix_workspace/results.json", + "benchmark/comparison_artifact/comparison.html", + "benchmark/comparison_artifact/comparison.json", + "benchmark/cosmetic_drift/results.json", + "benchmark/dense_surface/dense_surface.json", + "benchmark/dense_surface/record_seed1.png", + "benchmark/dense_surface/replay_hi_res_arial_seed1.png", + "benchmark/dense_surface/replay_native_arial_seed1.png", + "benchmark/dense_surface/replay_serif_drift_seed1.png", + "benchmark/dense_surface/replay_small_dense_seed1.png", + "benchmark/desktop/outcomes.png", + "benchmark/desktop/results.json", + "benchmark/dom/finals/perturbation_compiled_028.png", + "benchmark/dom/finals/perturbation_dom_named_028.png", + "benchmark/dom/outcome_matrix.png", + "benchmark/dom/results.json", + "benchmark/effect_e2e/effect_e2e.png", + "benchmark/effect_e2e/results.json", + "benchmark/effect_readback/results.json", + "benchmark/effectbench/pyproject.toml", + "benchmark/effectbench/results/openadapt_reference.json", + "benchmark/effectbench/results/reference.json", + "benchmark/effectbench/task_pack/manifest.json", + "benchmark/environments/environments.json", + "benchmark/environments/verification.json", + "benchmark/fault_model/results.json", + "benchmark/frappe_lending/apps.json", + "benchmark/frappe_lending/compose.yml", + "benchmark/frappe_lending/environment.lock.json", + "benchmark/governed_run/results.json", + "benchmark/grounding_eval/results.json", + "benchmark/grounding_eval/results_sweep.json", + "benchmark/harness2_scorer/evidence/base/results.json", + "benchmark/harness2_scorer/evidence/harness2/results.json", + "benchmark/harness2_scorer/evidence/harness2_readback/results.json", + "benchmark/harness2_scorer/evidence/raw.tar.gz", + "benchmark/harness2_scorer/evidence/summary.json", + "benchmark/hybrid/results.json", + "benchmark/hybrid/success_cost.png", + "benchmark/identity_ladder/identity_ladder.json", + "benchmark/known_ids/results.json", + "benchmark/latency_cost.png", + "benchmark/lending_fault_model/resolution_ladder_results.json", + "benchmark/lending_fault_model/results.json", + "benchmark/lending_fault_model/swer_results.json", + "benchmark/macos_native/ax_identity_20260720.adjudication.json", + "benchmark/macos_native/ax_identity_20260720.json", + "benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json", + "benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.json", + "benchmark/multiapp-standard.yaml", + "benchmark/o2c_recon/results.json", + "benchmark/openemr/latency_cost.png", + "benchmark/openemr/results.json", + "benchmark/openemr_api_tier/spike/api_bundle/compile_report.json", + "benchmark/openemr_api_tier/spike/api_bundle/manifest.json", + "benchmark/openemr_api_tier/spike/api_bundle/session_form.json", + "benchmark/openemr_api_tier/spike/api_bundle/workflow.json", + "benchmark/openemr_api_tier/spike/results/capture_r1.json", + "benchmark/openemr_api_tier/spike/results/figures.json", + "benchmark/openemr_api_tier/spike/results/har_summary.json", + "benchmark/openemr_api_tier/spike/results/probes.json", + "benchmark/openemr_api_tier/spike/results/runs.csv", + "benchmark/openemr_api_tier/spike/results/runs/b01-api-1-r1-nadia-brennan.json", + "benchmark/openemr_api_tier/spike/results/runs/b01-api-2-r2-marcus-feld.json", + "benchmark/openemr_api_tier/spike/results/runs/b01-api-3-r3-ines-carvalho.json", + "benchmark/openemr_api_tier/spike/results/runs/b01-api-4-r4-theo-lindqvist.json", + "benchmark/openemr_api_tier/spike/results/runs/b01-browser-1-r1-nadia-brennan.json", + "benchmark/openemr_api_tier/spike/results/runs/b01-browser-2-r2-marcus-feld.json", + "benchmark/openemr_api_tier/spike/results/runs/b01-browser-3-r3-ines-carvalho.json", + "benchmark/openemr_api_tier/spike/results/runs/b01-browser-4-r4-theo-lindqvist.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-api-1-r5-grace-adeyemi.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-api-2-r6-rosa-delgado.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-api-3-r7-arlo-whitcombe.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-api-4-r8-priya-raman.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-browser-1-r5-grace-adeyemi.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-browser-2-r6-rosa-delgado.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-browser-3-r7-arlo-whitcombe.json", + "benchmark/openemr_api_tier/spike/results/runs/b02-browser-4-r8-priya-raman.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-api-1-r1-nadia-brennan.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-api-2-r2-marcus-feld.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-api-3-r3-ines-carvalho.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-api-4-r4-theo-lindqvist.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-browser-1-r1-nadia-brennan.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-browser-2-r2-marcus-feld.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-browser-3-r3-ines-carvalho.json", + "benchmark/openemr_api_tier/spike/results/runs/b03-browser-4-r4-theo-lindqvist.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-api-1-r5-grace-adeyemi.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-api-2-r6-rosa-delgado.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-api-3-r7-arlo-whitcombe.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-api-4-r8-priya-raman.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-browser-1-r5-grace-adeyemi.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-browser-2-r6-rosa-delgado.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-browser-3-r7-arlo-whitcombe.json", + "benchmark/openemr_api_tier/spike/results/runs/b04-browser-4-r8-priya-raman.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-api-1-r1-nadia-brennan.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-api-2-r2-marcus-feld.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-api-3-r3-ines-carvalho.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-api-4-r4-theo-lindqvist.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-browser-1-r1-nadia-brennan.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-browser-2-r2-marcus-feld.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-browser-3-r3-ines-carvalho.json", + "benchmark/openemr_api_tier/spike/results/runs/b05-browser-4-r4-theo-lindqvist.json", + "benchmark/openemr_api_tier/spike/results/runs/block-01-api.json", + "benchmark/openemr_api_tier/spike/results/runs/block-01-browser.json", + "benchmark/openemr_api_tier/spike/results/runs/block-02-api.json", + "benchmark/openemr_api_tier/spike/results/runs/block-02-browser.json", + "benchmark/openemr_api_tier/spike/results/runs/block-03-api.json", + "benchmark/openemr_api_tier/spike/results/runs/block-03-browser.json", + "benchmark/openemr_api_tier/spike/results/runs/block-04-api.json", + "benchmark/openemr_api_tier/spike/results/runs/block-04-browser.json", + "benchmark/openemr_api_tier/spike/results/runs/block-05-api.json", + "benchmark/openemr_api_tier/spike/results/runs/block-05-browser.json", + "benchmark/openemr_live/docker-compose.yml", + "benchmark/openemr_local/environment.lock.json", + "benchmark/openemr_local/verify.yaml", + "benchmark/openemr_referral_timing/figures.json", + "benchmark/openemr_referral_timing/runs.csv", + "benchmark/openimis_claims/deployment.eligibility.yaml", + "benchmark/openimis_claims/environment.lock.json", + "benchmark/openimis_claims/submit_binding_probe.json", + "benchmark/pixel_identity/crop_O0_digit_1_sibling.png", + "benchmark/pixel_identity/crop_O0_digit_1_target.png", + "benchmark/pixel_identity/crop_O0_digit_2_sibling.png", + "benchmark/pixel_identity/crop_O0_digit_2_target.png", + "benchmark/pixel_identity/crop_O0_digit_3_sibling.png", + "benchmark/pixel_identity/crop_O0_digit_3_target.png", + "benchmark/pixel_identity/pixel_identity.json", + "benchmark/pixel_identity_aligned/evidence.json", + "benchmark/pixel_scale/results_after.json", + "benchmark/pixel_scale/results_before.json", + "benchmark/pixel_scale/results_before_no_drift_check.json", + "benchmark/qualification_gate/campaign.json", + "benchmark/qualification_gate/policy.yaml", + "benchmark/qualification_gate/results.json", + "benchmark/rdp/results.json", + "benchmark/rdp/results_82a658a_20260718.sanitized.json", + "benchmark/rdp/results_e2c7acf_20260718.json", + "benchmark/rdp_ladder/policy.yaml", + "benchmark/rdp_ladder/results.json", + "benchmark/rdp_multiapp/campaign.json", + "benchmark/rdp_multiapp/policy.yaml", + "benchmark/rdp_pool/results.json", + "benchmark/reliability/summary.json", + "benchmark/results.json", + "benchmark/run_player/player.html", + "benchmark/run_player/player_data.json", + "benchmark/run_player/runs/modal-halt-run/report.json", + "benchmark/run_player/runs/modal-halt-run/steps/step_000_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_000_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_001_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_001_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_002_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_002_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_003_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_003_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_004_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_004_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_005_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_005_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_006_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_006_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_007_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_007_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_008_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_008_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_009_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_009_before.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_010_after.png", + "benchmark/run_player/runs/modal-halt-run/steps/step_010_before.png", + "benchmark/safety_gallery/gallery.html", + "benchmark/safety_gallery/results.json", + "benchmark/silent_wrong_action/results.json", + "benchmark/silent_wrong_action/silent_wrong_action.png", + "benchmark/structural_action/structural_action.json", + "benchmark/ui_readback/results.json", + "benchmark/vision_hardening/corpus.json", + "benchmark/vision_hardening/results.json", + "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_AC50061_vs_AC5OO61.png", + "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_MG4408_vs_MG44O8.png", + "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_MG7008_vs_MG7O08.png", + "benchmark/vlm_identity/pairs/collapse_digit_flanked_O0_RT8005_vs_RT8OO5.png", + "benchmark/vlm_identity/pairs/drift_MG4482_dark.png", + "benchmark/vlm_identity/vlm_identity.json", + "benchmark/windows_uia/results.json", + "claims.yaml", + "deploy/on-prem/docker-compose.yml", + "deploy/on-prem/onprem.example.yaml", + "docs/console/run-halted.png", + "docs/console/run-paused.png", + "docs/console/runs.png", + "docs/console/skills.png", + "docs/console/workflow-detail-cert.png", + "docs/console/workflow-diff.png", + "docs/console/workflows.png", + "docs/deployment.example.yaml", + "docs/program-workbench.png", + "docs/showcase-compose/program-graph.html", + "docs/showcase-compose/program-graph.png", + "docs/showcase-encounter-loop/body/manifest.json", + "docs/showcase-encounter-loop/body/workflow.json", + "docs/showcase-encounter-loop/bundle/manifest.json", + "docs/showcase-encounter-loop/bundle/workflow.json", + "docs/showcase-encounter-loop/worklist.csv", + "docs/showcase-loop/bundle/manifest.json", + "docs/showcase-loop/bundle/templates/step_000.png", + "docs/showcase-loop/bundle/templates/step_000_expect.png", + "docs/showcase-loop/bundle/templates/step_001_expect.png", + "docs/showcase-loop/bundle/templates/step_002.png", + "docs/showcase-loop/bundle/templates/step_002_expect.png", + "docs/showcase-loop/bundle/templates/step_003_expect.png", + "docs/showcase-loop/bundle/templates/step_004.png", + "docs/showcase-loop/bundle/templates/step_004_expect.png", + "docs/showcase-loop/bundle/templates/step_005.png", + "docs/showcase-loop/bundle/templates/step_005_expect.png", + "docs/showcase-loop/bundle/templates/step_006_expect.png", + "docs/showcase-loop/bundle/templates/step_007_expect.png", + "docs/showcase-loop/bundle/templates/step_008.png", + "docs/showcase-loop/bundle/templates/step_008_expect.png", + "docs/showcase-loop/bundle/templates/step_013.png", + "docs/showcase-loop/bundle/templates/step_013_expect.png", + "docs/showcase-loop/bundle/templates/step_014.png", + "docs/showcase-loop/bundle/templates/step_014_expect.png", + "docs/showcase-loop/bundle/templates/step_015.png", + "docs/showcase-loop/bundle/templates/step_015_expect.png", + "docs/showcase-loop/bundle/templates/step_017.png", + "docs/showcase-loop/bundle/templates/step_017_expect.png", + "docs/showcase-loop/bundle/workflow.json", + "docs/showcase-loop/worklist.csv", + "docs/showcase-openemr/bundle/templates/step_000.png", + "docs/showcase-openemr/bundle/templates/step_000_expect.png", + "docs/showcase-openemr/bundle/templates/step_001_expect.png", + "docs/showcase-openemr/bundle/templates/step_002.png", + "docs/showcase-openemr/bundle/templates/step_002_expect.png", + "docs/showcase-openemr/bundle/templates/step_003_expect.png", + "docs/showcase-openemr/bundle/templates/step_004.png", + "docs/showcase-openemr/bundle/templates/step_004_expect.png", + "docs/showcase-openemr/bundle/templates/step_005.png", + "docs/showcase-openemr/bundle/templates/step_005_expect.png", + "docs/showcase-openemr/bundle/templates/step_006_expect.png", + "docs/showcase-openemr/bundle/templates/step_007_expect.png", + "docs/showcase-openemr/bundle/templates/step_008.png", + "docs/showcase-openemr/bundle/templates/step_008_expect.png", + "docs/showcase-openemr/bundle/templates/step_013.png", + "docs/showcase-openemr/bundle/templates/step_013_expect.png", + "docs/showcase-openemr/bundle/templates/step_014.png", + "docs/showcase-openemr/bundle/templates/step_014_expect.png", + "docs/showcase-openemr/bundle/templates/step_015.png", + "docs/showcase-openemr/bundle/templates/step_015_expect.png", + "docs/showcase-openemr/bundle/templates/step_017.png", + "docs/showcase-openemr/bundle/templates/step_017_expect.png", + "docs/showcase-openemr/bundle/workflow.json", + "docs/showcase-openemr/failure-evidence/calendar-region-recorded.png", + "docs/showcase-openemr/failure-evidence/calendar-region-replay.png", + "docs/showcase-openemr/program-graph.html", + "docs/showcase-openemr/program-graph.json", + "docs/showcase-openemr/program-graph.png", + "docs/showcase-openemr/recording/events.jsonl", + "docs/showcase-openemr/recording/frames/0000_after.png", + "docs/showcase-openemr/recording/frames/0000_before.png", + "docs/showcase-openemr/recording/frames/0001_after.png", + "docs/showcase-openemr/recording/frames/0001_before.png", + "docs/showcase-openemr/recording/frames/0002_after.png", + "docs/showcase-openemr/recording/frames/0002_before.png", + "docs/showcase-openemr/recording/frames/0003_after.png", + "docs/showcase-openemr/recording/frames/0003_before.png", + "docs/showcase-openemr/recording/frames/0004_after.png", + "docs/showcase-openemr/recording/frames/0004_before.png", + "docs/showcase-openemr/recording/frames/0005_after.png", + "docs/showcase-openemr/recording/frames/0005_before.png", + "docs/showcase-openemr/recording/frames/0006_after.png", + "docs/showcase-openemr/recording/frames/0006_before.png", + "docs/showcase-openemr/recording/frames/0007_after.png", + "docs/showcase-openemr/recording/frames/0007_before.png", + "docs/showcase-openemr/recording/frames/0008_after.png", + "docs/showcase-openemr/recording/frames/0008_before.png", + "docs/showcase-openemr/recording/frames/0009_after.png", + "docs/showcase-openemr/recording/frames/0009_before.png", + "docs/showcase-openemr/recording/frames/0010_after.png", + "docs/showcase-openemr/recording/frames/0010_before.png", + "docs/showcase-openemr/recording/frames/0011_after.png", + "docs/showcase-openemr/recording/frames/0011_before.png", + "docs/showcase-openemr/recording/frames/0012_after.png", + "docs/showcase-openemr/recording/frames/0012_before.png", + "docs/showcase-openemr/recording/frames/0013_after.png", + "docs/showcase-openemr/recording/frames/0013_before.png", + "docs/showcase-openemr/recording/frames/0014_after.png", + "docs/showcase-openemr/recording/frames/0014_before.png", + "docs/showcase-openemr/recording/frames/0015_after.png", + "docs/showcase-openemr/recording/frames/0015_before.png", + "docs/showcase-openemr/recording/frames/0016_after.png", + "docs/showcase-openemr/recording/frames/0016_before.png", + "docs/showcase-openemr/recording/frames/0017_after.png", + "docs/showcase-openemr/recording/frames/0017_before.png", + "docs/showcase-openemr/recording/meta.json", + "docs/showcase-openemr/runs/run-1/final.png", + "docs/showcase-openemr/runs/run-1/heals/step_013/heal.json", + "docs/showcase-openemr/runs/run-1/heals/step_013/screen.png", + "docs/showcase-openemr/runs/run-1/heals/step_013/template.png", + "docs/showcase-openemr/runs/run-1/report.json", + "docs/showcase-openemr/runs/run-1/steps/step_000_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_000_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_001_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_001_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_002_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_002_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_003_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_003_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_004_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_004_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_005_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_005_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_006_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_006_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_007_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_007_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_008_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_008_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_009_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_009_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_010_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_010_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_011_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_011_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_012_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_012_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_013_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_013_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_014_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_014_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_015_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_015_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_016_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_016_before.png", + "docs/showcase-openemr/runs/run-1/steps/step_017_after.png", + "docs/showcase-openemr/runs/run-1/steps/step_017_before.png", + "docs/showcase-openemr/runs/run-2/final.png", + "docs/showcase-openemr/runs/run-2/report.json", + "docs/showcase-openemr/runs/run-3/final.png", + "docs/showcase-openemr/runs/run-3/report.json", + "docs/showcase-openemr/runs/run-4/final.png", + "docs/showcase-openemr/runs/run-4/report.json", + "docs/showcase-openemr/runs/run-5/final.png", + "docs/showcase-openemr/runs/run-5/report.json", + "docs/showcase-openemr/runs/summary.json", + "docs/showcase-openimis/eligibility_halt.gif", + "docs/showcase-openimis/eligibility_replay.gif", + "docs/showcase-openimis/green-run/report.json", + "docs/showcase-openimis/green-run/steps/step_000_after.png", + "docs/showcase-openimis/green-run/steps/step_000_before.png", + "docs/showcase-openimis/green-run/steps/step_001_after.png", + "docs/showcase-openimis/green-run/steps/step_001_before.png", + "docs/showcase-openimis/green-run/steps/step_002_after.png", + "docs/showcase-openimis/green-run/steps/step_002_before.png", + "docs/showcase-openimis/green-run/steps/step_003_after.png", + "docs/showcase-openimis/green-run/steps/step_003_before.png", + "docs/showcase-openimis/green-run/steps/step_004_after.png", + "docs/showcase-openimis/green-run/steps/step_004_before.png", + "docs/showcase-openimis/green-run/steps/step_005_after.png", + "docs/showcase-openimis/green-run/steps/step_005_before.png", + "docs/showcase-openimis/halt-run/report.json", + "docs/showcase-openimis/halt-run/steps/step_000_after.png", + "docs/showcase-openimis/halt-run/steps/step_000_before.png", + "docs/showcase-openimis/halt-run/steps/step_001_after.png", + "docs/showcase-openimis/halt-run/steps/step_001_before.png", + "docs/showcase-openimis/halt-run/steps/step_002_after.png", + "docs/showcase-openimis/halt-run/steps/step_002_before.png", + "docs/showcase-openimis/halt-run/steps/step_003_after.png", + "docs/showcase-openimis/halt-run/steps/step_003_before.png", + "docs/showcase-openimis/halt-run/steps/step_004_after.png", + "docs/showcase-openimis/halt-run/steps/step_004_before.png", + "docs/showcase-openimis/halt-run/steps/step_005_after.png", + "docs/showcase-openimis/halt-run/steps/step_005_before.png", + "docs/showcase-openimis/stills/coverage_active_dialog.png", + "docs/showcase-openimis/stills/coverage_lapsed_dialog.png", + "docs/showcase-openimis/stills/verdict_confirmed_card.png", + "docs/showcase-openimis/stills/verdict_refuted_card.png", + "docs/showcase-process/program-graph.html", + "docs/showcase-process/program-graph.png", + "docs/showcase/baseline-run/report.json", + "docs/showcase/baseline-run/steps/step_000_after.png", + "docs/showcase/baseline-run/steps/step_000_before.png", + "docs/showcase/baseline-run/steps/step_001_after.png", + "docs/showcase/baseline-run/steps/step_001_before.png", + "docs/showcase/baseline-run/steps/step_002_after.png", + "docs/showcase/baseline-run/steps/step_002_before.png", + "docs/showcase/baseline-run/steps/step_003_after.png", + "docs/showcase/baseline-run/steps/step_003_before.png", + "docs/showcase/baseline-run/steps/step_004_after.png", + "docs/showcase/baseline-run/steps/step_004_before.png", + "docs/showcase/baseline-run/steps/step_005_after.png", + "docs/showcase/baseline-run/steps/step_005_before.png", + "docs/showcase/baseline-run/steps/step_006_after.png", + "docs/showcase/baseline-run/steps/step_006_before.png", + "docs/showcase/baseline-run/steps/step_007_after.png", + "docs/showcase/baseline-run/steps/step_007_before.png", + "docs/showcase/baseline-run/steps/step_008_after.png", + "docs/showcase/baseline-run/steps/step_008_before.png", + "docs/showcase/baseline-run/steps/step_009_after.png", + "docs/showcase/baseline-run/steps/step_009_before.png", + "docs/showcase/baseline-run/steps/step_010_after.png", + "docs/showcase/baseline-run/steps/step_010_before.png", + "docs/showcase/bundle/templates/step_000.png", + "docs/showcase/bundle/templates/step_002.png", + "docs/showcase/bundle/templates/step_004.png", + "docs/showcase/bundle/templates/step_005.png", + "docs/showcase/bundle/templates/step_006.png", + "docs/showcase/bundle/templates/step_007.png", + "docs/showcase/bundle/templates/step_008.png", + "docs/showcase/bundle/templates/step_010.png", + "docs/showcase/bundle/workflow.json", + "docs/showcase/demo-proof.png", + "docs/showcase/demo.gif", + "docs/showcase/healed-bundle/templates/step_000.png", + "docs/showcase/healed-bundle/templates/step_002.png", + "docs/showcase/healed-bundle/templates/step_004.png", + "docs/showcase/healed-bundle/templates/step_005.png", + "docs/showcase/healed-bundle/templates/step_006.png", + "docs/showcase/healed-bundle/templates/step_007.png", + "docs/showcase/healed-bundle/templates/step_008.png", + "docs/showcase/healed-bundle/templates/step_010.png", + "docs/showcase/healed-bundle/workflow.json", + "docs/showcase/recording/events.jsonl", + "docs/showcase/recording/frames/0000_after.png", + "docs/showcase/recording/frames/0000_before.png", + "docs/showcase/recording/frames/0001_after.png", + "docs/showcase/recording/frames/0001_before.png", + "docs/showcase/recording/frames/0002_after.png", + "docs/showcase/recording/frames/0002_before.png", + "docs/showcase/recording/frames/0003_after.png", + "docs/showcase/recording/frames/0003_before.png", + "docs/showcase/recording/frames/0004_after.png", + "docs/showcase/recording/frames/0004_before.png", + "docs/showcase/recording/frames/0005_after.png", + "docs/showcase/recording/frames/0005_before.png", + "docs/showcase/recording/frames/0006_after.png", + "docs/showcase/recording/frames/0006_before.png", + "docs/showcase/recording/frames/0007_after.png", + "docs/showcase/recording/frames/0007_before.png", + "docs/showcase/recording/frames/0008_after.png", + "docs/showcase/recording/frames/0008_before.png", + "docs/showcase/recording/frames/0009_after.png", + "docs/showcase/recording/frames/0009_before.png", + "docs/showcase/recording/frames/0010_after.png", + "docs/showcase/recording/frames/0010_before.png", + "docs/showcase/recording/meta.json", + "docs/showcase/theme-drift-run/heals/step_000/heal.json", + "docs/showcase/theme-drift-run/heals/step_000/screen.png", + "docs/showcase/theme-drift-run/heals/step_000/template.png", + "docs/showcase/theme-drift-run/heals/step_002/heal.json", + "docs/showcase/theme-drift-run/heals/step_002/screen.png", + "docs/showcase/theme-drift-run/heals/step_002/template.png", + "docs/showcase/theme-drift-run/heals/step_004/heal.json", + "docs/showcase/theme-drift-run/heals/step_004/screen.png", + "docs/showcase/theme-drift-run/heals/step_004/template.png", + "docs/showcase/theme-drift-run/heals/step_005/heal.json", + "docs/showcase/theme-drift-run/heals/step_005/screen.png", + "docs/showcase/theme-drift-run/heals/step_005/template.png", + "docs/showcase/theme-drift-run/heals/step_006/heal.json", + "docs/showcase/theme-drift-run/heals/step_006/screen.png", + "docs/showcase/theme-drift-run/heals/step_006/template.png", + "docs/showcase/theme-drift-run/heals/step_007/heal.json", + "docs/showcase/theme-drift-run/heals/step_007/screen.png", + "docs/showcase/theme-drift-run/heals/step_007/template.png", + "docs/showcase/theme-drift-run/heals/step_008/heal.json", + "docs/showcase/theme-drift-run/heals/step_008/screen.png", + "docs/showcase/theme-drift-run/heals/step_008/template.png", + "docs/showcase/theme-drift-run/heals/step_010/heal.json", + "docs/showcase/theme-drift-run/heals/step_010/screen.png", + "docs/showcase/theme-drift-run/heals/step_010/template.png", + "docs/showcase/theme-drift-run/report.json", + "docs/showcase/theme-drift-run/steps/step_000_after.png", + "docs/showcase/theme-drift-run/steps/step_000_before.png", + "docs/showcase/theme-drift-run/steps/step_001_after.png", + "docs/showcase/theme-drift-run/steps/step_001_before.png", + "docs/showcase/theme-drift-run/steps/step_002_after.png", + "docs/showcase/theme-drift-run/steps/step_002_before.png", + "docs/showcase/theme-drift-run/steps/step_003_after.png", + "docs/showcase/theme-drift-run/steps/step_003_before.png", + "docs/showcase/theme-drift-run/steps/step_004_after.png", + "docs/showcase/theme-drift-run/steps/step_004_before.png", + "docs/showcase/theme-drift-run/steps/step_005_after.png", + "docs/showcase/theme-drift-run/steps/step_005_before.png", + "docs/showcase/theme-drift-run/steps/step_006_after.png", + "docs/showcase/theme-drift-run/steps/step_006_before.png", + "docs/showcase/theme-drift-run/steps/step_007_after.png", + "docs/showcase/theme-drift-run/steps/step_007_before.png", + "docs/showcase/theme-drift-run/steps/step_008_after.png", + "docs/showcase/theme-drift-run/steps/step_008_before.png", + "docs/showcase/theme-drift-run/steps/step_009_after.png", + "docs/showcase/theme-drift-run/steps/step_009_before.png", + "docs/showcase/theme-drift-run/steps/step_010_after.png", + "docs/showcase/theme-drift-run/steps/step_010_before.png", + "docs/validation/decision_triage_synthetic.json", + "docs/verification.json", + "examples/claude-code-demo/demo.gif", + "examples/claude-code-demo/effect_contract.yaml", + "examples/claude-code-demo/halt.gif", + "examples/claude-code-demo/policy.yaml", + "examples/legacy_records/answers.demo.json", + "examples/legacy_records/answers.ledger.demo.json", + "openadapt_flow/console/static/console.css", + "openadapt_flow/console/static/console.js", + "openadapt_flow/console/static/index.html", + "openadapt_flow/eligibility/payer_routes.yaml", + "openadapt_flow/mockloan/static/app.js", + "openadapt_flow/mockloan/static/index.html", + "openadapt_flow/mockloan/static/styles.css", + "openadapt_flow/mockmed/static/app.js", + "openadapt_flow/mockmed/static/index.html", + "openadapt_flow/mockmed/static/styles.css", + "openadapt_flow/mockmed/static/widgets.html", + "openadapt_flow/mockmed/static/widgets.js", + "openadapt_flow/policies/clinical-write.yaml", + "openadapt_flow/policies/permissive.yaml", + "openadapt_flow/visualize/static/program_graph.css", + "openadapt_flow/visualize/static/program_graph.js", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_000.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_000_expect.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_001.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_001_expect.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_002.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_002_expect.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_003.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_003_expect.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_005.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/templates/step_005_expect.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/bundle/workflow.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/replay.webm", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/cases/representative/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/compiled/program-graph.html", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/compiled/program-graph.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/media/recording.webm", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/qualification/project.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/qualification/report.json", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0000_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0000_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0001_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0001_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0002_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0002_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0003_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0003_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0004_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0004_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0005_after.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/frames/0005_before.png", + "public-demo/evidence-packs/mockmed-triage-v1/artifacts/recording/meta.json", + "public-demo/evidence-packs/mockmed-triage-v1/manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_000.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_000_expect.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_001.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_001_expect.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_002.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_002_expect.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_003.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_003_expect.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_005.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/templates/step_005_expect.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/bundle/workflow.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/replay.webm", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/cases/representative/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/compiled/program-graph.html", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/compiled/program-graph.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/media/recording.webm", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/qualification/project.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/qualification/report.json", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0000_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0000_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0001_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0001_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0002_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0002_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0003_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0003_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0004_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0004_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0005_after.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/frames/0005_before.png", + "public-demo/evidence-packs/mockmed-triage-v2/artifacts/recording/meta.json", + "public-demo/evidence-packs/mockmed-triage-v2/manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_000.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_000_expect.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_001.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_001_expect.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_002.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_002_expect.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_003.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_003_expect.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_005.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/templates/step_005_expect.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/bundle/workflow.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-ambiguity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-missing-effect/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-stale-identity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-weak-effect/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/halt.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/pending_escalation.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/fault-wrong-identity/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/replay.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-02/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/oracle.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/outcome.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/_manifest.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0000_step_000.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0001_step_001.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0002_step_002.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0003_step_003.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0004_step_004.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/checkpoints/step_0005_step_005.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-03/run/steps/step_005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/compiled/program-graph.html", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/compiled/program-graph.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/media/recording.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/demonstration.control-overlay.v2.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/demonstration.frame-pts-us.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/demonstration.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/halted.control-overlay.v2.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/halted.frame-pts-us.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/halted.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/verified.control-overlay.v2.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/verified.frame-pts-us.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/presentation/verified.webm", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/qualification/project.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/qualification/report.json", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/events.jsonl", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0000_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0000_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0001_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0001_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0002_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0002_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0003_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0003_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0004_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0004_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0005_after.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/frames/0005_before.png", + "public-demo/evidence-packs/mockmed-triage-v3/artifacts/recording/meta.json", + "public-demo/evidence-packs/mockmed-triage-v3/manifest.json", + "public-demo/mockmed-verify.yaml", + "registry/bundles/openemr/new-referral/benchmark-contract.json", + "registry/bundles/openemr/new-referral/manifest.json", + "registry/bundles/openemr/new-referral/param_hygiene.json", + "registry/bundles/openemr/new-referral/templates/identifiers/step_003.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_006.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_009.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_012.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_017.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_020.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_023.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_026.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_029.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_032.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_035.png", + "registry/bundles/openemr/new-referral/templates/identifiers/step_040.png", + "registry/bundles/openemr/new-referral/templates/step_000.png", + "registry/bundles/openemr/new-referral/templates/step_000_expect.png", + "registry/bundles/openemr/new-referral/templates/step_003.png", + "registry/bundles/openemr/new-referral/templates/step_003_expect.png", + "registry/bundles/openemr/new-referral/templates/step_006.png", + "registry/bundles/openemr/new-referral/templates/step_006_expect.png", + "registry/bundles/openemr/new-referral/templates/step_009.png", + "registry/bundles/openemr/new-referral/templates/step_009_expect.png", + "registry/bundles/openemr/new-referral/templates/step_012.png", + "registry/bundles/openemr/new-referral/templates/step_012_expect.png", + "registry/bundles/openemr/new-referral/templates/step_015.png", + "registry/bundles/openemr/new-referral/templates/step_015_expect.png", + "registry/bundles/openemr/new-referral/templates/step_017.png", + "registry/bundles/openemr/new-referral/templates/step_017_expect.png", + "registry/bundles/openemr/new-referral/templates/step_020.png", + "registry/bundles/openemr/new-referral/templates/step_020_expect.png", + "registry/bundles/openemr/new-referral/templates/step_023.png", + "registry/bundles/openemr/new-referral/templates/step_023_expect.png", + "registry/bundles/openemr/new-referral/templates/step_026.png", + "registry/bundles/openemr/new-referral/templates/step_029.png", + "registry/bundles/openemr/new-referral/templates/step_029_expect.png", + "registry/bundles/openemr/new-referral/templates/step_032.png", + "registry/bundles/openemr/new-referral/templates/step_032_expect.png", + "registry/bundles/openemr/new-referral/templates/step_035.png", + "registry/bundles/openemr/new-referral/templates/step_039.png", + "registry/bundles/openemr/new-referral/templates/step_039_expect.png", + "registry/bundles/openemr/new-referral/templates/step_040.png", + "registry/bundles/openemr/new-referral/templates/step_040_expect.png", + "registry/bundles/openemr/new-referral/workflow.json", + "registry/index.json", + "registry/sources.json", + "schemas/process-contract-graph-v0.json", + "schemas/process-contract-v1.json", + "schemas/program-graph-v1.json", + "schemas/program-graph-v2.json", + "schemas/public-demo-evidence-v1.json", + "schemas/push-result-v1.json", + "schemas/records-interchange-v0.json", + "schemas/runtime-validation-attestation-v1.json", + "schemas/runtime-validation-attestation-v2.json", + "schemas/runtime-validation-attestation-v3.json", + "schemas/sanitization-ingest-v1.json", + "schemas/sanitized-artifact-approval-v1.json", + "schemas/sanitized-artifact-manifest-v1.json", + "source-policy.public.json", + "tests/fixtures/flow_v1_34_0_terminal_verified.json", + "tests/fixtures/interchange/cases.json", + "tests/fixtures/interchange/invalid/ambiguous_identity_to_executor.json", + "tests/fixtures/interchange/invalid/checksum_tampered.json", + "tests/fixtures/interchange/invalid/choice_differs_from_output_field.json", + "tests/fixtures/interchange/invalid/choice_not_option.json", + "tests/fixtures/interchange/invalid/choice_without_decider.json", + "tests/fixtures/interchange/invalid/committed_to_executor.json", + "tests/fixtures/interchange/invalid/committed_unresolved_identity.json", + "tests/fixtures/interchange/invalid/committed_without_evidence.json", + "tests/fixtures/interchange/invalid/confirmed_without_person.json", + "tests/fixtures/interchange/invalid/dangling_artifact.json", + "tests/fixtures/interchange/invalid/domain_field_in_core.json", + "tests/fixtures/interchange/invalid/duplicate_field.json", + "tests/fixtures/interchange/invalid/existing_without_record.json", + "tests/fixtures/interchange/invalid/export_without_source_kind.json", + "tests/fixtures/interchange/invalid/halted_without_reason.json", + "tests/fixtures/interchange/invalid/model_decided.json", + "tests/fixtures/interchange/invalid/no_action_below_commit_level.json", + "tests/fixtures/interchange/invalid/no_action_decided_by_model.json", + "tests/fixtures/interchange/invalid/no_action_to_executor.json", + "tests/fixtures/interchange/invalid/no_action_without_before_read.json", + "tests/fixtures/interchange/invalid/no_action_without_evidence.json", + "tests/fixtures/interchange/invalid/no_action_without_record.json", + "tests/fixtures/interchange/invalid/no_action_write_detected.json", + "tests/fixtures/interchange/invalid/payload_backslash_path.json", + "tests/fixtures/interchange/invalid/payload_drive_letter_path.json", + "tests/fixtures/interchange/invalid/payload_escapes_dir.json", + "tests/fixtures/interchange/invalid/payload_hash_mismatch.json", + "tests/fixtures/interchange/invalid/payload_nul_path.json", + "tests/fixtures/interchange/invalid/readback_without_screen_read.json", + "tests/fixtures/interchange/invalid/record_ref_mismatch.json", + "tests/fixtures/interchange/invalid/reopened_read_differs.json", + "tests/fixtures/interchange/invalid/reopened_read_not_on_screen.json", + "tests/fixtures/interchange/invalid/reopened_without_acting_read.json", + "tests/fixtures/interchange/invalid/reopened_without_reopened_read.json", + "tests/fixtures/interchange/invalid/result_without_in_reply_to.json", + "tests/fixtures/interchange/invalid/review_without_reason.json", + "tests/fixtures/interchange/invalid/seal_covers_other.json", + "tests/fixtures/interchange/invalid/self_approval.json", + "tests/fixtures/interchange/invalid/self_confirmation.json", + "tests/fixtures/interchange/invalid/system_of_record_from_live_session_export.json", + "tests/fixtures/interchange/invalid/system_of_record_without_independent_read.json", + "tests/fixtures/interchange/invalid/unauthorized_role.json", + "tests/fixtures/interchange/invalid/unknown_identity_field.json", + "tests/fixtures/interchange/invalid/unknown_output_field.json", + "tests/fixtures/interchange/invalid/unnamespaced_extension.json", + "tests/fixtures/interchange/invalid/wrong_value_type.json", + "tests/fixtures/interchange/valid/invoice_posting.json", + "tests/fixtures/interchange/valid/invoice_posting_result.json", + "tests/fixtures/interchange/valid/referral_halted.json", + "tests/fixtures/interchange/valid/referral_intake.json", + "tests/fixtures/interchange/valid/referral_no_action.json", + "tests/fixtures/interchange/valid/referral_result.json", + "tests/fixtures/jit/anthropic_add_note.json", + "tests/fixtures/jit/openai_add_note.json", + "tests/fixtures/jit/playwright_mcp_add_note.json", + "tests/fixtures/jit/playwright_mcp_snapshot_refs.json", + "tests/fixtures/match_ridge/openemr_accordion_rdp.png", + "tests/fixtures/remote-safe-synthetic-flow-release-verification.json", + "tests/fixtures/runtime-validation-canonical-vector.json", + "tests/fixtures/shadow/invoice_exact.episodes.json", + "tests/fixtures/shadow/invoice_variant.episodes.json", + "tests/fixtures/shadow/report_mail.episodes.json", + "tests/fixtures/terminal_verification_v2_delivery_consumer_vector.json", + "tests/fixtures/terminal_verification_v2_delivery_vector.json", + "tests/fixtures/terminal_verification_v2_terminal_consumer_vectors.json", + "tests/fixtures/terminal_verification_v2_terminal_vectors.json", + "tests/fixtures/theme-region-stable-overhalt-v1.16.1.json", + "tests/fixtures/v4-qualification/decision-receipt.json", + "tests/fixtures/v4-qualification/qualification-admission.json", + "tests/fixtures/v4-qualification/revocation-state.json", + "tests/fixtures/v4-qualification/signer-registry.json", + "tests/golden/tutorial_run.json" ] } diff --git a/packages/flow/scripts/check_release_consistency.py b/packages/flow/scripts/check_release_consistency.py index 31320f1cf0..5ed1f8e28a 100644 --- a/packages/flow/scripts/check_release_consistency.py +++ b/packages/flow/scripts/check_release_consistency.py @@ -282,10 +282,21 @@ def load_source_policy(path: Path = SOURCE_POLICY_PATH) -> SourcePolicy: # Positive inventory for files that can carry data, evidence, static payloads, # models, or deployment-shaped configuration. Ordinary Python/Markdown/TeX # source remains reviewable source code and is not exhaustively enumerated. -# Every file with one of these suffixes must instead appear, with its exact -# SHA-256, in PUBLIC_ARTIFACT_INVENTORY_PATH. Updating that reviewed manifest is -# an explicit command; validation never rewrites it. +# Every file with one of these suffixes must instead be listed by path in +# PUBLIC_ARTIFACT_INVENTORY_PATH. Updating that reviewed list is an explicit +# command; validation never rewrites it. +# +# The committed list carries paths only (schema 2). It used to pin each file's +# SHA-256 as well, so every pull request that touched claims.yaml or a fixture +# had to rewrite the same hash rows, and parallel pull requests conflicted on +# them. The bytes a pull request changes are reviewed in its own diff; the +# hashes now bind the shipped archives instead: the release workflow runs +# --stamp-release-inventory on the exact commit it builds, which rewrites the +# file as schema 1 (path + SHA-256), and --validate-dist-dir then requires every +# artifact-like wheel and sdist member to be listed with matching bytes. PUBLIC_ARTIFACT_INVENTORY_PATH = "public-artifacts.json" +PUBLIC_ARTIFACT_REVIEWED_SCHEMA = 2 +PUBLIC_ARTIFACT_RELEASE_SCHEMA = 1 WHEEL_ARTIFACT_INVENTORY_PATH = f"{DIST_NAME}/{PUBLIC_ARTIFACT_INVENTORY_PATH}" PUBLIC_ARTIFACT_SUFFIXES = frozenset( { @@ -667,17 +678,14 @@ def _git_ignored_paths(root: Path) -> set[str]: def build_public_artifact_inventory(root: Path = ROOT) -> dict[str, object]: - """Build the deterministic inventory document for explicit human review.""" + """Build the deterministic reviewed path list for explicit human review.""" files = _walk_public_source_files(root) - artifacts = [ - {"path": path, "sha256": _sha256_file(files[path])} - for path in sorted(files) - if _artifact_inventory_candidate(path) - ] return { - "schema_version": 1, + "schema_version": PUBLIC_ARTIFACT_REVIEWED_SCHEMA, "policy": _public_artifact_policy(), - "artifacts": artifacts, + "artifacts": [ + path for path in sorted(files) if _artifact_inventory_candidate(path) + ], } @@ -691,18 +699,52 @@ def write_public_artifact_inventory(root: Path = ROOT) -> Path: return path +def build_release_artifact_inventory(root: Path = ROOT) -> dict[str, object]: + """Hash exactly the reviewed paths, after the tree validates against them. + + The stamped document lists the committed paths and nothing else, so a file + that appears only at build time is still unregistered in the archive check. + """ + files = _walk_public_source_files(root) + inventory = _validate_public_artifact_inventory(files, root=root) + return { + "schema_version": PUBLIC_ARTIFACT_RELEASE_SCHEMA, + "policy": _public_artifact_policy(), + "artifacts": [ + {"path": path, "sha256": _sha256_file(files[path])} + for path in sorted(inventory) + ], + } + + +def stamp_release_artifact_inventory(root: Path = ROOT) -> Path: + """Rewrite the reviewed path list as the hashed inventory a release ships. + + Run only by the release workflow, on the commit it is about to build. + """ + document = build_release_artifact_inventory(root) + path = root / PUBLIC_ARTIFACT_INVENTORY_PATH + path.write_text(json.dumps(document, indent=2) + "\n", encoding="utf-8") + return path + + def _public_artifact_policy() -> dict[str, object]: return { "artifact_suffixes": sorted(PUBLIC_ARTIFACT_SUFFIXES), "forbidden_categories": sorted(PUBLIC_SOURCE_FORBIDDEN_CATEGORIES), "note": ( "Reviewed positive inventory of public data, evidence, static, " - "model, and configuration assets. Validation never regenerates it." + "model, and configuration assets. Validation never regenerates it. " + "The release workflow stamps each file's SHA-256 into the copy it " + "ships." ), } -def _parse_public_artifact_inventory(payload: bytes, *, source: str) -> dict[str, str]: +def _parse_public_artifact_inventory( + payload: bytes, *, source: str, require_hashes: bool = False +) -> dict[str, str | None]: + """Parse either form; reviewed (schema 2) paths map to ``None``.""" try: document = json.loads(payload.decode("utf-8")) except (UnicodeDecodeError, json.JSONDecodeError) as error: @@ -715,8 +757,14 @@ def _parse_public_artifact_inventory(payload: bytes, *, source: str) -> dict[str "artifacts", }: raise ValueError("public artifact inventory has an unexpected top-level schema") - if document["schema_version"] != 1: - raise ValueError("public artifact inventory schema_version must be 1") + schema = document["schema_version"] + if schema not in (PUBLIC_ARTIFACT_RELEASE_SCHEMA, PUBLIC_ARTIFACT_REVIEWED_SCHEMA): + raise ValueError("public artifact inventory schema_version must be 1 or 2") + if require_hashes and schema != PUBLIC_ARTIFACT_RELEASE_SCHEMA: + raise ValueError( + f"{source} embeds the unstamped path list; release archives must " + "embed the inventory written by --stamp-release-inventory" + ) if document["policy"] != _public_artifact_policy(): raise ValueError( "public artifact inventory policy does not match the validator's " @@ -725,17 +773,25 @@ def _parse_public_artifact_inventory(payload: bytes, *, source: str) -> dict[str rows = document["artifacts"] if not isinstance(rows, list): raise ValueError("public artifact inventory artifacts must be a list") - inventory: dict[str, str] = {} + inventory: dict[str, str | None] = {} previous = "" for row in rows: - if not isinstance(row, dict) or set(row) != {"path", "sha256"}: - raise ValueError("public artifact inventory row has an unexpected schema") - if not isinstance(row["path"], str) or not isinstance(row["sha256"], str): - raise ValueError( - "public artifact inventory path and SHA-256 must be strings" - ) - relative = _canonical_source_path(row["path"], source="inventory") - digest = row["sha256"] + digest: str | None + if schema == PUBLIC_ARTIFACT_REVIEWED_SCHEMA: + if not isinstance(row, str): + raise ValueError("public artifact inventory paths must be strings") + raw_path, digest = row, None + else: + if not isinstance(row, dict) or set(row) != {"path", "sha256"}: + raise ValueError( + "public artifact inventory row has an unexpected schema" + ) + if not isinstance(row["path"], str) or not isinstance(row["sha256"], str): + raise ValueError( + "public artifact inventory path and SHA-256 must be strings" + ) + raw_path, digest = row["path"], row["sha256"] + relative = _canonical_source_path(raw_path, source="inventory") if relative <= previous: raise ValueError( "public artifact inventory paths must be unique and sorted" @@ -744,7 +800,7 @@ def _parse_public_artifact_inventory(payload: bytes, *, source: str) -> dict[str raise ValueError( f"public artifact inventory contains a non-artifact path: {relative}" ) - if not re.fullmatch(r"[0-9a-f]{64}", digest): + if digest is not None and not re.fullmatch(r"[0-9a-f]{64}", digest): raise ValueError( f"public artifact inventory has an invalid SHA-256 for {relative}" ) @@ -753,7 +809,7 @@ def _parse_public_artifact_inventory(payload: bytes, *, source: str) -> dict[str return inventory -def _load_public_artifact_inventory(root: Path = ROOT) -> dict[str, str]: +def _load_public_artifact_inventory(root: Path = ROOT) -> dict[str, str | None]: path = root / PUBLIC_ARTIFACT_INVENTORY_PATH try: payload = path.read_bytes() @@ -766,7 +822,7 @@ def _load_public_artifact_inventory(root: Path = ROOT) -> dict[str, str]: def _validate_public_artifact_inventory( files: dict[str, Path], *, root: Path = ROOT -) -> dict[str, str]: +) -> dict[str, str | None]: inventory = _load_public_artifact_inventory(root) observed = {path for path in files if _artifact_inventory_candidate(path)} expected = set(inventory) @@ -779,10 +835,11 @@ def _validate_public_artifact_inventory( f"unregistered={sorted(unregistered)}, " f"missing={sorted(missing)}" ) + # A stamped (schema 1) tree still pins bytes; the reviewed list does not. changed = [ path for path in sorted(expected) - if _sha256_file(files[path]) != inventory[path] + if inventory[path] is not None and _sha256_file(files[path]) != inventory[path] ] if changed: raise ValueError( @@ -1036,6 +1093,7 @@ def _validate_archive_artifact_inventory( inventory = _parse_public_artifact_inventory( manifest_payload, source=f"{source}:{manifest_member}", + require_hashes=True, ) unregistered: list[str] = [] changed: list[str] = [] @@ -1612,6 +1670,14 @@ def main() -> int: "inspect and commit the resulting diff before release" ), ) + parser.add_argument( + "--stamp-release-inventory", + action="store_true", + help=( + "release workflow only: validate the tree against the reviewed path " + "list, then rewrite it with each file's SHA-256 for the build" + ), + ) parser.add_argument( "--validate-dist-dir", type=Path, @@ -1628,6 +1694,7 @@ def main() -> int: if ( args.sync or args.require_dist + or args.stamp_release_inventory or args.validate_dist_dir or args.license_file ): @@ -1639,6 +1706,25 @@ def main() -> int: print(f"Wrote reviewed public artifact inventory candidate: {path}") return 0 + if args.stamp_release_inventory: + if ( + args.sync + or args.require_dist + or args.validate_dist_dir + or args.license_file + ): + parser.error( + "--stamp-release-inventory cannot be combined with other modes" + ) + try: + validate_public_source_policy() + validate_public_source_tree() + path = stamp_release_artifact_inventory() + except ValueError as error: + parser.error(str(error)) + print(f"Stamped the release artifact inventory: {path}") + return 0 + if args.validate_dist_dir is not None: if args.sync or args.require_dist: parser.error( diff --git a/packages/flow/tests/repo_tree_guard.py b/packages/flow/tests/repo_tree_guard.py index 1cc90a1c15..5b855bf55e 100644 --- a/packages/flow/tests/repo_tree_guard.py +++ b/packages/flow/tests/repo_tree_guard.py @@ -5,9 +5,8 @@ * ``git status`` is dirty after a test run, so a developer can commit a regenerated golden by accident; -* ``scripts/check_release_consistency.py`` pins a reviewed SHA-256 inventory - of the public files, so a mutated tracked file silently changes what that - release gate measures; +* the release workflow pins the SHA-256 of every public artifact file, so a + mutated tracked file silently changes what that release gate measures; * CI artifact and consistency jobs see a diff nobody wrote. The guard snapshots the tracked-file status before the first test and again diff --git a/packages/flow/tests/test_release_contract.py b/packages/flow/tests/test_release_contract.py index b414a2885d..932a6796bf 100644 --- a/packages/flow/tests/test_release_contract.py +++ b/packages/flow/tests/test_release_contract.py @@ -7,6 +7,7 @@ import re import tarfile import zipfile +from functools import cache from pathlib import Path import pytest @@ -36,7 +37,9 @@ REPOSITORY_ONLY_EVALUATION_PATH_TOKENS, REQUIRED_SDIST_PATHS, WHEEL_ARTIFACT_INVENTORY_PATH, + build_release_artifact_inventory, release_versions, + stamp_release_artifact_inventory, sync_lock_version, validate_distribution_directory, validate_public_source_policy, @@ -48,6 +51,16 @@ ROOT = Path(__file__).resolve().parents[1] MIT_LICENSE = (ROOT / "LICENSE").read_bytes() + + +@cache +def _stamped_manifest_bytes() -> bytes: + """The inventory a release of this tree would embed (schema 1, hashed).""" + return ( + json.dumps(build_release_artifact_inventory(ROOT), indent=2) + "\n" + ).encode() + + SOURCE_BOUNDARY_EXCLUDES = { "/benchmark/reliability", "/docs/validation/IDENTITY_ROC.md", @@ -325,6 +338,10 @@ def test_public_source_tree_rejects_symlinks_and_changed_inventory( write_public_artifact_inventory(tmp_path) validate_public_source_tree(tmp_path) + # The reviewed list pins paths, so an edited artifact needs no inventory + # change; once the release workflow stamps hashes, the bytes are pinned. + stamp_release_artifact_inventory(tmp_path) + validate_public_source_tree(tmp_path) artifact.write_text('{"changed": true}\n') with pytest.raises(ValueError, match="hash mismatch"): validate_public_source_tree(tmp_path) @@ -624,7 +641,7 @@ def _write_sdist( elif relative == "PKG-INFO": payload = metadata_bytes or _metadata_bytes() elif relative == PUBLIC_ARTIFACT_INVENTORY_PATH: - payload = (ROOT / PUBLIC_ARTIFACT_INVENTORY_PATH).read_bytes() + payload = _stamped_manifest_bytes() else: payload = b"fixture" info = tarfile.TarInfo(f"{archive_root}/{relative}") @@ -653,7 +670,7 @@ def _write_wheel( elif relative.endswith(".dist-info/METADATA"): payload = metadata_bytes or _metadata_bytes() elif relative == WHEEL_ARTIFACT_INVENTORY_PATH: - payload = (ROOT / PUBLIC_ARTIFACT_INVENTORY_PATH).read_bytes() + payload = _stamped_manifest_bytes() else: payload = b"fixture" archive.writestr(relative, payload) @@ -937,7 +954,7 @@ def test_archive_uses_its_embedded_historical_inventory_not_current_root( ) -> None: known = "benchmark/vision_hardening/corpus.json" historical_payload = b'{"historical": true}\n' - manifest = json.loads((ROOT / PUBLIC_ARTIFACT_INVENTORY_PATH).read_text()) + manifest = json.loads(_stamped_manifest_bytes()) for row in manifest["artifacts"]: if row["path"] == known: row["sha256"] = hashlib.sha256(historical_payload).hexdigest() @@ -1154,7 +1171,7 @@ def test_distribution_directory_requires_matching_embedded_inventories( ) -> None: dist = tmp_path / "dist" dist.mkdir() - manifest = json.loads((ROOT / PUBLIC_ARTIFACT_INVENTORY_PATH).read_text()) + manifest = json.loads(_stamped_manifest_bytes()) manifest["artifacts"][0]["sha256"] = "0" * 64 different_valid_manifest = (json.dumps(manifest, indent=2) + "\n").encode() @@ -1246,7 +1263,70 @@ def test_inventory_skips_git_ignored_files_under_a_package_subdirectory( subprocess.run(["git", "init", "-q", str(repo)], check=True) subprocess.run(["git", "-C", str(repo), "add", "."], check=True) - paths = [a["path"] for a in build_public_artifact_inventory(root)["artifacts"]] + paths = build_public_artifact_inventory(root)["artifacts"] assert "data.json" in paths assert "out/secrets.json" not in paths + + +def test_committed_inventory_is_the_reviewed_path_list() -> None: + """Pull requests edit paths only, so parallel PRs stop colliding on hashes.""" + document = json.loads((ROOT / PUBLIC_ARTIFACT_INVENTORY_PATH).read_text()) + assert document["schema_version"] == 2 + assert all(isinstance(row, str) for row in document["artifacts"]) + + +def test_release_stamp_hashes_only_reviewed_paths(tmp_path: Path) -> None: + artifact = tmp_path / "schemas/workflow.json" + artifact.parent.mkdir(parents=True) + artifact.write_text("{}\n") + write_public_artifact_inventory(tmp_path) + + stray = tmp_path / "data/production_samples.json" + stray.parent.mkdir() + stray.write_text("{}\n") + with pytest.raises(ValueError, match="unregistered"): + stamp_release_artifact_inventory(tmp_path) + + stray.unlink() + stamp_release_artifact_inventory(tmp_path) + stamped = json.loads((tmp_path / PUBLIC_ARTIFACT_INVENTORY_PATH).read_text()) + assert stamped["schema_version"] == 1 + assert stamped["artifacts"] == [ + { + "path": "schemas/workflow.json", + "sha256": hashlib.sha256(b"{}\n").hexdigest(), + } + ] + + +def test_archives_refuse_the_unstamped_path_list(tmp_path: Path) -> None: + reviewed = (ROOT / PUBLIC_ARTIFACT_INVENTORY_PATH).read_bytes() + wheel = tmp_path / "unstamped.whl" + _write_wheel( + wheel, + { + "openadapt_flow-1.0.dist-info/licenses/LICENSE", + "openadapt_flow-1.0.dist-info/METADATA", + }, + payloads={WHEEL_ARTIFACT_INVENTORY_PATH: reviewed}, + ) + with pytest.raises(ValueError, match="stamp-release-inventory"): + validate_wheel_license_boundary(wheel) + + sdist = tmp_path / "unstamped.tar.gz" + _write_sdist( + sdist, + {*REQUIRED_SDIST_PATHS, "PKG-INFO"}, + payloads={PUBLIC_ARTIFACT_INVENTORY_PATH: reviewed}, + ) + with pytest.raises(ValueError, match="stamp-release-inventory"): + validate_sdist_license_boundary(sdist) + + +def test_release_workflow_stamps_and_validates_flow_archives() -> None: + workflow = (ROOT.parents[1] / ".github/workflows/release-package.yml").read_text() + stamp = workflow.index("check_release_consistency.py --stamp-release-inventory") + build = workflow.index('python -m build "packages/$PACKAGE"') + validate = workflow.index("check_release_consistency.py --validate-dist-dir") + assert stamp < build < validate From 5f2e287fa1b651b7f8f83bd4968e468dbd7e1aeb Mon Sep 17 00:00:00 2001 From: abrichr Date: Mon, 19 Oct 2026 11:22:27 -0400 Subject: [PATCH 2/2] ci(flow): one file per claim; deterministic verification report claims.yaml held every claim in one list, and docs/VERIFICATION.md and docs/verification.json stamped the HEAD commit date on line one and listed all claim ids on one summary line with counts. Any two pull requests that added a claim conflicted on all three files. - claims/.yaml: one claim per file; the file must be named after its id. The old header contract moves to claims/README.md. Parsed content of all 25 claims is unchanged. - The report carries a fixed stamp, groups claims by tier and sorts them by id, and lists one id per line with no counts. Every claim's entry is identical to main's. - tests/test_validate_claims.py now fails when the committed report is stale and checks that the render does not depend on registry order. Co-Authored-By: Claude Opus 5.5 --- packages/flow/claims.yaml | 1177 -------------- packages/flow/claims/README.md | 59 + .../flow/claims/citrix-pixel-validating.yaml | 81 + .../flow/claims/compose-recorded-bundles.yaml | 36 + .../desktop-readback-separate-session.yaml | 37 + .../claims/desktop-recording-validating.yaml | 41 + .../deterministic-zero-model-replay.yaml | 25 + .../effect-verification-silent-writes.yaml | 29 + packages/flow/claims/effect-verifier-kit.yaml | 62 + packages/flow/claims/halt-teach-promote.yaml | 27 + .../identifier-crop-compile-emission.yaml | 37 + .../flow/claims/identity-gate-halt-armed.yaml | 34 + .../flow/claims/linux-native-validating.yaml | 40 + .../flow/claims/lookup-teaches-the-check.yaml | 25 + .../flow/claims/macos-native-validating.yaml | 28 + .../mockmed-benchmark-ci-reproducible.yaml | 28 + .../flow/claims/openemr-field-benchmark.yaml | 39 + ...ualified-remote-decision-v2-supported.yaml | 32 + packages/flow/claims/rdp-validating.yaml | 42 + .../claims/record-check-from-app-reads.yaml | 64 + .../reviewed-judgment-cases-supported.yaml | 36 + ...ubstrate-runtime-validation-supported.yaml | 36 + .../typed-business-decisions-supported.yaml | 33 + .../claims/ui-readback-separate-session.yaml | 44 + packages/flow/claims/web-supported.yaml | 167 ++ .../claims/win32-window-replay-roadmap.yaml | 29 + .../claims/windows-desktop-validating.yaml | 36 + .../flow/docs/CLAIMS_AND_QUALIFICATION.md | 2 +- packages/flow/docs/PRODUCTION.md | 2 +- packages/flow/docs/PRODUCT_STATUS.md | 4 +- packages/flow/docs/VERIFICATION.md | 444 ++--- packages/flow/docs/desktop/CITRIX_PIXEL.md | 2 +- packages/flow/docs/verification.json | 1438 ++++++++--------- .../backends/win32_window_client.py | 2 +- packages/flow/public-artifacts.json | 26 +- packages/flow/scripts/validate_claims.py | 112 +- packages/flow/tests/test_validate_claims.py | 65 +- .../flow/tests/test_win32_window_client.py | 4 +- 38 files changed, 2269 insertions(+), 2156 deletions(-) delete mode 100644 packages/flow/claims.yaml create mode 100644 packages/flow/claims/README.md create mode 100644 packages/flow/claims/citrix-pixel-validating.yaml create mode 100644 packages/flow/claims/compose-recorded-bundles.yaml create mode 100644 packages/flow/claims/desktop-readback-separate-session.yaml create mode 100644 packages/flow/claims/desktop-recording-validating.yaml create mode 100644 packages/flow/claims/deterministic-zero-model-replay.yaml create mode 100644 packages/flow/claims/effect-verification-silent-writes.yaml create mode 100644 packages/flow/claims/effect-verifier-kit.yaml create mode 100644 packages/flow/claims/halt-teach-promote.yaml create mode 100644 packages/flow/claims/identifier-crop-compile-emission.yaml create mode 100644 packages/flow/claims/identity-gate-halt-armed.yaml create mode 100644 packages/flow/claims/linux-native-validating.yaml create mode 100644 packages/flow/claims/lookup-teaches-the-check.yaml create mode 100644 packages/flow/claims/macos-native-validating.yaml create mode 100644 packages/flow/claims/mockmed-benchmark-ci-reproducible.yaml create mode 100644 packages/flow/claims/openemr-field-benchmark.yaml create mode 100644 packages/flow/claims/qualified-remote-decision-v2-supported.yaml create mode 100644 packages/flow/claims/rdp-validating.yaml create mode 100644 packages/flow/claims/record-check-from-app-reads.yaml create mode 100644 packages/flow/claims/reviewed-judgment-cases-supported.yaml create mode 100644 packages/flow/claims/substrate-runtime-validation-supported.yaml create mode 100644 packages/flow/claims/typed-business-decisions-supported.yaml create mode 100644 packages/flow/claims/ui-readback-separate-session.yaml create mode 100644 packages/flow/claims/web-supported.yaml create mode 100644 packages/flow/claims/win32-window-replay-roadmap.yaml create mode 100644 packages/flow/claims/windows-desktop-validating.yaml diff --git a/packages/flow/claims.yaml b/packages/flow/claims.yaml deleted file mode 100644 index d932ea15bd..0000000000 --- a/packages/flow/claims.yaml +++ /dev/null @@ -1,1177 +0,0 @@ -# claims.yaml: the machine-readable capability-claim registry. -# -# WHY THIS FILE EXISTS -# -------------------- -# Every public capability claim about openadapt-flow ("web is supported today", -# "Windows has scoped acceptance") must be a FUNCTION of automated -# evidence, not a hand-written adjective that quietly rots. This registry maps -# each claim -> an evidence `tier` -> the specific backing test(s)/benchmark(s) -# that prove it. `scripts/validate_claims.py` enforces the tier<->evidence -# contract in CI and regenerates `docs/VERIFICATION.md` from it. -# -# THE CONTRACT (enforced by scripts/validate_claims.py) -# ----------------------------------------------------- -# Evidence strength is derived from the repo, not asserted here: -# * a test file with NO module-level env skipif, that exists -> "supported" -# candidate evidence; its required `test` or `e2e-browser` job must bind the -# file to at least one passing case in that job's real JUnit result -# * a test file gated by a module-level `pytestmark` env skipif -> "validating" -# (opt-in / infra-gated: grounded, but never runs on default CI) -# * a doc / benchmark artifact (.md or a benchmark dir) -> "roadmap" -# (design/《field》 evidence; cannot by itself prove a running capability) -# A claim FAILS the gate when its `tier` OUTRANKS its strongest evidence -# (rank order research < roadmap < validating < supported). Additionally a -# claim carrying `reproducibility: field` may NOT be tier `supported` (a -# result that is not CI-reproducible is never presented as "supported"). -# -# TIERS -# supported — bound to a real passing result in required default CI. -# validating — grounded in a REAL opt-in/infra-gated proof or a field test; -# being validated (incl. with design partners). NOT "supported". -# roadmap — designed/specified, not yet proven by a running test. -# research — open question / study. -# -# EVIDENCE ENTRY FIELDS -# path — repo-relative path to a test file, benchmark dir, or doc. MUST exist. -# proves — what THIS artifact actually demonstrates (honest scope). -# kind — optional: test | benchmark | doc. Inferred when omitted -# (tests/**/*.py -> test, *.md -> doc, else -> benchmark). -# node — optional: a `def ` that must exist in `path` (rot guard). -# -# The gate detects opt-in gating from each test's source (a module-level -# `pytestmark` skipif on an env var) — the registry cannot lie about it. - -version: 1 - -claims: - # ------------------------------------------------------------------ web - - id: web-supported - claim: >- - The Playwright browser path records a GUI workflow and replays it - deterministically and locally. Required CI exercises the recorder, - compiler, and replay contract. - surfaces: [README.md, website, docs] - tier: supported - evidence: - - path: tests/e2e/test_record_compile_replay.py - proves: >- - Records the MockMed browser demo once, compiles it, and replays it - under baseline + theme/move/rename drift and parameter substitution - through the headless-browser Backend. - - path: tests/test_mockmed.py - proves: >- - The reference browser demo app and its drift screens render - deterministically (no CSS transitions), so replay is repeatable. - - path: tests/test_replayer.py - proves: >- - The deterministic replayer resolves steps, substitutes parameters, - enforces postconditions and the risk gate — no model in the loop. - - path: tests/test_browser_attach.py - node: test_live_cdp_attach_records_compiles_and_leaves_browser_running_three_trials - proves: >- - Three real Chromium CDP-attach trials record and compile the same - synthetic workflow, exclude password values before persistence, - preserve CSS-pixel frame/coordinate alignment, and detach without - closing the external browser. The same live campaign covers same-task - replacement, declared open and closed shadow hosts, contenteditable - click metadata, and same-document URL/title reflection through - history.replaceState. A live case records and - compiles actions across viewport and monitor-scale changes. It binds - each event to its exact frame dimensions. A separate live case - refuses an action that overlaps the transition. Unit cases refuse - remote endpoints, cross-origin selectors and navigation, iframe - events, invalid viewport evidence, and ambiguous same-origin tabs. - - path: tests/test_browser_attach.py - node: test_launched_recording_withholds_a_later_document_url_after_a_get_submit - proves: >- - A live Chromium recording submits a same-origin GET form. The - document that submit reaches is a fresh closure that holds no value - to match against, so Flow withholds its URL and its title and says - so, and the recorded surface is stamped before publish. - - path: tests/test_browser_attach.py - node: test_launched_recording_withholds_a_redirect_that_puts_the_value_in_a_path - proves: >- - A server that answers a GET submit with a 302 to `/results/` - puts a declared secret in a path segment, where no parameter name - identifies it. Flow withholds the whole URL for every document after - the one that first held the value, so the literal never reaches - events.jsonl. - - path: tests/test_browser_attach.py - node: test_page_closure_keeps_url_and_identity_evidence_for_a_lowercase_secret - proves: >- - A lowercase secret typed one character at a time into a page whose - URL, title, and button ID share those characters leaves the URL, the - title, the DOM selector, and the accessible name exact. - - path: tests/test_browser_attach.py - node: test_page_closure_keeps_all_evidence_for_a_password_starting_with_a_word - proves: >- - A password that begins with a common English word leaves that word - exact in the page URL, the page title, the clicked row's identity - characters, the accessible name, and an unrelated button ID. Matching - uses only the value the field holds at that moment, so an - intermediate keystroke prefix never becomes a matching value. - - path: tests/test_browser_attach.py - node: test_page_closure_withholds_identity_that_holds_a_declared_value - proves: >- - Identity evidence that holds a declared value is WITHHELD with a - stated reason, never rewritten. Replay compares identity evidence - against the live page, so a rewritten copy would compare against - characters the page never showed, invisibly. No placeholder string - appears anywhere in the recorded evidence. - - path: tests/test_browser_attach.py - node: test_page_closure_withholds_a_stale_reflection_from_a_swapping_input - proves: >- - A page that replaces its input element on every keystroke and writes - the value into its URL and title can end up showing a version the - field no longer holds. Flow withholds that reflected text whole -- - an origin-only URL and an empty title -- instead of matching it - against the current value, and keeps the clicked element's identity - evidence exact. - - path: tests/test_browser_attach.py - node: test_page_closure_still_reports_a_same_document_route_after_the_fix - proves: >- - A single-page application route change through history.pushState does - not build a new document, so the closure that held the declared value - is the one being sampled and its URL is still reported exactly. The - cross-document rule that withholds a later document's URL therefore - does not cost this evidence. - - path: tests/test_browser_attach.py - node: test_page_closure_withholds_a_title_a_consumed_field_produced - proves: >- - A scanner input that writes the badge into the page URL and title and - then clears its own field holds nothing at any moment Flow samples. - Flow arms the document's secret boundary from the input event itself, - so both channels are checked and both are withheld. - - path: tests/test_browser_attach.py - node: test_page_closure_keeps_a_consumed_value_across_a_second_entry - proves: >- - A second scan into the same cleared field does not displace the first - badge while the first badge is still shown in the URL. A value the - next one does not continue was taken by the page, not edited away by - the operator, so it is promoted into the withhold-only set. - - path: tests/test_browser_attach.py - node: test_page_closure_keeps_a_consumed_value_while_another_field_is_live - proves: >- - A second declared field holding a value does not re-expose the first - field's consumed value. The last-value test is per element, so the - same URL is withheld before and after the second field is filled. - - path: tests/test_browser_attach.py - node: test_page_closure_withholds_a_selector_built_from_an_inbound_value - proves: >- - A DOM selector is identity evidence and uses the same value set as - the accessible name and the clicked-row identity. An element id built - from a value carried in an inbound declared parameter is withheld with - a reason, not emitted verbatim. - - path: tests/test_browser_attach.py - node: test_page_closure_drops_only_the_unproven_parameter_value - proves: >- - A query parameter whose value Flow cannot prove predates the moment - the document first held a declared value loses only ITS value. Every - parameter name survives, the path stays exact, and the drop is - recorded with its reason. - - path: tests/test_browser_attach.py - node: test_page_closure_withholds_a_url_that_holds_the_value_in_its_path - proves: >- - A value that no parameter name identifies -- here written into a path - segment -- is caught by detection rather than structure: Flow - withholds the whole URL, marks it, and warns the operator that the - application placed a declared secret into its own URL. - - path: tests/test_browser_attach.py - node: test_page_closure_withholds_identity_after_the_field_is_removed - proves: >- - A single-page wizard that removes its declared field and renders the - value into a summary row cannot leak it into the clicked row's - identity: the value the field held at a commit point is retained for - the single purpose of WITHHOLDING identity text, never to rewrite it - and never for the URL or the title. - - path: tests/test_browser_attach.py - node: test_page_closure_marks_a_withheld_secret_field_name - proves: >- - Flow never reads the visible text of a bound secret field, because - that text is the value. The resulting missing accessible name is - reported as WITHHELD with a reason and counted, never left as a - silent null, while a control field beside it returns its name. - - path: tests/test_browser_attach.py - node: test_page_closure_emits_no_reflected_text_from_the_capture_phase - proves: >- - No browser event carries a URL or a title. The in-page listeners run - in the capture phase, before the page's own handlers, so anything - they read describes the state before the action. Flow samples - reflected evidence from Python at the settled boundary instead. - caveats: - - >- - `supported` names the registry's required-CI evidence tier. It is not a - product state or a general application claim. Production requires active - release admissions for all seven product targets. A Production run also - needs an active workflow admission for the exact sealed bundle. - - >- - The full record->compile->replay browser suite runs in the required - e2e-browser PR gate and repeats in the weekly compatibility matrix. - - >- - Existing-session attachment is Chromium-only and loopback-only. It - requires a dedicated browser process with remote debugging. The - Playwright-native browser path owns this claim. Capture extension code - is outside its evidence scope. - - # -------------------------------------------------- deterministic $0 replay - - id: deterministic-zero-model-replay - claim: >- - Replay is deterministic, local, and $0 — zero model calls on either the - record or the replay side. - surfaces: [README.md, website, docs] - tier: supported - evidence: - - path: tests/e2e/test_record_compile_replay.py - proves: >- - Baseline replay x3 resolves every step on the `template` rung with 0 - heals and 0 model calls; healed bundles replay clean afterward. - - path: tests/test_replayer.py - proves: >- - The replayer is a deterministic resolution ladder; the VLM rung is a - fallback, not on the default path — the core runtime is model-free. - - path: benchmark/BENCHMARK.md - kind: benchmark - proves: >- - CI-reproducible MockMed run artifact: 100/100 compiled replays at - 4.9s p50 with zero model calls, measured 2026-07-08 on Flow 0.1.0 - (pre-v0.2.0 source build); field/artifact reference. - caveats: - - >- - A VLM rung exists as the lowest fallback of the ladder; it is not - invoked on a clean deterministic replay, and never on the record side. - - # ---------------------------------------------- effect verification / writes - - id: effect-verification-silent-writes - claim: >- - Effect verification against the system of record catches silent wrong - writes the screen-only oracle misses (5 of 7 transactional fault classes). - surfaces: [README.md, docs] - tier: supported - evidence: - - path: tests/test_effect_verifier.py - proves: >- - The REST/FHIR/document-hash verifiers confirm exactly-one write and - refute duplicate / missing / partial / collateral-loss writes. - - path: tests/test_silent_wrong_action_benchmark.py - proves: >- - Each silent-wrong-action class is silent under the screen-only oracle - and is CAUGHT once effects are declared and verified. - - path: tests/test_effect_fhir.py - proves: >- - The FHIR effect verifier's read/confirm/refute/indeterminate contract - (the live-OpenEMR smoke is a separate opt-in function in this file). - - path: benchmark/fault_model/FAULT_MODEL.md - kind: benchmark - proves: >- - The 7-class transactional fault-model study: 5/7 classes silently - mishandled by screen-only, all 5 halt through the real replayer. - caveats: - - >- - Verification requires the step to DECLARE typed `effects` AND a - configured EffectVerifier. Without a real system-of-record verifier, - on-screen read-back is SAME-SURFACE and not independent. - - - id: effect-verifier-kit - claim: >- - The effect-verifier kit makes declaring and wiring effect verification a - reviewed deployment-config exercise instead of bespoke per-deployment - code: declarative REST / FHIR / read-only-SQL / file-arrival / - document-hash verifier configs with secret-isolated auth references and - explicit run-parameter binding, a cross-substrate exactly-one-NEW-record - duplicate guard, per-consequential-step effect-coverage lint/certify - gates, and typed reconciliation tasks on halt. A deployment with multiple - reviewed read boundaries selects the strongest evidence tier before - actuation, retains that exact selection through durable resume, and never - downgrades to a weaker verifier after an action. - surfaces: [docs] - tier: validating - evidence: - - path: tests/test_effect_sql.py - proves: >- - The read-only SQL verifier's whitelist (mutation/stacking/comment - smuggling refused at construction) and full verdict contract, plus - the exact table-delta audit promoted from the Frappe Lending - reference matrix — against LOCAL sqlite fixtures only. - - path: tests/test_effect_file_arrival.py - proves: >- - File-arrival verdicts (pattern / size>0 / mtime freshness / content - probe / duplicate export) against real temp directories, and the - SFTP path against an in-memory fake paramiko-shaped transport. - - path: tests/test_effect_kit_config.py - proves: >- - The declarative construction path: env-var auth references fail - loud when unset, run-parameter references resolve at build (and - refuse to construct unresolved), and pre-kit configs build - byte-identically. - - path: tests/test_effect_verifier_candidates.py - proves: >- - Required CI constructs and preflights all reviewed candidates before - input, pins the strongest verifier and its pre-state, preserves the - binding through durable resume, and refuses an unavailable selected - verifier rather than falling back after an action. - - path: tests/test_effect_coverage_lint.py - proves: >- - lint warns per consequential step lacking an effect contract and - reports coverage %; certify fails the same gap only when the policy - sets require_effects_for_irreversible (warn-vs-fail is - policy-configurable). - - path: tests/test_effect_reconciliation.py - proves: >- - Every escalated verification failure emits a typed - ReconciliationTask carrying the one-way contract hash and verdict - evidence — never the resolved selector values. - - path: docs/EFFECT_KIT.md - proves: >- - The operator-facing kit contract: config reference plus Frappe - (REST/SQL) and OpenEMR (FHIR/SQL) worked examples targeting the - reference fixtures. - caveats: - - >- - CONTRACT-PROVEN, not live-proven: the SQL verifier is exercised - against sqlite fixtures (no production MariaDB/Postgres), the SFTP - arrival path against a fake transport (no real SFTP server), and the - worked-example configs are templates — only the FHIR substrate has an - additional opt-in live-OpenEMR test. Per-verifier claims are exactly - as strong as these tests. - - # ------------------- record checks built from the app's own reads - - id: record-check-from-app-reads - claim: >- - scaffold-verifier builds a record check from the reads the app made - after the save (the recording's network capture, a SQLite database read - path, or a reviewed verifier section), binds the recorded values to run - parameters, guards every other table when a database path is given (no - row added, changed or removed), and tests the check against injected - bad writes before anyone reviews it. A check that misses one is written as a draft - with the misses listed. Every effect stays unconfirmed until a person - removes the flag. - surfaces: [docs] - tier: supported - evidence: - - path: tests/test_record_check_synthesis.py - node: test_database_read_path_covers_every_table_and_passes_the_suite - proves: >- - On the benchmark/effect_e2e record service, a check built from a - database read path catches every injected bad write end to end - through the real replayer (including the stray billing write) and - passes the clean save. - - path: tests/test_record_check_synthesis.py - node: test_one_rest_read_misses_the_billing_write_and_stays_a_draft - proves: >- - A check built from one REST read misses the stray billing write, - both in the recorded-state fault test and end to end, and is - written as a draft with that miss listed. - - path: tests/test_record_check_synthesis.py - node: test_mockmed_needs_a_declared_complete_read - proves: >- - On the MockMed --break-it fault server, the check built from the - app's /api/db read catches every fault end to end once a person - declares the read complete, and stays a draft until then. - - path: tests/test_record_check_synthesis.py - node: test_openemr_fhir_check_refutes_store_level_faults - proves: >- - On the OpenEMR-shaped FHIR R4 fake, the check found from the - Observation search refutes partial, duplicate, phantom, - wrong-patient and lost-update faults and confirms the clean save. - - path: tests/test_record_check_synthesis.py - node: test_guards_catch_a_changed_or_deleted_row_through_the_real_read - proves: >- - The generated SQL reads, run against a real SQLite file, refute a - save that also changed or deleted a row in another table. - - path: tests/test_record_check_synthesis.py - node: test_verify_run_refuses_until_a_person_removes_the_flags - proves: >- - verify-run refuses the proposed check until every - needs_operator_confirmation line is removed. - - path: docs/EFFECT_KIT.md - proves: >- - The operator guide: inputs, outputs, the fault classes, and what - the proof does not cover. - caveats: - - >- - Proven on synthetic fixtures only (MockMed, the effect_e2e SQLite - record service, an OpenEMR-shaped FHIR fake). A check built from API - reads alone cannot see writes to tables it does not read, so it stays - a draft unless a database path covers them or a person declares the - read complete. The fault classes are the effect_e2e taxonomy, not a - measured field incident rate. - - >- - Saves that update an existing record are not handled yet: the check - expects one new record. The read's credential is the operator's job; - the recording's reads used the browser's sign-in. - - - id: ui-readback-separate-session - claim: >- - With no API or database access, a save can be checked through the - application's own record page: a separate browser with a new, empty - context and its own sign-in opens the record by identifier, confirms the - page shows that identifier, reads the saved fields from the page - structure, and judges them with the shared effect judge. After sign-in - the session refuses every request that is not a read. The check - declares tier 2 (a separate session) and is never labeled a - system-of-record read. - surfaces: [README.md, docs] - tier: supported - evidence: - - path: tests/test_ui_readback_verifier.py - proves: >- - The verdict rules without a browser: confirms, refutes partial, - duplicate and lost-update saves, never claims absence as proof that - nothing was saved, halts on another record's page, a refused request, - a changed layout, a shortened value, an unfresh session or a failed - sign-in, declares tier 2, and keeps every existing verifier identity - digest unchanged. - - path: tests/test_ui_readback_browser.py - proves: >- - In a real browser against MockMed's server-rendered record pages: - its own sign-in even when another session is signed in, refuted - wrong saves, fetch/beacon/XHR/form posts refused with none reaching - the server, display changes that stop rather than pass, and tier-2 - evidence through the real replayer. - - path: tests/test_ui_readback_benchmark.py - proves: >- - A subset of the measurement: the same-screen check misses accepted - wrong saves, the UI read-back catches partial, wrong-record and - lost-update saves, and the measured blind spots stay blind. - - path: benchmark/ui_readback - proves: >- - The full measurement next to a same-screen check and an API read, - on the GUI replay and API-write fault lists plus display probes. - caveats: - - >- - Measured on synthetic fixtures (MockMed and the effect_e2e record - service) whose record pages were written for these tests, not on a - production application's record pages. The check sees only what a - record page shows and is only as independent as the page's own read - path. - - - id: desktop-readback-separate-session - claim: >- - A save in a desktop, RDP or Citrix application can be checked the way a - person checks it: a separate session that is never the one that typed - searches for the record, opens the one result that shows its - identifier, confirms the record view shows that identifier, and reads - the saved fields through UI Automation or OCR, judged by the shared - effect judge. The look-up types only into the search box and never - clicks a control with a save-like label. With its own sign-in it - declares tier 2 (a separate session); without one, tier 3. It is never - labeled a system-of-record read. - surfaces: [docs] - tier: supported - evidence: - - path: tests/test_desktop_readback.py - proves: >- - On the WinForms patient-notes fixture through the real in-guest - agent and Windows client (UI Automation): confirms a saved note, - refutes a wrong one, opens only the row that shows the full - identity past a same-first-name decoy, halts on two matching rows, - and refuses a search button with a save-like label. On the RDP - kiosk's look-up panel through the RDP backend and real OCR: - confirms a booking from its own RDP logon (tier 2), never turns an - OCR mismatch into REFUTED, and never takes "not found" as proof - that nothing was saved. The same look-up confirms through a Citrix - Workspace window and a native macOS window (tier 3, a window as the - same user). Neither fixture's save control or form is touched. The - deployment refuses a read-back session that is the session that - types. - caveats: - - >- - The WinForms fixture runs as a UI Automation stand-in that mirrors - patient_notes.ps1 and its pn_db.py persistence, and the kiosk as - pixels drawn at the Tk layout; neither is the live Windows VM or the - Docker RDP fixture in this evidence. On the pixel path OpenAdapt cannot - prove where keyboard focus is; it checks the search box shows the - query before it submits. - - - id: lookup-teaches-the-check - claim: >- - When a recording shows the person or the agent look the record up after - saving, Flow proposes that look-up as the record check with no marking - or configuration: a same-session check and, for desktop, RDP and Citrix - recordings, a separate-session desktop_readback. Every proposal waits - for a person. - surfaces: [docs] - tier: supported - evidence: - - path: tests/test_lookup_detect.py - proves: >- - On a synthetic recording of the RDP kiosk: finds the save by its - OCR label, the search, and only the values the look-up brought onto - the screen (not the saved form still showing the same text); - proposes nothing without a look-up; the proposed desktop_readback, - with only its address filled in, confirms the booking through real - OCR from separate sessions; check accept writes check.json and - never overwrites one; record --verify needs no file and ends with - the look-up prompt when none is found. - caveats: - - >- - Measured on one synthetic kiosk recording. The detector needs a save - button with a save word, a typed and submitted search, and the saved - values readable by OCR on the last frame. - - # --------------------------------------------------- identity gate / halt - - id: identity-gate-halt-armed - claim: >- - On ambiguity the runtime halts instead of guessing, and an identity gate - refuses a wrong-entity (wrong-patient) click — on ARMED steps only. - surfaces: [README.md, docs] - tier: supported - evidence: - - path: tests/test_identity.py - proves: >- - Wrong-entity / near-name sibling / generic-band / param-in-band - probes: the identity check refuses to verify a mismatched target and - never arms on non-discriminative bands. - - path: tests/test_disambiguation.py - proves: >- - Underdetermined targets surface as explicit disambiguation rather - than a guessed click. - - path: tests/test_identity_fuzz.py - proves: >- - Public property-based checks preserve the never-false-accept - invariant for collapsible identifiers while requiring clean - identifiers to remain verifiable. - - path: tests/test_identity_ladder.py - proves: >- - The identity resolution ladder (structural/template/OCR) escalation. - caveats: - - >- - Identity verification covers ONLY armed steps. Real bundles arm a - MINORITY of clicks (4 of 12 on a recent live OpenEMR bundle); an - UNARMED click proceeds with no identity check whatsoever. Coverage is - an auditable per-step metric, but disclosure does not close the gap. - `scaffold-verifier --bundle` reports coverage before and after - evidence from the recording's DOM / accessibility text at each - unarmed click; it proposes only evidence the runtime checks on that - surface, and a person applies it. - - # -------------------------- compiler-emitted identifier crops (pixel tier) - - id: identifier-crop-compile-emission - claim: >- - The compiler emits a pixel identifier crop (anchor.identifier_crop) for - identity-armed steps without structured identity — and for any step whose - identifying region is marked at record time (--identifier) — so the - pixel-compare identity tier arms on remote-display/pixel replays; every - crop-less identity-applicable step records an explicit degrade reason, - and lint surfaces per-bundle pixel-identity coverage. - surfaces: [docs] - tier: supported - evidence: - - path: tests/test_compile_identifier_crop.py - proves: >- - Synthetic-fixture proof of the emission mechanism: a pixel-only - recording compiles WITH a crop under templates/identifiers/ (sealed - + manifest-hashed like every image crop); a structured recording - writes NO identity pixels and records why; explicit --identifier - markings (event rect / meta region) win; encrypted save seals the - crop and the sealed crop still reaches the tier; the compiled crop - drives a wrong-MRN MISMATCH through the real replayer ladder while - pixel VERIFY stays hard-gated off (zero-false-accept preserved). - - path: tests/test_identifier_crop_lint.py - proves: >- - Lint coverage surfacing: identity-armed steps with vs without crops - (missing_identifier_crop findings carry the compiler's degrade - reason; warn on band-only identity, info under structured identity). - caveats: - - >- - Mechanism proven on synthetic fixtures and the bundled demo app only — - this does NOT re-qualify any desktop/remote-display substrate, and the - pixel tier remains MISMATCH-or-ABSTAIN (it can add a safe halt on a - wrong identifier, never authorize a match; PIXEL_VERIFY_ENABLED stays - off pending a jitter-robust distance). - - >- - Automatic emission requires an OCR-readable identity band at compile - time; icon-only or unreadable rows still compile crop-less (with the - recorded reason) and fall back to the OCR band tier at replay. - - # ------------------------------------------------ halt -> teach -> promote - - id: halt-teach-promote - claim: >- - A halt is learnable: halt -> teach a correction -> promote a guarded - branch, refusing underdetermined fixes. - surfaces: [README.md, docs] - tier: supported - evidence: - - path: tests/test_halt_learn_loop.py - proves: >- - A surprise modal halts and emits a learnable trace; teaching promotes - a guarded dismiss branch that replays without regression; an - underdetermined correction is refused. - - path: tests/test_teach_cli.py - proves: >- - The `teach` CLI resolves a halt via a correction spec or a recording, - refuses an underdetermined fix, and errors on a non-halted run. - - path: tests/test_teach_placement.py - proves: >- - A recorded fix's own target is carried into the taught bundle; the - fix is placed before a step that never acted and after a step that - acted (retried, or checked against its expected screen); retrying a - step that can write, and a fix with no recorded target, are refused. - caveats: - - >- - Promotion is governed by a regression gate that blocks identity- - weakening corrections; the loop refuses to guess when the fix is - underdetermined. - - # -------------------------------- typed human policy decisions in a program - - id: typed-business-decisions-supported - claim: >- - A qualification client can add or update a typed finite business-policy - decision without editing an internal manifest. The compiled workflow can - then pause at that decision, accept one authorized and attributed choice, - retain a signed durable receipt, revalidate the live application, and - continue only through the certified successor branch. - surfaces: [docs] - tier: supported - evidence: - - path: tests/test_business_decision.py - proves: >- - Required CI covers typed qualification authoring and replacement, - qualification-revision and certification invalidation, ambiguous - insertion refusal, the closed runtime decision contract, role and - evidence checks, expiry, renewal, idempotency, crash recovery, signed - branch authority, scoped outputs, fresh live-state revalidation, - normal downstream action gates, and repair-bypass refusal. - - path: docs/BUSINESS_DECISIONS.md - kind: doc - proves: >- - The public engine contract separates a declared business choice from - an operational halt and defines the Desktop, Cloud, and customer-local - integration boundary. - caveats: - - >- - The engine validates a principal and its roles; it does not authenticate - a self-asserted user. Desktop, Cloud, or a customer-local identity route - must supply the authenticated principal. - - >- - A human choice is control authority only. It cannot satisfy entity - identity, a postcondition, or effect verification, and it cannot turn a - screen statement or a human assertion into VERIFIED. - - - id: reviewed-judgment-cases-supported - claim: >- - A qualification project can bind typed local facts, evidence hashes, - reviewer provenance, and the exact decision contract to reviewed examples - and counterfactuals. It can retain permanent human authority, record a - reviewed automatic-rule candidate, or refuse certification until more - evidence exists, without converting one historical choice into policy. - surfaces: [docs] - tier: supported - evidence: - - path: tests/test_judgment_cases.py - proves: >- - Required CI covers closed fact schemas, exact workflow and decision - bindings, local-only evidence references, conflict refusal, - reciprocal contrast coverage for automatic-rule candidates, retained - human authority, unresolved-evidence refusal, and the invariant that - case evaluation never edits or synthesizes the executable rule. - - path: tests/test_qualification_project.py - proves: >- - Required CI binds the reviewed local evidence bytes and review note - into certification, reproduces that exact contract when a qualified - workflow is saved, and refuses changed case or evidence digests. - - path: docs/BUSINESS_DECISIONS.md - kind: doc - proves: >- - The public contract separates qualification-time judgment capture - from one live runtime answer and describes the scriptable authoring - and judgment-case interfaces. - caveats: - - >- - An automatic-rule case names only a reviewed rule identifier and finite - option. Flow does not infer or generate executable policy from the case; - the rule must be authored and qualified through the normal program path. - - >- - A retained human-node case preserves runtime human authority. A - more-evidence-required case refuses certification instead of guessing. - - - id: qualified-remote-decision-v2-supported - claim: >- - A negotiated V2 attended task binds optional reviewed entity wording to - the exact qualification, bundle, step, policy, and pause authority. An - unqualified or unrecognized entity class stays local and the remote task - uses the signed neutral record or item fallback. - surfaces: [docs] - tier: supported - evidence: - - path: tests/test_attended_actions.py - proves: >- - Required CI covers the V1-compatible and V2 signed envelopes, - provenance binding, remote-safe entity vocabulary, idempotent - decisions, and fresh revalidation before resumed actuation. - - path: tests/test_qualification_project.py - proves: >- - Required CI requires the current exact qualification contract before - the V2 producer can emit its reviewed presentation metadata. - - path: docs/DECISION_DELIVERY.md - kind: doc - proves: >- - The delivery contract defines explicit V2 negotiation, neutral V1 - fallback, and the local boundary for actual entity identifiers. - caveats: - - >- - V2 requires openadapt-types 0.10.x and explicit peer negotiation. The - dependency does not upgrade a V1 consumer, and the byte-compatible V1 - path remains available. - - >- - The entity class is presentation metadata only. Actual record identity - remains inside the customer-controlled runner and is revalidated before - any resumed action. - - # ------------------------------------------- MockMed benchmark (CI-reprod.) - - id: mockmed-benchmark-ci-reproducible - claim: >- - The MockMed benchmark is CI-reproducible: compiled replay finishes ~4.9s - p50 with zero model calls versus ~37.5s p50 (~$0.27/run) for the agent. - Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build; not - re-measured on a later release. - surfaces: [README.md, docs] - tier: supported - evidence: - - path: tests/test_mockmed.py - proves: >- - The MockMed app + drift screens are deterministic and reachable, the - substrate the benchmark replays against. - - path: tests/test_benchmark.py - proves: >- - The benchmark harness / report accounting that produces the numbers. - - path: benchmark/BENCHMARK.md - kind: benchmark - proves: >- - Full numbers, methodology, and caveats for the CI-reproducible - MockMed comparison (dated run artifact). - caveats: - - >- - The published latency/cost figures come from a dated run artifact - measured on Flow 0.1.0 (pre-v0.2.0 source checkout; exact runtime HEAD - not retained) on 2026-07-08; the app is intentionally simple, so success rate (100/100 - vs 20/20) is not the story — the standing cost/latency delta is. Agent - cost is a list-price estimate. - - # ------------------------------ Windows desktop (validating, opt-in gated) - - id: windows-desktop-validating - claim: >- - Windows UIA has scoped acceptance: the deterministic structural rung - delivered native actions in a fixed WinForms workflow with independent - effects and fail-closed stale/ambiguity refusal. - surfaces: [README.md, docs, website] - tier: validating - evidence: - - path: tests/e2e/test_parallels_desktop_e2e.py - proves: >- - OPT-IN live proof on a real Win11-ARM VM: record->compile->replay - through WindowsBackend with the structural rung resolving every click - by AutomationId (armed_coverage == 1.0). - - path: tests/test_windows_backend.py - proves: >- - The 4-method Backend protocol on Windows against a MOCKED WAA server - (runs in CI post-merge; proves the wire, not a live desktop). - - path: benchmark/structural_action/STRUCTURAL_ACTION.md - kind: benchmark - proves: >- - Desktop drift benchmark: the structural rung resolved 21/21 targets - where visual replay alone managed 6/21. - - path: benchmark/windows_uia/results.json - kind: benchmark - proves: >- - Accepted candidate 20260717-candidate-56759c8-v2: 3/3 exact task and - SQLite effects, 12 UIA receipts, and 3/3 stale plus 3/3 ambiguity - refusals with zero silent incorrect success, over-halt, or model calls. - caveats: - - >- - The live desktop e2e is OPT-IN and infra-gated (needs a Parallels - Win11-ARM VM; `OAFLOW_PARALLELS_E2E=1`); it never runs on default CI. - Only the mocked backend protocol runs in CI. - - >- - Acceptance covers the named in-tree workflow and exact Windows VM. - Third-party applications require workflow-specific qualification. - - # ------------------------------- Native macOS (scoped field acceptance) - - id: macos-native-validating - claim: >- - Native macOS has scoped acceptance for exact-window-bound text delivery, - independent file effects, and ambiguity refusal on a fixed TextEdit task. - surfaces: [README.md, docs, website] - tier: validating - reproducibility: field - evidence: - - path: tests/test_macos_backend.py - proves: >- - CI covers unique-window binding, foreground/focus proof, exact-element - text delivery, and refusal before physical input when proof fails. - - path: tests/test_macos_qualification.py - proves: >- - CI validates the qualification oracle, failure taxonomy, evidence - hashes, cleanup adjudication, and ambiguity-refusal accounting. - - path: benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json - kind: benchmark - proves: >- - Candidate b1b61a5 completed 3/3 exact-byte TextEdit effects and - refused two ambiguous windows without modifying either file. - caveats: - - >- - Acceptance covers TextEdit on one macOS 15.7.3 Apple Silicon host and - active user session; each customer application is qualified separately. - - >- - The original counted report remains failed. The hash-bound adjudication - accepts only its independently confirmed action/effect/refusal evidence. - - # -------------------------- Native Linux AT-SPI (qualification implementation) - - id: linux-native-validating - claim: >- - Native Linux uses an exact-window AT-SPI backend with complete candidate - enumeration, native action delivery, and fail-closed ambiguity, staleness, - and Wayland portal boundaries. - surfaces: [README.md, docs] - tier: validating - evidence: - - path: tests/test_linux_backend.py - proves: >- - Default CI covers exact app/window binding, bounded candidate - enumeration, ambiguity and stale-target refusal, native invoke/focus - and editable-text delivery, window-scoped capture, physical-input - opt-in, and Wayland portal refusal through an injected Linux client. - - path: tests/test_linux_qualification.py - proves: >- - Default CI enforces the live qualification's fixed three-trial - matrix, independent exact-file and absence oracles, and separate - silent-incorrect-success, over-halt, and refusal-failure accounting. - - path: scripts/qualify_linux_atspi.py - kind: benchmark - proves: >- - The required linux-atspi-x11 job drives the real GTK3 fixture through - AT-SPI on an isolated Xvfb display and session D-Bus, emitting a - per-trial JSON evidence artifact. - - path: docs/desktop/LINUX_NATIVE.md - kind: doc - proves: >- - The operator contract, X11 and Wayland boundaries, configuration, - delivery-only receipt semantics, and required real GTK/AT-SPI CI - qualification contract. - caveats: - - >- - Required CI establishes live scoped acceptance only for the in-tree - GTK3 application on its isolated Xvfb image. Each third-party - application and environment requires its own qualification. - - >- - X11 is the initial built-in live transport. Wayland requires a real - operator-approved XDG RemoteDesktop/ScreenCast portal session; the - built-in client currently refuses rather than pretending a grant exists. - - # ----------------------------------------- RDP (scoped field acceptance) - - id: rdp-validating - claim: >- - RDP has scoped acceptance for real-network framebuffer decode and input - delivery into Windows 11 with independent exact file-effect verification. - surfaces: [README.md, docs, website] - tier: validating - reproducibility: field - evidence: - - path: tests/e2e/test_parallels_rdp_e2e.py - proves: >- - Opt-in snapshot-safe real RDP qualification harness with exactly three - trials, independent guest-tools oracle, failure taxonomy, and cleanup. - - path: tests/test_rdp_backend.py - proves: >- - CI covers the backend/transport contract, framebuffer conversion, - pointer and keyboard delivery, resize rebaseline between actions, - mid-lease geometry refusal, pre-delivery horizontal-scroll refusal, - typed uncertain transport failures, and record-compile-replay - conformance. - - path: tests/test_rdp_multiapp_campaign_contract.py - proves: >- - Required CI covers the bounded 27-trial FreeRDP campaign contract, - independent SQLite, CSV, and Maildir oracles, fail-closed visual - action preflight, uncertain-delivery handling, and result accounting. - - path: benchmark/rdp_multiapp/README.md - kind: doc - proves: >- - The public synthetic multi-window campaign defines the workflow, - faults, independent persisted surfaces, and acceptance denominator. - - path: benchmark/rdp/results_82a658a_20260718.sanitized.json - kind: benchmark - proves: >- - Candidate 82a658a passed 3/3 at 51.845, 10.467, and 7.477 seconds, - with zero failures, silent incorrect successes, over-halts, or model calls. - caveats: - - >- - Acceptance covers the named 1280x800 Windows Run/file task and exact VM - environment, not arbitrary applications, identity policies, or Citrix. - - >- - The multi-window campaign uses deterministic synthetic applications. - It exercises the real FreeRDP pixel and input path but does not qualify - a named customer application or environment. - - # ------------------------------ Desktop recording via the CLI (validating) - - id: substrate-runtime-validation-supported - claim: >- - Runtime-validation v3 binds Standard and Regulated hosted activation to - the exact governed authorization template reproduced from the sealed - qualification. It also binds the successful run's resolved target kind - (`web|windows|macos|linux|rdp|citrix`), artifact, compiler, parameter - schema, strict lint, policy, risk, report, and opaque environment. Web - retains its exact HTTPS/host boundary. Native and remote execution emits - no app, window, host, readiness, or backend-hint values to Cloud. Local - verification retains signed v1 and v2 compatibility. - surfaces: [README.md, docs, website] - tier: supported - evidence: - - path: tests/test_runtime_validation.py - proves: >- - Required CI exercises all six target kinds, validates v3 against its - closed JSON Schema, refuses a Standard or Regulated activation without - an exact template, binds the template SHA to the HMAC, preserves web - URL/host checks, keeps native/remote execution empty, verifies the - canonical HMAC vector, and retains signed v1/v2 compatibility. - - path: tests/test_cli_new_commands.py - proves: >- - Required CI carries the resolved web, Windows, and Citrix backend - token through durable resume into the new run report rather than - trusting an upload-time relabel. - - path: schemas/runtime-validation-attestation-v3.json - kind: doc - proves: >- - The public closed envelope requires target_kind and the governed - authorization template SHA, and conditionally permits browser - execution fields only for web. - caveats: - - >- - The HMAC proves operator-token possession and envelope integrity; it is - not independent observation of the local replay or certification of an - arbitrary target application. - - - id: desktop-recording-validating - claim: >- - The product CLI records desktop workflows through openadapt-capture and - `record --backend windows|macos|linux|rdp|citrix` captures the operator's - real demonstration and emits the compile-ready recording format, so - record -> compile -> replay closes on the desktop substrate, not just the - browser. - surfaces: [README.md, docs, website] - tier: validating - evidence: - - path: tests/test_desktop_record.py - proves: >- - The live-capture orchestration + CLI wiring (record --backend - windows|macos|linux|rdp|citrix -> openadapt-capture -> - convert_capture), and that a desktop-shaped recording COMPILES into a - bundle and REPLAYS to completion through the desktop backend path, - resolving each click to its recorded target (runs on default CI). - - path: tests/test_capture_adapter.py - proves: >- - The capture->recording bridge over a REAL openadapt-capture session - (its own event-processing pipeline + frame extraction) feeding the - UNMODIFIED compiler (runs on default CI: the `test` job installs the - `capture` extra; openadapt-capture >=0.5.4 imports clean headless). - - path: docs/desktop/RECORDING.md - kind: doc - proves: >- - The capture-assisted and live-observer paths, fail-closed secret - handling, RDP coordinate binding, and reuse of - openadapt-capture + the capture adapter. - caveats: - - >- - Offline capture carries NO structural (UIA AutomationId) locator, so - replay uses the visual ladder (template/ocr/geometry). The live capture - needs a display (openadapt-capture is the optional `capture` extra); the - CI proof covers a real on-disk capture session -> convert -> compile -> - replay, not a live recorder run (the live recorder has its own - integration suite in the openadapt-capture repo). - - >- - `--secret` is refused on an unqualified pixel/desktop capture with no - field geometry, and RDP recording uses the replay pixel space or a - deployment-calibrated client-window mapping. - - # ------------------------------- Citrix pixel-only (validating, opt-in gated) - - id: citrix-pixel-validating - claim: >- - Citrix uses a dedicated exact-Workspace-window backend beneath the governed - pixel-only remote-display contract. Required CI covers its readiness gate, - governed execution, durable resume, report binding, and refusal contracts; - the counted no-DOM qualification covers the driver, visual ladder, - independent effects, and drift halts. Live ICA/HDX acceptance remains - separately bound to the exact deployment. - surfaces: [README.md, docs, website] - tier: validating - evidence: - - path: tests/e2e/test_citrix_pixel_e2e.py - proves: >- - OPT-IN pixel-only proof: structural_armed_coverage == 0, replay - resolves on template/ocr/geometry only, on-screen OCR read-back - verifies the write, the identity gate HALTs on a look-alike patient, - and render drift triggers halt-on-ambiguity. - - path: tests/test_pixel_identity_probe.py - proves: >- - The pixel-substrate identity probe behind the on-pixels identity gate. - - path: tests/test_citrix_workspace_backend.py - proves: >- - Required CI covers the dedicated backend preset, exact owner/title - overrides, readiness probe construction, pixel-only capability - boundary, backend factory, and product CLI selectors. - - path: tests/test_run_gate.py - proves: >- - Required CI refuses governed Citrix execution before action when its - readiness binding is absent or blank, admits a sealed bundle carrying - a recorded readiness binding, and reports only the resolved backend - token rather than sensitive target strings. - - path: tests/test_cli_new_commands.py - proves: >- - Required CI restores the recorded Citrix owner, exact title, and - readiness binding through durable approve/resume, and refuses before - backend construction when resumed configuration is incomplete. - - path: tests/test_hosted.py - proves: >- - Required CI binds a completed local Citrix report to the closed - `citrix` execution token without copying target owner, title, or - readiness values into the hosted summary. - - path: tests/e2e/test_citrix_workspace_standin_e2e.py - proves: >- - The dedicated Citrix backend passes three healthy effect-confirmed - record->compile->replay trials and three severe-drift safe-halts over - a no-DOM surface, with zero model calls, false completion, or silent - incorrect success. - - path: tests/test_citrix_real_acceptance.py - proves: >- - Required CI validates the public real-ICA campaign preflight, - distinct authority keys, executable and oracle attestations, one-use - nonce journal, crash recovery, signed display and monitor-topology - observation, explicit reliability metrics, uncertain dispatch, and - fail-closed report contract without provisioning infrastructure. - - path: benchmark/citrix_workspace/results.json - kind: artifact - proves: >- - The retained six-trial record reports code_readiness_accepted=true - and ica_hdx_accepted=false, keeping driver readiness distinct from a - counted live ICA/HDX qualification. - - path: docs/desktop/CITRIX_PIXEL.md - kind: doc - proves: >- - The Citrix driver model, reusable evidence, exact-deployment - acceptance contract, independent-effect boundary, and - customer-controlled posture. - caveats: - - >- - PIXEL-ONLY: no UIA/DOM crosses to the driver. On-screen OCR read-back is - SAME-SURFACE, not an independent system-of-record check. - - >- - A Parallels VM window is a Citrix ANALOG; real HDX/latency/DPI/lock- - screen drift is not simulated. OPT-IN + infra-gated - (`OAFLOW_CITRIX_PIXEL_E2E=1` or - `OAFLOW_CITRIX_STANDIN_E2E=1`); neither live-window proof runs on - default CI, and neither replaces a counted live ICA/HDX acceptance - record. - - >- - The public real-acceptance harness contains no customer recipe, - credential, identifier, screenshot, or deployment-specific threshold. - A private qualified configuration supplies those exact bindings. - - # ------------------------ Windows-host window replay (mock-tested, roadmap) - - id: win32-window-replay-roadmap - claim: >- - Windows hosts can replay window-scoped remote-display workflows (the - Citrix/RDP client window on a Windows endpoint) through the same - governed pixel contract already proven on macOS hosts. - surfaces: [docs] - tier: roadmap - evidence: - - path: tests/test_win32_window_client.py - proves: >- - MOCK-ONLY conformance: the win32 WindowClient implements the - remote-display WindowClient seam (exact process/title/class - selection with ambiguity halt, client-area coordinate mapping under - per-monitor DPI awareness, PrintWindow-then-BitBlt capture fallback, - focus-verification refusal, and the UIPI elevation guard) against a - scripted Win32 API — never against a real Windows host. - - path: docs/desktop/CITRIX_PIXEL.md - kind: doc - proves: >- - The remote-display contract the client implements and the evidence - ladder for qualifying it (Parallels/RDP client-window analog first, - then a counted live Citrix host run). - caveats: - - >- - NOT qualified: no counted end-to-end batch on a real Windows host or - a real client window exists. The contract tests mock every Win32 - call; real DPI virtualization, UIPI, foreground-arbitration, and - PrintWindow rendering behavior remain unproven until the - Parallels/real-Windows validation procedure is executed and counted. - - # -------------------------------- OpenEMR head-to-head (field, not CI-reprod.) - - id: openemr-field-benchmark - claim: >- - On the real third-party OpenEMR public demo, compiled replay went 19/20 - versus 10/10 for a computer-use agent, faster and with zero model calls. - Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build. - surfaces: [README.md, docs, website] - tier: validating - reproducibility: field - evidence: - - path: tests/test_openemr_benchmark.py - proves: >- - The CI-reproducible half: the saved-message-row verifier, its - unsaved-entry-form rejection, and the intent-not-coordinates task - prompt that both benchmark arms use. - - path: tests/test_openemr_retained_finals.py - kind: test - proves: >- - When the local-only retained final frames are mounted, the guard - replays all 30 with the current verifier and requires 19/20 compiled, - 10/10 agent, and exactly one corrected legacy false success. - - path: benchmark/openemr/BENCHMARK.md - kind: benchmark - proves: >- - The corrected field-test numbers, saved-row screen-oracle contract, - methodology, and cost caps for the 20-vs-10 head-to-head run. - - path: docs/showcase-openemr/FINDINGS.md - kind: doc - proves: >- - The correctness-only field findings (fresh browsers, zero model - calls, closed-loop scrolling). - caveats: - - >- - The historical result uses OCR evidence from a visible saved message - row. It does not use an out-of-band OpenEMR system-of-record read. - - >- - FIELD TEST, NOT CI-reproducible: the head-to-head ran against a SHARED - public demo that other users mutate and that resets daily; the sample - is small (10 agent runs). Only the verifier + task-prompt units run in - CI. `reproducibility: field` forbids ever labeling this `supported`. - - # -------------------------------- compose separately recorded bundles - - id: compose-recorded-bundles - claim: >- - openadapt-flow compose sequences named, already-compiled child bundles - under a handoff contract. Each child stays bound to its recorded - surface. The parent starts a child only after a predecessor ends - VERIFIED (or an explicit allowed halt class). Handoffs copy - effect-bound parameter values from confirmed effect receipts; missing - evidence HALTs. certify and run execute the parent artifact. - surfaces: [README.md, docs] - tier: supported - evidence: - - path: tests/test_compose_authoring.py - proves: >- - Authoring copies two child bundles, records the handoff contract, - and refuses a source that is not effect-bound, an unknown target - parameter, a single child, a cyclic after-graph, and a backwards - handoff. - - path: tests/test_compose_runtime.py - node: test_two_child_fixture_second_is_local_backend - proves: >- - A two-child fixture runs intake through MockMed with independent - effect verification, then a local FakeBackend child that receives - the verified patient_id. Missing handoff evidence and an - unverified predecessor HALT before the next child starts. - - path: tests/test_cli_compose.py - proves: >- - The compose parser dispatches, the CLI writes a composition - artifact, and replay refuses to run one. - caveats: - - >- - The parent sequences admitted child runs. It does not enlarge the - workflow-program graph and does not introduce a process contract. - It does not switch backends inside one recording. - - >- - Evidence is unit tests plus a local mock second child. This claim - does not cover Production admission or a live Citrix session. - diff --git a/packages/flow/claims/README.md b/packages/flow/claims/README.md new file mode 100644 index 0000000000..def48fd5b2 --- /dev/null +++ b/packages/flow/claims/README.md @@ -0,0 +1,59 @@ +# Capability claims + +One file per claim: `claims/.yaml`, where `` is the claim's `id`. +Adding a claim adds a file, so two pull requests that each add a claim don't +edit the same lines. `scripts/validate_claims.py` loads every `*.yaml` here, +enforces the contract below, and regenerates `docs/VERIFICATION.md` and +`docs/verification.json`: + +```bash +python scripts/validate_claims.py --check --structure-only +python scripts/validate_claims.py --report +``` + +The report is a deterministic function of these files and the evidence they +cite. It has no timestamp, claims are grouped by tier and sorted by id, and it +has no counts, so two pull requests that add different claims usually merge +cleanly. `tests/test_validate_claims.py` fails when the committed report is +stale. + +## Contract + +```text +Every public capability claim about openadapt-flow ("web is supported today", +"Windows has scoped acceptance") must be a FUNCTION of automated +evidence, not a hand-written adjective that quietly rots. This registry maps +each claim -> an evidence `tier` -> the specific backing test(s)/benchmark(s) +that prove it. `scripts/validate_claims.py` enforces the tier<->evidence +contract in CI and regenerates `docs/VERIFICATION.md` from it. + +Evidence strength is derived from the repo, not asserted here: + * a test file with NO module-level env skipif, that exists -> "supported" + candidate evidence; its required `test` or `e2e-browser` job must bind the + file to at least one passing case in that job's real JUnit result + * a test file gated by a module-level `pytestmark` env skipif -> "validating" + (opt-in / infra-gated: grounded, but never runs on default CI) + * a doc / benchmark artifact (.md or a benchmark dir) -> "roadmap" + (design/field evidence; cannot by itself prove a running capability) +A claim FAILS the gate when its `tier` OUTRANKS its strongest evidence +(rank order research < roadmap < validating < supported). Additionally a +claim carrying `reproducibility: field` may NOT be tier `supported` (a +result that is not CI-reproducible is never presented as "supported"). + +TIERS + supported — bound to a real passing result in required default CI. + validating — grounded in a REAL opt-in/infra-gated proof or a field test; + being validated (incl. with design partners). NOT "supported". + roadmap — designed/specified, not yet proven by a running test. + research — open question / study. + +EVIDENCE ENTRY FIELDS + path — repo-relative path to a test file, benchmark dir, or doc. MUST exist. + proves — what THIS artifact actually demonstrates (honest scope). + kind — optional: test | benchmark | doc. Inferred when omitted + (tests/**/*.py -> test, *.md -> doc, else -> benchmark). + node — optional: a `def ` that must exist in `path` (rot guard). + +The gate detects opt-in gating from each test's source (a module-level +`pytestmark` skipif on an env var) — the registry cannot lie about it. +``` diff --git a/packages/flow/claims/citrix-pixel-validating.yaml b/packages/flow/claims/citrix-pixel-validating.yaml new file mode 100644 index 0000000000..df56060d0b --- /dev/null +++ b/packages/flow/claims/citrix-pixel-validating.yaml @@ -0,0 +1,81 @@ +id: citrix-pixel-validating +claim: >- + Citrix uses a dedicated exact-Workspace-window backend beneath the governed + pixel-only remote-display contract. Required CI covers its readiness gate, + governed execution, durable resume, report binding, and refusal contracts; + the counted no-DOM qualification covers the driver, visual ladder, + independent effects, and drift halts. Live ICA/HDX acceptance remains + separately bound to the exact deployment. +surfaces: [README.md, docs, website] +tier: validating +evidence: + - path: tests/e2e/test_citrix_pixel_e2e.py + proves: >- + OPT-IN pixel-only proof: structural_armed_coverage == 0, replay + resolves on template/ocr/geometry only, on-screen OCR read-back + verifies the write, the identity gate HALTs on a look-alike patient, + and render drift triggers halt-on-ambiguity. + - path: tests/test_pixel_identity_probe.py + proves: >- + The pixel-substrate identity probe behind the on-pixels identity gate. + - path: tests/test_citrix_workspace_backend.py + proves: >- + Required CI covers the dedicated backend preset, exact owner/title + overrides, readiness probe construction, pixel-only capability + boundary, backend factory, and product CLI selectors. + - path: tests/test_run_gate.py + proves: >- + Required CI refuses governed Citrix execution before action when its + readiness binding is absent or blank, admits a sealed bundle carrying + a recorded readiness binding, and reports only the resolved backend + token rather than sensitive target strings. + - path: tests/test_cli_new_commands.py + proves: >- + Required CI restores the recorded Citrix owner, exact title, and + readiness binding through durable approve/resume, and refuses before + backend construction when resumed configuration is incomplete. + - path: tests/test_hosted.py + proves: >- + Required CI binds a completed local Citrix report to the closed + `citrix` execution token without copying target owner, title, or + readiness values into the hosted summary. + - path: tests/e2e/test_citrix_workspace_standin_e2e.py + proves: >- + The dedicated Citrix backend passes three healthy effect-confirmed + record->compile->replay trials and three severe-drift safe-halts over + a no-DOM surface, with zero model calls, false completion, or silent + incorrect success. + - path: tests/test_citrix_real_acceptance.py + proves: >- + Required CI validates the public real-ICA campaign preflight, + distinct authority keys, executable and oracle attestations, one-use + nonce journal, crash recovery, signed display and monitor-topology + observation, explicit reliability metrics, uncertain dispatch, and + fail-closed report contract without provisioning infrastructure. + - path: benchmark/citrix_workspace/results.json + kind: artifact + proves: >- + The retained six-trial record reports code_readiness_accepted=true + and ica_hdx_accepted=false, keeping driver readiness distinct from a + counted live ICA/HDX qualification. + - path: docs/desktop/CITRIX_PIXEL.md + kind: doc + proves: >- + The Citrix driver model, reusable evidence, exact-deployment + acceptance contract, independent-effect boundary, and + customer-controlled posture. +caveats: + - >- + PIXEL-ONLY: no UIA/DOM crosses to the driver. On-screen OCR read-back is + SAME-SURFACE, not an independent system-of-record check. + - >- + A Parallels VM window is a Citrix ANALOG; real HDX/latency/DPI/lock- + screen drift is not simulated. OPT-IN + infra-gated + (`OAFLOW_CITRIX_PIXEL_E2E=1` or + `OAFLOW_CITRIX_STANDIN_E2E=1`); neither live-window proof runs on + default CI, and neither replaces a counted live ICA/HDX acceptance + record. + - >- + The public real-acceptance harness contains no customer recipe, + credential, identifier, screenshot, or deployment-specific threshold. + A private qualified configuration supplies those exact bindings. diff --git a/packages/flow/claims/compose-recorded-bundles.yaml b/packages/flow/claims/compose-recorded-bundles.yaml new file mode 100644 index 0000000000..ee4a796920 --- /dev/null +++ b/packages/flow/claims/compose-recorded-bundles.yaml @@ -0,0 +1,36 @@ +id: compose-recorded-bundles +claim: >- + openadapt-flow compose sequences named, already-compiled child bundles + under a handoff contract. Each child stays bound to its recorded + surface. The parent starts a child only after a predecessor ends + VERIFIED (or an explicit allowed halt class). Handoffs copy + effect-bound parameter values from confirmed effect receipts; missing + evidence HALTs. certify and run execute the parent artifact. +surfaces: [README.md, docs] +tier: supported +evidence: + - path: tests/test_compose_authoring.py + proves: >- + Authoring copies two child bundles, records the handoff contract, + and refuses a source that is not effect-bound, an unknown target + parameter, a single child, a cyclic after-graph, and a backwards + handoff. + - path: tests/test_compose_runtime.py + node: test_two_child_fixture_second_is_local_backend + proves: >- + A two-child fixture runs intake through MockMed with independent + effect verification, then a local FakeBackend child that receives + the verified patient_id. Missing handoff evidence and an + unverified predecessor HALT before the next child starts. + - path: tests/test_cli_compose.py + proves: >- + The compose parser dispatches, the CLI writes a composition + artifact, and replay refuses to run one. +caveats: + - >- + The parent sequences admitted child runs. It does not enlarge the + workflow-program graph and does not introduce a process contract. + It does not switch backends inside one recording. + - >- + Evidence is unit tests plus a local mock second child. This claim + does not cover Production admission or a live Citrix session. diff --git a/packages/flow/claims/desktop-readback-separate-session.yaml b/packages/flow/claims/desktop-readback-separate-session.yaml new file mode 100644 index 0000000000..2d094b929b --- /dev/null +++ b/packages/flow/claims/desktop-readback-separate-session.yaml @@ -0,0 +1,37 @@ +id: desktop-readback-separate-session +claim: >- + A save in a desktop, RDP or Citrix application can be checked the way a + person checks it: a separate session that is never the one that typed + searches for the record, opens the one result that shows its + identifier, confirms the record view shows that identifier, and reads + the saved fields through UI Automation or OCR, judged by the shared + effect judge. The look-up types only into the search box and never + clicks a control with a save-like label. With its own sign-in it + declares tier 2 (a separate session); without one, tier 3. It is never + labeled a system-of-record read. +surfaces: [docs] +tier: supported +evidence: + - path: tests/test_desktop_readback.py + proves: >- + On the WinForms patient-notes fixture through the real in-guest + agent and Windows client (UI Automation): confirms a saved note, + refutes a wrong one, opens only the row that shows the full + identity past a same-first-name decoy, halts on two matching rows, + and refuses a search button with a save-like label. On the RDP + kiosk's look-up panel through the RDP backend and real OCR: + confirms a booking from its own RDP logon (tier 2), never turns an + OCR mismatch into REFUTED, and never takes "not found" as proof + that nothing was saved. The same look-up confirms through a Citrix + Workspace window and a native macOS window (tier 3, a window as the + same user). Neither fixture's save control or form is touched. The + deployment refuses a read-back session that is the session that + types. +caveats: + - >- + The WinForms fixture runs as a UI Automation stand-in that mirrors + patient_notes.ps1 and its pn_db.py persistence, and the kiosk as + pixels drawn at the Tk layout; neither is the live Windows VM or the + Docker RDP fixture in this evidence. On the pixel path OpenAdapt cannot + prove where keyboard focus is; it checks the search box shows the + query before it submits. diff --git a/packages/flow/claims/desktop-recording-validating.yaml b/packages/flow/claims/desktop-recording-validating.yaml new file mode 100644 index 0000000000..927e4d0f6a --- /dev/null +++ b/packages/flow/claims/desktop-recording-validating.yaml @@ -0,0 +1,41 @@ +id: desktop-recording-validating +claim: >- + The product CLI records desktop workflows through openadapt-capture and + `record --backend windows|macos|linux|rdp|citrix` captures the operator's + real demonstration and emits the compile-ready recording format, so + record -> compile -> replay closes on the desktop substrate, not just the + browser. +surfaces: [README.md, docs, website] +tier: validating +evidence: + - path: tests/test_desktop_record.py + proves: >- + The live-capture orchestration + CLI wiring (record --backend + windows|macos|linux|rdp|citrix -> openadapt-capture -> + convert_capture), and that a desktop-shaped recording COMPILES into a + bundle and REPLAYS to completion through the desktop backend path, + resolving each click to its recorded target (runs on default CI). + - path: tests/test_capture_adapter.py + proves: >- + The capture->recording bridge over a REAL openadapt-capture session + (its own event-processing pipeline + frame extraction) feeding the + UNMODIFIED compiler (runs on default CI: the `test` job installs the + `capture` extra; openadapt-capture >=0.5.4 imports clean headless). + - path: docs/desktop/RECORDING.md + kind: doc + proves: >- + The capture-assisted and live-observer paths, fail-closed secret + handling, RDP coordinate binding, and reuse of + openadapt-capture + the capture adapter. +caveats: + - >- + Offline capture carries NO structural (UIA AutomationId) locator, so + replay uses the visual ladder (template/ocr/geometry). The live capture + needs a display (openadapt-capture is the optional `capture` extra); the + CI proof covers a real on-disk capture session -> convert -> compile -> + replay, not a live recorder run (the live recorder has its own + integration suite in the openadapt-capture repo). + - >- + `--secret` is refused on an unqualified pixel/desktop capture with no + field geometry, and RDP recording uses the replay pixel space or a + deployment-calibrated client-window mapping. diff --git a/packages/flow/claims/deterministic-zero-model-replay.yaml b/packages/flow/claims/deterministic-zero-model-replay.yaml new file mode 100644 index 0000000000..2807cd007a --- /dev/null +++ b/packages/flow/claims/deterministic-zero-model-replay.yaml @@ -0,0 +1,25 @@ +id: deterministic-zero-model-replay +claim: >- + Replay is deterministic, local, and $0 — zero model calls on either the + record or the replay side. +surfaces: [README.md, website, docs] +tier: supported +evidence: + - path: tests/e2e/test_record_compile_replay.py + proves: >- + Baseline replay x3 resolves every step on the `template` rung with 0 + heals and 0 model calls; healed bundles replay clean afterward. + - path: tests/test_replayer.py + proves: >- + The replayer is a deterministic resolution ladder; the VLM rung is a + fallback, not on the default path — the core runtime is model-free. + - path: benchmark/BENCHMARK.md + kind: benchmark + proves: >- + CI-reproducible MockMed run artifact: 100/100 compiled replays at + 4.9s p50 with zero model calls, measured 2026-07-08 on Flow 0.1.0 + (pre-v0.2.0 source build); field/artifact reference. +caveats: + - >- + A VLM rung exists as the lowest fallback of the ladder; it is not + invoked on a clean deterministic replay, and never on the record side. diff --git a/packages/flow/claims/effect-verification-silent-writes.yaml b/packages/flow/claims/effect-verification-silent-writes.yaml new file mode 100644 index 0000000000..fec812ef66 --- /dev/null +++ b/packages/flow/claims/effect-verification-silent-writes.yaml @@ -0,0 +1,29 @@ +id: effect-verification-silent-writes +claim: >- + Effect verification against the system of record catches silent wrong + writes the screen-only oracle misses (5 of 7 transactional fault classes). +surfaces: [README.md, docs] +tier: supported +evidence: + - path: tests/test_effect_verifier.py + proves: >- + The REST/FHIR/document-hash verifiers confirm exactly-one write and + refute duplicate / missing / partial / collateral-loss writes. + - path: tests/test_silent_wrong_action_benchmark.py + proves: >- + Each silent-wrong-action class is silent under the screen-only oracle + and is CAUGHT once effects are declared and verified. + - path: tests/test_effect_fhir.py + proves: >- + The FHIR effect verifier's read/confirm/refute/indeterminate contract + (the live-OpenEMR smoke is a separate opt-in function in this file). + - path: benchmark/fault_model/FAULT_MODEL.md + kind: benchmark + proves: >- + The 7-class transactional fault-model study: 5/7 classes silently + mishandled by screen-only, all 5 halt through the real replayer. +caveats: + - >- + Verification requires the step to DECLARE typed `effects` AND a + configured EffectVerifier. Without a real system-of-record verifier, + on-screen read-back is SAME-SURFACE and not independent. diff --git a/packages/flow/claims/effect-verifier-kit.yaml b/packages/flow/claims/effect-verifier-kit.yaml new file mode 100644 index 0000000000..c0481828a9 --- /dev/null +++ b/packages/flow/claims/effect-verifier-kit.yaml @@ -0,0 +1,62 @@ +id: effect-verifier-kit +claim: >- + The effect-verifier kit makes declaring and wiring effect verification a + reviewed deployment-config exercise instead of bespoke per-deployment + code: declarative REST / FHIR / read-only-SQL / file-arrival / + document-hash verifier configs with secret-isolated auth references and + explicit run-parameter binding, a cross-substrate exactly-one-NEW-record + duplicate guard, per-consequential-step effect-coverage lint/certify + gates, and typed reconciliation tasks on halt. A deployment with multiple + reviewed read boundaries selects the strongest evidence tier before + actuation, retains that exact selection through durable resume, and never + downgrades to a weaker verifier after an action. +surfaces: [docs] +tier: validating +evidence: + - path: tests/test_effect_sql.py + proves: >- + The read-only SQL verifier's whitelist (mutation/stacking/comment + smuggling refused at construction) and full verdict contract, plus + the exact table-delta audit promoted from the Frappe Lending + reference matrix — against LOCAL sqlite fixtures only. + - path: tests/test_effect_file_arrival.py + proves: >- + File-arrival verdicts (pattern / size>0 / mtime freshness / content + probe / duplicate export) against real temp directories, and the + SFTP path against an in-memory fake paramiko-shaped transport. + - path: tests/test_effect_kit_config.py + proves: >- + The declarative construction path: env-var auth references fail + loud when unset, run-parameter references resolve at build (and + refuse to construct unresolved), and pre-kit configs build + byte-identically. + - path: tests/test_effect_verifier_candidates.py + proves: >- + Required CI constructs and preflights all reviewed candidates before + input, pins the strongest verifier and its pre-state, preserves the + binding through durable resume, and refuses an unavailable selected + verifier rather than falling back after an action. + - path: tests/test_effect_coverage_lint.py + proves: >- + lint warns per consequential step lacking an effect contract and + reports coverage %; certify fails the same gap only when the policy + sets require_effects_for_irreversible (warn-vs-fail is + policy-configurable). + - path: tests/test_effect_reconciliation.py + proves: >- + Every escalated verification failure emits a typed + ReconciliationTask carrying the one-way contract hash and verdict + evidence — never the resolved selector values. + - path: docs/EFFECT_KIT.md + proves: >- + The operator-facing kit contract: config reference plus Frappe + (REST/SQL) and OpenEMR (FHIR/SQL) worked examples targeting the + reference fixtures. +caveats: + - >- + CONTRACT-PROVEN, not live-proven: the SQL verifier is exercised + against sqlite fixtures (no production MariaDB/Postgres), the SFTP + arrival path against a fake transport (no real SFTP server), and the + worked-example configs are templates — only the FHIR substrate has an + additional opt-in live-OpenEMR test. Per-verifier claims are exactly + as strong as these tests. diff --git a/packages/flow/claims/halt-teach-promote.yaml b/packages/flow/claims/halt-teach-promote.yaml new file mode 100644 index 0000000000..6721fa399d --- /dev/null +++ b/packages/flow/claims/halt-teach-promote.yaml @@ -0,0 +1,27 @@ +id: halt-teach-promote +claim: >- + A halt is learnable: halt -> teach a correction -> promote a guarded + branch, refusing underdetermined fixes. +surfaces: [README.md, docs] +tier: supported +evidence: + - path: tests/test_halt_learn_loop.py + proves: >- + A surprise modal halts and emits a learnable trace; teaching promotes + a guarded dismiss branch that replays without regression; an + underdetermined correction is refused. + - path: tests/test_teach_cli.py + proves: >- + The `teach` CLI resolves a halt via a correction spec or a recording, + refuses an underdetermined fix, and errors on a non-halted run. + - path: tests/test_teach_placement.py + proves: >- + A recorded fix's own target is carried into the taught bundle; the + fix is placed before a step that never acted and after a step that + acted (retried, or checked against its expected screen); retrying a + step that can write, and a fix with no recorded target, are refused. +caveats: + - >- + Promotion is governed by a regression gate that blocks identity- + weakening corrections; the loop refuses to guess when the fix is + underdetermined. diff --git a/packages/flow/claims/identifier-crop-compile-emission.yaml b/packages/flow/claims/identifier-crop-compile-emission.yaml new file mode 100644 index 0000000000..aedd566556 --- /dev/null +++ b/packages/flow/claims/identifier-crop-compile-emission.yaml @@ -0,0 +1,37 @@ +id: identifier-crop-compile-emission +claim: >- + The compiler emits a pixel identifier crop (anchor.identifier_crop) for + identity-armed steps without structured identity — and for any step whose + identifying region is marked at record time (--identifier) — so the + pixel-compare identity tier arms on remote-display/pixel replays; every + crop-less identity-applicable step records an explicit degrade reason, + and lint surfaces per-bundle pixel-identity coverage. +surfaces: [docs] +tier: supported +evidence: + - path: tests/test_compile_identifier_crop.py + proves: >- + Synthetic-fixture proof of the emission mechanism: a pixel-only + recording compiles WITH a crop under templates/identifiers/ (sealed + + manifest-hashed like every image crop); a structured recording + writes NO identity pixels and records why; explicit --identifier + markings (event rect / meta region) win; encrypted save seals the + crop and the sealed crop still reaches the tier; the compiled crop + drives a wrong-MRN MISMATCH through the real replayer ladder while + pixel VERIFY stays hard-gated off (zero-false-accept preserved). + - path: tests/test_identifier_crop_lint.py + proves: >- + Lint coverage surfacing: identity-armed steps with vs without crops + (missing_identifier_crop findings carry the compiler's degrade + reason; warn on band-only identity, info under structured identity). +caveats: + - >- + Mechanism proven on synthetic fixtures and the bundled demo app only — + this does NOT re-qualify any desktop/remote-display substrate, and the + pixel tier remains MISMATCH-or-ABSTAIN (it can add a safe halt on a + wrong identifier, never authorize a match; PIXEL_VERIFY_ENABLED stays + off pending a jitter-robust distance). + - >- + Automatic emission requires an OCR-readable identity band at compile + time; icon-only or unreadable rows still compile crop-less (with the + recorded reason) and fall back to the OCR band tier at replay. diff --git a/packages/flow/claims/identity-gate-halt-armed.yaml b/packages/flow/claims/identity-gate-halt-armed.yaml new file mode 100644 index 0000000000..1ded4c0bce --- /dev/null +++ b/packages/flow/claims/identity-gate-halt-armed.yaml @@ -0,0 +1,34 @@ +id: identity-gate-halt-armed +claim: >- + On ambiguity the runtime halts instead of guessing, and an identity gate + refuses a wrong-entity (wrong-patient) click — on ARMED steps only. +surfaces: [README.md, docs] +tier: supported +evidence: + - path: tests/test_identity.py + proves: >- + Wrong-entity / near-name sibling / generic-band / param-in-band + probes: the identity check refuses to verify a mismatched target and + never arms on non-discriminative bands. + - path: tests/test_disambiguation.py + proves: >- + Underdetermined targets surface as explicit disambiguation rather + than a guessed click. + - path: tests/test_identity_fuzz.py + proves: >- + Public property-based checks preserve the never-false-accept + invariant for collapsible identifiers while requiring clean + identifiers to remain verifiable. + - path: tests/test_identity_ladder.py + proves: >- + The identity resolution ladder (structural/template/OCR) escalation. +caveats: + - >- + Identity verification covers ONLY armed steps. Real bundles arm a + MINORITY of clicks (4 of 12 on a recent live OpenEMR bundle); an + UNARMED click proceeds with no identity check whatsoever. Coverage is + an auditable per-step metric, but disclosure does not close the gap. + `scaffold-verifier --bundle` reports coverage before and after + evidence from the recording's DOM / accessibility text at each + unarmed click; it proposes only evidence the runtime checks on that + surface, and a person applies it. diff --git a/packages/flow/claims/linux-native-validating.yaml b/packages/flow/claims/linux-native-validating.yaml new file mode 100644 index 0000000000..80b787f921 --- /dev/null +++ b/packages/flow/claims/linux-native-validating.yaml @@ -0,0 +1,40 @@ +id: linux-native-validating +claim: >- + Native Linux uses an exact-window AT-SPI backend with complete candidate + enumeration, native action delivery, and fail-closed ambiguity, staleness, + and Wayland portal boundaries. +surfaces: [README.md, docs] +tier: validating +evidence: + - path: tests/test_linux_backend.py + proves: >- + Default CI covers exact app/window binding, bounded candidate + enumeration, ambiguity and stale-target refusal, native invoke/focus + and editable-text delivery, window-scoped capture, physical-input + opt-in, and Wayland portal refusal through an injected Linux client. + - path: tests/test_linux_qualification.py + proves: >- + Default CI enforces the live qualification's fixed three-trial + matrix, independent exact-file and absence oracles, and separate + silent-incorrect-success, over-halt, and refusal-failure accounting. + - path: scripts/qualify_linux_atspi.py + kind: benchmark + proves: >- + The required linux-atspi-x11 job drives the real GTK3 fixture through + AT-SPI on an isolated Xvfb display and session D-Bus, emitting a + per-trial JSON evidence artifact. + - path: docs/desktop/LINUX_NATIVE.md + kind: doc + proves: >- + The operator contract, X11 and Wayland boundaries, configuration, + delivery-only receipt semantics, and required real GTK/AT-SPI CI + qualification contract. +caveats: + - >- + Required CI establishes live scoped acceptance only for the in-tree + GTK3 application on its isolated Xvfb image. Each third-party + application and environment requires its own qualification. + - >- + X11 is the initial built-in live transport. Wayland requires a real + operator-approved XDG RemoteDesktop/ScreenCast portal session; the + built-in client currently refuses rather than pretending a grant exists. diff --git a/packages/flow/claims/lookup-teaches-the-check.yaml b/packages/flow/claims/lookup-teaches-the-check.yaml new file mode 100644 index 0000000000..6fce5ef0e1 --- /dev/null +++ b/packages/flow/claims/lookup-teaches-the-check.yaml @@ -0,0 +1,25 @@ +id: lookup-teaches-the-check +claim: >- + When a recording shows the person or the agent look the record up after + saving, Flow proposes that look-up as the record check with no marking + or configuration: a same-session check and, for desktop, RDP and Citrix + recordings, a separate-session desktop_readback. Every proposal waits + for a person. +surfaces: [docs] +tier: supported +evidence: + - path: tests/test_lookup_detect.py + proves: >- + On a synthetic recording of the RDP kiosk: finds the save by its + OCR label, the search, and only the values the look-up brought onto + the screen (not the saved form still showing the same text); + proposes nothing without a look-up; the proposed desktop_readback, + with only its address filled in, confirms the booking through real + OCR from separate sessions; check accept writes check.json and + never overwrites one; record --verify needs no file and ends with + the look-up prompt when none is found. +caveats: + - >- + Measured on one synthetic kiosk recording. The detector needs a save + button with a save word, a typed and submitted search, and the saved + values readable by OCR on the last frame. diff --git a/packages/flow/claims/macos-native-validating.yaml b/packages/flow/claims/macos-native-validating.yaml new file mode 100644 index 0000000000..a50f94e384 --- /dev/null +++ b/packages/flow/claims/macos-native-validating.yaml @@ -0,0 +1,28 @@ +id: macos-native-validating +claim: >- + Native macOS has scoped acceptance for exact-window-bound text delivery, + independent file effects, and ambiguity refusal on a fixed TextEdit task. +surfaces: [README.md, docs, website] +tier: validating +reproducibility: field +evidence: + - path: tests/test_macos_backend.py + proves: >- + CI covers unique-window binding, foreground/focus proof, exact-element + text delivery, and refusal before physical input when proof fails. + - path: tests/test_macos_qualification.py + proves: >- + CI validates the qualification oracle, failure taxonomy, evidence + hashes, cleanup adjudication, and ambiguity-refusal accounting. + - path: benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json + kind: benchmark + proves: >- + Candidate b1b61a5 completed 3/3 exact-byte TextEdit effects and + refused two ambiguous windows without modifying either file. +caveats: + - >- + Acceptance covers TextEdit on one macOS 15.7.3 Apple Silicon host and + active user session; each customer application is qualified separately. + - >- + The original counted report remains failed. The hash-bound adjudication + accepts only its independently confirmed action/effect/refusal evidence. diff --git a/packages/flow/claims/mockmed-benchmark-ci-reproducible.yaml b/packages/flow/claims/mockmed-benchmark-ci-reproducible.yaml new file mode 100644 index 0000000000..5df60888e4 --- /dev/null +++ b/packages/flow/claims/mockmed-benchmark-ci-reproducible.yaml @@ -0,0 +1,28 @@ +id: mockmed-benchmark-ci-reproducible +claim: >- + The MockMed benchmark is CI-reproducible: compiled replay finishes ~4.9s + p50 with zero model calls versus ~37.5s p50 (~$0.27/run) for the agent. + Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build; not + re-measured on a later release. +surfaces: [README.md, docs] +tier: supported +evidence: + - path: tests/test_mockmed.py + proves: >- + The MockMed app + drift screens are deterministic and reachable, the + substrate the benchmark replays against. + - path: tests/test_benchmark.py + proves: >- + The benchmark harness / report accounting that produces the numbers. + - path: benchmark/BENCHMARK.md + kind: benchmark + proves: >- + Full numbers, methodology, and caveats for the CI-reproducible + MockMed comparison (dated run artifact). +caveats: + - >- + The published latency/cost figures come from a dated run artifact + measured on Flow 0.1.0 (pre-v0.2.0 source checkout; exact runtime HEAD + not retained) on 2026-07-08; the app is intentionally simple, so success rate (100/100 + vs 20/20) is not the story — the standing cost/latency delta is. Agent + cost is a list-price estimate. diff --git a/packages/flow/claims/openemr-field-benchmark.yaml b/packages/flow/claims/openemr-field-benchmark.yaml new file mode 100644 index 0000000000..f5fed0d8c6 --- /dev/null +++ b/packages/flow/claims/openemr-field-benchmark.yaml @@ -0,0 +1,39 @@ +id: openemr-field-benchmark +claim: >- + On the real third-party OpenEMR public demo, compiled replay went 19/20 + versus 10/10 for a computer-use agent, faster and with zero model calls. + Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build. +surfaces: [README.md, docs, website] +tier: validating +reproducibility: field +evidence: + - path: tests/test_openemr_benchmark.py + proves: >- + The CI-reproducible half: the saved-message-row verifier, its + unsaved-entry-form rejection, and the intent-not-coordinates task + prompt that both benchmark arms use. + - path: tests/test_openemr_retained_finals.py + kind: test + proves: >- + When the local-only retained final frames are mounted, the guard + replays all 30 with the current verifier and requires 19/20 compiled, + 10/10 agent, and exactly one corrected legacy false success. + - path: benchmark/openemr/BENCHMARK.md + kind: benchmark + proves: >- + The corrected field-test numbers, saved-row screen-oracle contract, + methodology, and cost caps for the 20-vs-10 head-to-head run. + - path: docs/showcase-openemr/FINDINGS.md + kind: doc + proves: >- + The correctness-only field findings (fresh browsers, zero model + calls, closed-loop scrolling). +caveats: + - >- + The historical result uses OCR evidence from a visible saved message + row. It does not use an out-of-band OpenEMR system-of-record read. + - >- + FIELD TEST, NOT CI-reproducible: the head-to-head ran against a SHARED + public demo that other users mutate and that resets daily; the sample + is small (10 agent runs). Only the verifier + task-prompt units run in + CI. `reproducibility: field` forbids ever labeling this `supported`. diff --git a/packages/flow/claims/qualified-remote-decision-v2-supported.yaml b/packages/flow/claims/qualified-remote-decision-v2-supported.yaml new file mode 100644 index 0000000000..7ce56ec538 --- /dev/null +++ b/packages/flow/claims/qualified-remote-decision-v2-supported.yaml @@ -0,0 +1,32 @@ +id: qualified-remote-decision-v2-supported +claim: >- + A negotiated V2 attended task binds optional reviewed entity wording to + the exact qualification, bundle, step, policy, and pause authority. An + unqualified or unrecognized entity class stays local and the remote task + uses the signed neutral record or item fallback. +surfaces: [docs] +tier: supported +evidence: + - path: tests/test_attended_actions.py + proves: >- + Required CI covers the V1-compatible and V2 signed envelopes, + provenance binding, remote-safe entity vocabulary, idempotent + decisions, and fresh revalidation before resumed actuation. + - path: tests/test_qualification_project.py + proves: >- + Required CI requires the current exact qualification contract before + the V2 producer can emit its reviewed presentation metadata. + - path: docs/DECISION_DELIVERY.md + kind: doc + proves: >- + The delivery contract defines explicit V2 negotiation, neutral V1 + fallback, and the local boundary for actual entity identifiers. +caveats: + - >- + V2 requires openadapt-types 0.10.x and explicit peer negotiation. The + dependency does not upgrade a V1 consumer, and the byte-compatible V1 + path remains available. + - >- + The entity class is presentation metadata only. Actual record identity + remains inside the customer-controlled runner and is revalidated before + any resumed action. diff --git a/packages/flow/claims/rdp-validating.yaml b/packages/flow/claims/rdp-validating.yaml new file mode 100644 index 0000000000..2561175552 --- /dev/null +++ b/packages/flow/claims/rdp-validating.yaml @@ -0,0 +1,42 @@ +id: rdp-validating +claim: >- + RDP has scoped acceptance for real-network framebuffer decode and input + delivery into Windows 11 with independent exact file-effect verification. +surfaces: [README.md, docs, website] +tier: validating +reproducibility: field +evidence: + - path: tests/e2e/test_parallels_rdp_e2e.py + proves: >- + Opt-in snapshot-safe real RDP qualification harness with exactly three + trials, independent guest-tools oracle, failure taxonomy, and cleanup. + - path: tests/test_rdp_backend.py + proves: >- + CI covers the backend/transport contract, framebuffer conversion, + pointer and keyboard delivery, resize rebaseline between actions, + mid-lease geometry refusal, pre-delivery horizontal-scroll refusal, + typed uncertain transport failures, and record-compile-replay + conformance. + - path: tests/test_rdp_multiapp_campaign_contract.py + proves: >- + Required CI covers the bounded 27-trial FreeRDP campaign contract, + independent SQLite, CSV, and Maildir oracles, fail-closed visual + action preflight, uncertain-delivery handling, and result accounting. + - path: benchmark/rdp_multiapp/README.md + kind: doc + proves: >- + The public synthetic multi-window campaign defines the workflow, + faults, independent persisted surfaces, and acceptance denominator. + - path: benchmark/rdp/results_82a658a_20260718.sanitized.json + kind: benchmark + proves: >- + Candidate 82a658a passed 3/3 at 51.845, 10.467, and 7.477 seconds, + with zero failures, silent incorrect successes, over-halts, or model calls. +caveats: + - >- + Acceptance covers the named 1280x800 Windows Run/file task and exact VM + environment, not arbitrary applications, identity policies, or Citrix. + - >- + The multi-window campaign uses deterministic synthetic applications. + It exercises the real FreeRDP pixel and input path but does not qualify + a named customer application or environment. diff --git a/packages/flow/claims/record-check-from-app-reads.yaml b/packages/flow/claims/record-check-from-app-reads.yaml new file mode 100644 index 0000000000..84c521eb56 --- /dev/null +++ b/packages/flow/claims/record-check-from-app-reads.yaml @@ -0,0 +1,64 @@ +id: record-check-from-app-reads +claim: >- + scaffold-verifier builds a record check from the reads the app made + after the save (the recording's network capture, a SQLite database read + path, or a reviewed verifier section), binds the recorded values to run + parameters, guards every other table when a database path is given (no + row added, changed or removed), and tests the check against injected + bad writes before anyone reviews it. A check that misses one is written as a draft + with the misses listed. Every effect stays unconfirmed until a person + removes the flag. +surfaces: [docs] +tier: supported +evidence: + - path: tests/test_record_check_synthesis.py + node: test_database_read_path_covers_every_table_and_passes_the_suite + proves: >- + On the benchmark/effect_e2e record service, a check built from a + database read path catches every injected bad write end to end + through the real replayer (including the stray billing write) and + passes the clean save. + - path: tests/test_record_check_synthesis.py + node: test_one_rest_read_misses_the_billing_write_and_stays_a_draft + proves: >- + A check built from one REST read misses the stray billing write, + both in the recorded-state fault test and end to end, and is + written as a draft with that miss listed. + - path: tests/test_record_check_synthesis.py + node: test_mockmed_needs_a_declared_complete_read + proves: >- + On the MockMed --break-it fault server, the check built from the + app's /api/db read catches every fault end to end once a person + declares the read complete, and stays a draft until then. + - path: tests/test_record_check_synthesis.py + node: test_openemr_fhir_check_refutes_store_level_faults + proves: >- + On the OpenEMR-shaped FHIR R4 fake, the check found from the + Observation search refutes partial, duplicate, phantom, + wrong-patient and lost-update faults and confirms the clean save. + - path: tests/test_record_check_synthesis.py + node: test_guards_catch_a_changed_or_deleted_row_through_the_real_read + proves: >- + The generated SQL reads, run against a real SQLite file, refute a + save that also changed or deleted a row in another table. + - path: tests/test_record_check_synthesis.py + node: test_verify_run_refuses_until_a_person_removes_the_flags + proves: >- + verify-run refuses the proposed check until every + needs_operator_confirmation line is removed. + - path: docs/EFFECT_KIT.md + proves: >- + The operator guide: inputs, outputs, the fault classes, and what + the proof does not cover. +caveats: + - >- + Proven on synthetic fixtures only (MockMed, the effect_e2e SQLite + record service, an OpenEMR-shaped FHIR fake). A check built from API + reads alone cannot see writes to tables it does not read, so it stays + a draft unless a database path covers them or a person declares the + read complete. The fault classes are the effect_e2e taxonomy, not a + measured field incident rate. + - >- + Saves that update an existing record are not handled yet: the check + expects one new record. The read's credential is the operator's job; + the recording's reads used the browser's sign-in. diff --git a/packages/flow/claims/reviewed-judgment-cases-supported.yaml b/packages/flow/claims/reviewed-judgment-cases-supported.yaml new file mode 100644 index 0000000000..52fee7b945 --- /dev/null +++ b/packages/flow/claims/reviewed-judgment-cases-supported.yaml @@ -0,0 +1,36 @@ +id: reviewed-judgment-cases-supported +claim: >- + A qualification project can bind typed local facts, evidence hashes, + reviewer provenance, and the exact decision contract to reviewed examples + and counterfactuals. It can retain permanent human authority, record a + reviewed automatic-rule candidate, or refuse certification until more + evidence exists, without converting one historical choice into policy. +surfaces: [docs] +tier: supported +evidence: + - path: tests/test_judgment_cases.py + proves: >- + Required CI covers closed fact schemas, exact workflow and decision + bindings, local-only evidence references, conflict refusal, + reciprocal contrast coverage for automatic-rule candidates, retained + human authority, unresolved-evidence refusal, and the invariant that + case evaluation never edits or synthesizes the executable rule. + - path: tests/test_qualification_project.py + proves: >- + Required CI binds the reviewed local evidence bytes and review note + into certification, reproduces that exact contract when a qualified + workflow is saved, and refuses changed case or evidence digests. + - path: docs/BUSINESS_DECISIONS.md + kind: doc + proves: >- + The public contract separates qualification-time judgment capture + from one live runtime answer and describes the scriptable authoring + and judgment-case interfaces. +caveats: + - >- + An automatic-rule case names only a reviewed rule identifier and finite + option. Flow does not infer or generate executable policy from the case; + the rule must be authored and qualified through the normal program path. + - >- + A retained human-node case preserves runtime human authority. A + more-evidence-required case refuses certification instead of guessing. diff --git a/packages/flow/claims/substrate-runtime-validation-supported.yaml b/packages/flow/claims/substrate-runtime-validation-supported.yaml new file mode 100644 index 0000000000..7a7103b3f6 --- /dev/null +++ b/packages/flow/claims/substrate-runtime-validation-supported.yaml @@ -0,0 +1,36 @@ +id: substrate-runtime-validation-supported +claim: >- + Runtime-validation v3 binds Standard and Regulated hosted activation to + the exact governed authorization template reproduced from the sealed + qualification. It also binds the successful run's resolved target kind + (`web|windows|macos|linux|rdp|citrix`), artifact, compiler, parameter + schema, strict lint, policy, risk, report, and opaque environment. Web + retains its exact HTTPS/host boundary. Native and remote execution emits + no app, window, host, readiness, or backend-hint values to Cloud. Local + verification retains signed v1 and v2 compatibility. +surfaces: [README.md, docs, website] +tier: supported +evidence: + - path: tests/test_runtime_validation.py + proves: >- + Required CI exercises all six target kinds, validates v3 against its + closed JSON Schema, refuses a Standard or Regulated activation without + an exact template, binds the template SHA to the HMAC, preserves web + URL/host checks, keeps native/remote execution empty, verifies the + canonical HMAC vector, and retains signed v1/v2 compatibility. + - path: tests/test_cli_new_commands.py + proves: >- + Required CI carries the resolved web, Windows, and Citrix backend + token through durable resume into the new run report rather than + trusting an upload-time relabel. + - path: schemas/runtime-validation-attestation-v3.json + kind: doc + proves: >- + The public closed envelope requires target_kind and the governed + authorization template SHA, and conditionally permits browser + execution fields only for web. +caveats: + - >- + The HMAC proves operator-token possession and envelope integrity; it is + not independent observation of the local replay or certification of an + arbitrary target application. diff --git a/packages/flow/claims/typed-business-decisions-supported.yaml b/packages/flow/claims/typed-business-decisions-supported.yaml new file mode 100644 index 0000000000..33f56e53c0 --- /dev/null +++ b/packages/flow/claims/typed-business-decisions-supported.yaml @@ -0,0 +1,33 @@ +id: typed-business-decisions-supported +claim: >- + A qualification client can add or update a typed finite business-policy + decision without editing an internal manifest. The compiled workflow can + then pause at that decision, accept one authorized and attributed choice, + retain a signed durable receipt, revalidate the live application, and + continue only through the certified successor branch. +surfaces: [docs] +tier: supported +evidence: + - path: tests/test_business_decision.py + proves: >- + Required CI covers typed qualification authoring and replacement, + qualification-revision and certification invalidation, ambiguous + insertion refusal, the closed runtime decision contract, role and + evidence checks, expiry, renewal, idempotency, crash recovery, signed + branch authority, scoped outputs, fresh live-state revalidation, + normal downstream action gates, and repair-bypass refusal. + - path: docs/BUSINESS_DECISIONS.md + kind: doc + proves: >- + The public engine contract separates a declared business choice from + an operational halt and defines the Desktop, Cloud, and customer-local + integration boundary. +caveats: + - >- + The engine validates a principal and its roles; it does not authenticate + a self-asserted user. Desktop, Cloud, or a customer-local identity route + must supply the authenticated principal. + - >- + A human choice is control authority only. It cannot satisfy entity + identity, a postcondition, or effect verification, and it cannot turn a + screen statement or a human assertion into VERIFIED. diff --git a/packages/flow/claims/ui-readback-separate-session.yaml b/packages/flow/claims/ui-readback-separate-session.yaml new file mode 100644 index 0000000000..eeef683d55 --- /dev/null +++ b/packages/flow/claims/ui-readback-separate-session.yaml @@ -0,0 +1,44 @@ +id: ui-readback-separate-session +claim: >- + With no API or database access, a save can be checked through the + application's own record page: a separate browser with a new, empty + context and its own sign-in opens the record by identifier, confirms the + page shows that identifier, reads the saved fields from the page + structure, and judges them with the shared effect judge. After sign-in + the session refuses every request that is not a read. The check + declares tier 2 (a separate session) and is never labeled a + system-of-record read. +surfaces: [README.md, docs] +tier: supported +evidence: + - path: tests/test_ui_readback_verifier.py + proves: >- + The verdict rules without a browser: confirms, refutes partial, + duplicate and lost-update saves, never claims absence as proof that + nothing was saved, halts on another record's page, a refused request, + a changed layout, a shortened value, an unfresh session or a failed + sign-in, declares tier 2, and keeps every existing verifier identity + digest unchanged. + - path: tests/test_ui_readback_browser.py + proves: >- + In a real browser against MockMed's server-rendered record pages: + its own sign-in even when another session is signed in, refuted + wrong saves, fetch/beacon/XHR/form posts refused with none reaching + the server, display changes that stop rather than pass, and tier-2 + evidence through the real replayer. + - path: tests/test_ui_readback_benchmark.py + proves: >- + A subset of the measurement: the same-screen check misses accepted + wrong saves, the UI read-back catches partial, wrong-record and + lost-update saves, and the measured blind spots stay blind. + - path: benchmark/ui_readback + proves: >- + The full measurement next to a same-screen check and an API read, + on the GUI replay and API-write fault lists plus display probes. +caveats: + - >- + Measured on synthetic fixtures (MockMed and the effect_e2e record + service) whose record pages were written for these tests, not on a + production application's record pages. The check sees only what a + record page shows and is only as independent as the page's own read + path. diff --git a/packages/flow/claims/web-supported.yaml b/packages/flow/claims/web-supported.yaml new file mode 100644 index 0000000000..97dd578310 --- /dev/null +++ b/packages/flow/claims/web-supported.yaml @@ -0,0 +1,167 @@ +id: web-supported +claim: >- + The Playwright browser path records a GUI workflow and replays it + deterministically and locally. Required CI exercises the recorder, + compiler, and replay contract. +surfaces: [README.md, website, docs] +tier: supported +evidence: + - path: tests/e2e/test_record_compile_replay.py + proves: >- + Records the MockMed browser demo once, compiles it, and replays it + under baseline + theme/move/rename drift and parameter substitution + through the headless-browser Backend. + - path: tests/test_mockmed.py + proves: >- + The reference browser demo app and its drift screens render + deterministically (no CSS transitions), so replay is repeatable. + - path: tests/test_replayer.py + proves: >- + The deterministic replayer resolves steps, substitutes parameters, + enforces postconditions and the risk gate — no model in the loop. + - path: tests/test_browser_attach.py + node: test_live_cdp_attach_records_compiles_and_leaves_browser_running_three_trials + proves: >- + Three real Chromium CDP-attach trials record and compile the same + synthetic workflow, exclude password values before persistence, + preserve CSS-pixel frame/coordinate alignment, and detach without + closing the external browser. The same live campaign covers same-task + replacement, declared open and closed shadow hosts, contenteditable + click metadata, and same-document URL/title reflection through + history.replaceState. A live case records and + compiles actions across viewport and monitor-scale changes. It binds + each event to its exact frame dimensions. A separate live case + refuses an action that overlaps the transition. Unit cases refuse + remote endpoints, cross-origin selectors and navigation, iframe + events, invalid viewport evidence, and ambiguous same-origin tabs. + - path: tests/test_browser_attach.py + node: test_launched_recording_withholds_a_later_document_url_after_a_get_submit + proves: >- + A live Chromium recording submits a same-origin GET form. The + document that submit reaches is a fresh closure that holds no value + to match against, so Flow withholds its URL and its title and says + so, and the recorded surface is stamped before publish. + - path: tests/test_browser_attach.py + node: test_launched_recording_withholds_a_redirect_that_puts_the_value_in_a_path + proves: >- + A server that answers a GET submit with a 302 to `/results/` + puts a declared secret in a path segment, where no parameter name + identifies it. Flow withholds the whole URL for every document after + the one that first held the value, so the literal never reaches + events.jsonl. + - path: tests/test_browser_attach.py + node: test_page_closure_keeps_url_and_identity_evidence_for_a_lowercase_secret + proves: >- + A lowercase secret typed one character at a time into a page whose + URL, title, and button ID share those characters leaves the URL, the + title, the DOM selector, and the accessible name exact. + - path: tests/test_browser_attach.py + node: test_page_closure_keeps_all_evidence_for_a_password_starting_with_a_word + proves: >- + A password that begins with a common English word leaves that word + exact in the page URL, the page title, the clicked row's identity + characters, the accessible name, and an unrelated button ID. Matching + uses only the value the field holds at that moment, so an + intermediate keystroke prefix never becomes a matching value. + - path: tests/test_browser_attach.py + node: test_page_closure_withholds_identity_that_holds_a_declared_value + proves: >- + Identity evidence that holds a declared value is WITHHELD with a + stated reason, never rewritten. Replay compares identity evidence + against the live page, so a rewritten copy would compare against + characters the page never showed, invisibly. No placeholder string + appears anywhere in the recorded evidence. + - path: tests/test_browser_attach.py + node: test_page_closure_withholds_a_stale_reflection_from_a_swapping_input + proves: >- + A page that replaces its input element on every keystroke and writes + the value into its URL and title can end up showing a version the + field no longer holds. Flow withholds that reflected text whole -- + an origin-only URL and an empty title -- instead of matching it + against the current value, and keeps the clicked element's identity + evidence exact. + - path: tests/test_browser_attach.py + node: test_page_closure_still_reports_a_same_document_route_after_the_fix + proves: >- + A single-page application route change through history.pushState does + not build a new document, so the closure that held the declared value + is the one being sampled and its URL is still reported exactly. The + cross-document rule that withholds a later document's URL therefore + does not cost this evidence. + - path: tests/test_browser_attach.py + node: test_page_closure_withholds_a_title_a_consumed_field_produced + proves: >- + A scanner input that writes the badge into the page URL and title and + then clears its own field holds nothing at any moment Flow samples. + Flow arms the document's secret boundary from the input event itself, + so both channels are checked and both are withheld. + - path: tests/test_browser_attach.py + node: test_page_closure_keeps_a_consumed_value_across_a_second_entry + proves: >- + A second scan into the same cleared field does not displace the first + badge while the first badge is still shown in the URL. A value the + next one does not continue was taken by the page, not edited away by + the operator, so it is promoted into the withhold-only set. + - path: tests/test_browser_attach.py + node: test_page_closure_keeps_a_consumed_value_while_another_field_is_live + proves: >- + A second declared field holding a value does not re-expose the first + field's consumed value. The last-value test is per element, so the + same URL is withheld before and after the second field is filled. + - path: tests/test_browser_attach.py + node: test_page_closure_withholds_a_selector_built_from_an_inbound_value + proves: >- + A DOM selector is identity evidence and uses the same value set as + the accessible name and the clicked-row identity. An element id built + from a value carried in an inbound declared parameter is withheld with + a reason, not emitted verbatim. + - path: tests/test_browser_attach.py + node: test_page_closure_drops_only_the_unproven_parameter_value + proves: >- + A query parameter whose value Flow cannot prove predates the moment + the document first held a declared value loses only ITS value. Every + parameter name survives, the path stays exact, and the drop is + recorded with its reason. + - path: tests/test_browser_attach.py + node: test_page_closure_withholds_a_url_that_holds_the_value_in_its_path + proves: >- + A value that no parameter name identifies -- here written into a path + segment -- is caught by detection rather than structure: Flow + withholds the whole URL, marks it, and warns the operator that the + application placed a declared secret into its own URL. + - path: tests/test_browser_attach.py + node: test_page_closure_withholds_identity_after_the_field_is_removed + proves: >- + A single-page wizard that removes its declared field and renders the + value into a summary row cannot leak it into the clicked row's + identity: the value the field held at a commit point is retained for + the single purpose of WITHHOLDING identity text, never to rewrite it + and never for the URL or the title. + - path: tests/test_browser_attach.py + node: test_page_closure_marks_a_withheld_secret_field_name + proves: >- + Flow never reads the visible text of a bound secret field, because + that text is the value. The resulting missing accessible name is + reported as WITHHELD with a reason and counted, never left as a + silent null, while a control field beside it returns its name. + - path: tests/test_browser_attach.py + node: test_page_closure_emits_no_reflected_text_from_the_capture_phase + proves: >- + No browser event carries a URL or a title. The in-page listeners run + in the capture phase, before the page's own handlers, so anything + they read describes the state before the action. Flow samples + reflected evidence from Python at the settled boundary instead. +caveats: + - >- + `supported` names the registry's required-CI evidence tier. It is not a + product state or a general application claim. Production requires active + release admissions for all seven product targets. A Production run also + needs an active workflow admission for the exact sealed bundle. + - >- + The full record->compile->replay browser suite runs in the required + e2e-browser PR gate and repeats in the weekly compatibility matrix. + - >- + Existing-session attachment is Chromium-only and loopback-only. It + requires a dedicated browser process with remote debugging. The + Playwright-native browser path owns this claim. Capture extension code + is outside its evidence scope. diff --git a/packages/flow/claims/win32-window-replay-roadmap.yaml b/packages/flow/claims/win32-window-replay-roadmap.yaml new file mode 100644 index 0000000000..a10a3b7581 --- /dev/null +++ b/packages/flow/claims/win32-window-replay-roadmap.yaml @@ -0,0 +1,29 @@ +id: win32-window-replay-roadmap +claim: >- + Windows hosts can replay window-scoped remote-display workflows (the + Citrix/RDP client window on a Windows endpoint) through the same + governed pixel contract already proven on macOS hosts. +surfaces: [docs] +tier: roadmap +evidence: + - path: tests/test_win32_window_client.py + proves: >- + MOCK-ONLY conformance: the win32 WindowClient implements the + remote-display WindowClient seam (exact process/title/class + selection with ambiguity halt, client-area coordinate mapping under + per-monitor DPI awareness, PrintWindow-then-BitBlt capture fallback, + focus-verification refusal, and the UIPI elevation guard) against a + scripted Win32 API — never against a real Windows host. + - path: docs/desktop/CITRIX_PIXEL.md + kind: doc + proves: >- + The remote-display contract the client implements and the evidence + ladder for qualifying it (Parallels/RDP client-window analog first, + then a counted live Citrix host run). +caveats: + - >- + NOT qualified: no counted end-to-end batch on a real Windows host or + a real client window exists. The contract tests mock every Win32 + call; real DPI virtualization, UIPI, foreground-arbitration, and + PrintWindow rendering behavior remain unproven until the + Parallels/real-Windows validation procedure is executed and counted. diff --git a/packages/flow/claims/windows-desktop-validating.yaml b/packages/flow/claims/windows-desktop-validating.yaml new file mode 100644 index 0000000000..959195c55e --- /dev/null +++ b/packages/flow/claims/windows-desktop-validating.yaml @@ -0,0 +1,36 @@ +id: windows-desktop-validating +claim: >- + Windows UIA has scoped acceptance: the deterministic structural rung + delivered native actions in a fixed WinForms workflow with independent + effects and fail-closed stale/ambiguity refusal. +surfaces: [README.md, docs, website] +tier: validating +evidence: + - path: tests/e2e/test_parallels_desktop_e2e.py + proves: >- + OPT-IN live proof on a real Win11-ARM VM: record->compile->replay + through WindowsBackend with the structural rung resolving every click + by AutomationId (armed_coverage == 1.0). + - path: tests/test_windows_backend.py + proves: >- + The 4-method Backend protocol on Windows against a MOCKED WAA server + (runs in CI post-merge; proves the wire, not a live desktop). + - path: benchmark/structural_action/STRUCTURAL_ACTION.md + kind: benchmark + proves: >- + Desktop drift benchmark: the structural rung resolved 21/21 targets + where visual replay alone managed 6/21. + - path: benchmark/windows_uia/results.json + kind: benchmark + proves: >- + Accepted candidate 20260717-candidate-56759c8-v2: 3/3 exact task and + SQLite effects, 12 UIA receipts, and 3/3 stale plus 3/3 ambiguity + refusals with zero silent incorrect success, over-halt, or model calls. +caveats: + - >- + The live desktop e2e is OPT-IN and infra-gated (needs a Parallels + Win11-ARM VM; `OAFLOW_PARALLELS_E2E=1`); it never runs on default CI. + Only the mocked backend protocol runs in CI. + - >- + Acceptance covers the named in-tree workflow and exact Windows VM. + Third-party applications require workflow-specific qualification. diff --git a/packages/flow/docs/CLAIMS_AND_QUALIFICATION.md b/packages/flow/docs/CLAIMS_AND_QUALIFICATION.md index 8b585f8571..b62fa1126d 100644 --- a/packages/flow/docs/CLAIMS_AND_QUALIFICATION.md +++ b/packages/flow/docs/CLAIMS_AND_QUALIFICATION.md @@ -40,7 +40,7 @@ boundaries, and unmet controls. Product claims are enforced by CI. Every registered claim is tiered and mapped to the specific tests and benchmark artifacts that back it in -[`../claims.yaml`](../claims.yaml). CI runs `scripts/validate_claims.py`, which +[`../claims/`](../claims/) (one file per claim). CI runs `scripts/validate_claims.py`, which **fails the build whenever a claim's tier outranks its strongest evidence** and regenerates [`VERIFICATION.md`](VERIFICATION.md), the claim-by-claim verification report, from the registry, so the adjectives in the README cannot diff --git a/packages/flow/docs/PRODUCTION.md b/packages/flow/docs/PRODUCTION.md index 2a8dd0ef76..20039b1cd3 100644 --- a/packages/flow/docs/PRODUCTION.md +++ b/packages/flow/docs/PRODUCTION.md @@ -206,7 +206,7 @@ environment, or verification contract. The current admission state is machine-readable at [openadapt.ai/production-lifecycle.json](https://openadapt.ai/production-lifecycle.json). -The registry in [`claims.yaml`](../claims.yaml) assigns each registered public +The registry in [`claims/`](../claims/) assigns each registered public capability claim a tier and names the tests or benchmark artifacts behind it. The build fails when a registered claim outranks its evidence. See [CLAIMS_AND_QUALIFICATION.md](CLAIMS_AND_QUALIFICATION.md) and the generated diff --git a/packages/flow/docs/PRODUCT_STATUS.md b/packages/flow/docs/PRODUCT_STATUS.md index 84703f7195..5ac482408e 100644 --- a/packages/flow/docs/PRODUCT_STATUS.md +++ b/packages/flow/docs/PRODUCT_STATUS.md @@ -2,7 +2,7 @@ This is the authoritative map of the product surfaces, their accepted evidence, and the qualification boundary for a customer workflow. -The machine-readable claim-to-evidence registry is [`claims.yaml`](../claims.yaml), +The machine-readable claim-to-evidence registry is [`claims/`](../claims/), and its generated view is [`VERIFICATION.md`](VERIFICATION.md). ## Product release state @@ -85,7 +85,7 @@ product lifecycle state. ## Evidence policy -- CI-backed capability claims are registered in [`claims.yaml`](../claims.yaml). +- CI-backed capability claims are registered in [`claims/`](../claims/). - Opt-in and field evidence cannot be promoted to a stronger tier merely because code exists. - Benchmarks describe their task, environment, run count, success oracle, diff --git a/packages/flow/docs/VERIFICATION.md b/packages/flow/docs/VERIFICATION.md index 82c8376c55..c21c9bd065 100644 --- a/packages/flow/docs/VERIFICATION.md +++ b/packages/flow/docs/VERIFICATION.md @@ -1,8 +1,8 @@ # VERIFICATION: capability claims backed by evidence -> GENERATED by `scripts/validate_claims.py --report` from `claims.yaml`. Do not edit by hand — edit the registry and regenerate. +> GENERATED by `scripts/validate_claims.py --report` from `claims/` (one file per claim). Do not edit by hand — edit the registry and regenerate. -- Generated at: **2026-10-18T17:52:16-04:00 (git HEAD commit date)** +- Generated at: **committed registry state (regenerate: scripts/validate_claims.py --report)** - JUnit pass check: **not embedded in this generated registry view** (required CI jobs enforce pass evidence) - Structure gate: `python scripts/validate_claims.py --check --structure-only` (a claim whose tier outranks its strongest backing evidence fails CI). - Pass gates: required `test` and `e2e-browser` jobs supply their own JUnit files; an absent, all-skipped, or failed supported evidence file fails that required job. @@ -12,47 +12,74 @@ ## What is bound to required CI vs. being validated -- **Bound to required CI pass evidence (16):** `web-supported`, `deterministic-zero-model-replay`, `effect-verification-silent-writes`, `record-check-from-app-reads`, `ui-readback-separate-session`, `desktop-readback-separate-session`, `lookup-teaches-the-check`, `identity-gate-halt-armed`, `identifier-crop-compile-emission`, `halt-teach-promote`, `typed-business-decisions-supported`, `reviewed-judgment-cases-supported`, `qualified-remote-decision-v2-supported`, `mockmed-benchmark-ci-reproducible`, `substrate-runtime-validation-supported`, `compose-recorded-bundles` -- **Being validated — opt-in / infra-gated or field (8):** `effect-verifier-kit`, `windows-desktop-validating`, `macos-native-validating`, `linux-native-validating`, `rdp-validating`, `desktop-recording-validating`, `citrix-pixel-validating`, `openemr-field-benchmark` -- **Roadmap / research (1):** `win32-window-replay-roadmap` +**Bound to required CI pass evidence:** + +- `compose-recorded-bundles` +- `desktop-readback-separate-session` +- `deterministic-zero-model-replay` +- `effect-verification-silent-writes` +- `halt-teach-promote` +- `identifier-crop-compile-emission` +- `identity-gate-halt-armed` +- `lookup-teaches-the-check` +- `mockmed-benchmark-ci-reproducible` +- `qualified-remote-decision-v2-supported` +- `record-check-from-app-reads` +- `reviewed-judgment-cases-supported` +- `substrate-runtime-validation-supported` +- `typed-business-decisions-supported` +- `ui-readback-separate-session` +- `web-supported` + +**Being validated — opt-in / infra-gated or field:** + +- `citrix-pixel-validating` +- `desktop-recording-validating` +- `effect-verifier-kit` +- `linux-native-validating` +- `macos-native-validating` +- `openemr-field-benchmark` +- `rdp-validating` +- `windows-desktop-validating` + +**Roadmap / research:** + +- `win32-window-replay-roadmap` ## Claims -### `web-supported` — supported — bound to required CI pass evidence +### `compose-recorded-bundles` — supported — bound to required CI pass evidence -> The Playwright browser path records a GUI workflow and replays it deterministically and locally. Required CI exercises the recorder, compiler, and replay contract. +> openadapt-flow compose sequences named, already-compiled child bundles under a handoff contract. Each child stays bound to its recorded surface. The parent starts a child only after a predecessor ends VERIFIED (or an explicit allowed halt class). Handoffs copy effect-bound parameter values from confirmed effect receipts; missing evidence HALTs. certify and run execute the parent artifact. -- Surfaces: README.md, website, docs +- Surfaces: README.md, docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/e2e/test_record_compile_replay.py` | test | ci (required PR gate (e2e-browser)) | supported | Records the MockMed browser demo once, compiles it, and replays it under baseline + theme/move/rename drift and parameter substitution through the headless-browser Backend. | -| `tests/test_mockmed.py` | test | ci (required PR gate (test)) | supported | The reference browser demo app and its drift screens render deterministically (no CSS transitions), so replay is repeatable. | -| `tests/test_replayer.py` | test | ci (required PR gate (test)) | supported | The deterministic replayer resolves steps, substitutes parameters, enforces postconditions and the risk gate — no model in the loop. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | Three real Chromium CDP-attach trials record and compile the same synthetic workflow, exclude password values before persistence, preserve CSS-pixel frame/coordinate alignment, and detach without closing the external browser. The same live campaign covers same-task replacement, declared open and closed shadow hosts, contenteditable click metadata, and same-document URL/title reflection through history.replaceState. A live case records and compiles actions across viewport and monitor-scale changes. It binds each event to its exact frame dimensions. A separate live case refuses an action that overlaps the transition. Unit cases refuse remote endpoints, cross-origin selectors and navigation, iframe events, invalid viewport evidence, and ambiguous same-origin tabs. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A live Chromium recording submits a same-origin GET form. The document that submit reaches is a fresh closure that holds no value to match against, so Flow withholds its URL and its title and says so, and the recorded surface is stamped before publish. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A server that answers a GET submit with a 302 to `/results/` puts a declared secret in a path segment, where no parameter name identifies it. Flow withholds the whole URL for every document after the one that first held the value, so the literal never reaches events.jsonl. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A lowercase secret typed one character at a time into a page whose URL, title, and button ID share those characters leaves the URL, the title, the DOM selector, and the accessible name exact. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A password that begins with a common English word leaves that word exact in the page URL, the page title, the clicked row's identity characters, the accessible name, and an unrelated button ID. Matching uses only the value the field holds at that moment, so an intermediate keystroke prefix never becomes a matching value. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | Identity evidence that holds a declared value is WITHHELD with a stated reason, never rewritten. Replay compares identity evidence against the live page, so a rewritten copy would compare against characters the page never showed, invisibly. No placeholder string appears anywhere in the recorded evidence. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A page that replaces its input element on every keystroke and writes the value into its URL and title can end up showing a version the field no longer holds. Flow withholds that reflected text whole -- an origin-only URL and an empty title -- instead of matching it against the current value, and keeps the clicked element's identity evidence exact. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A single-page application route change through history.pushState does not build a new document, so the closure that held the declared value is the one being sampled and its URL is still reported exactly. The cross-document rule that withholds a later document's URL therefore does not cost this evidence. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A scanner input that writes the badge into the page URL and title and then clears its own field holds nothing at any moment Flow samples. Flow arms the document's secret boundary from the input event itself, so both channels are checked and both are withheld. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A second scan into the same cleared field does not displace the first badge while the first badge is still shown in the URL. A value the next one does not continue was taken by the page, not edited away by the operator, so it is promoted into the withhold-only set. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A second declared field holding a value does not re-expose the first field's consumed value. The last-value test is per element, so the same URL is withheld before and after the second field is filled. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A DOM selector is identity evidence and uses the same value set as the accessible name and the clicked-row identity. An element id built from a value carried in an inbound declared parameter is withheld with a reason, not emitted verbatim. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A query parameter whose value Flow cannot prove predates the moment the document first held a declared value loses only ITS value. Every parameter name survives, the path stays exact, and the drop is recorded with its reason. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A value that no parameter name identifies -- here written into a path segment -- is caught by detection rather than structure: Flow withholds the whole URL, marks it, and warns the operator that the application placed a declared secret into its own URL. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A single-page wizard that removes its declared field and renders the value into a summary row cannot leak it into the clicked row's identity: the value the field held at a commit point is retained for the single purpose of WITHHOLDING identity text, never to rewrite it and never for the URL or the title. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | Flow never reads the visible text of a bound secret field, because that text is the value. The resulting missing accessible name is reported as WITHHELD with a reason and counted, never left as a silent null, while a control field beside it returns its name. | -| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | No browser event carries a URL or a title. The in-page listeners run in the capture phase, before the page's own handlers, so anything they read describes the state before the action. Flow samples reflected evidence from Python at the settled boundary instead. | +| `tests/test_compose_authoring.py` | test | ci (required PR gate (test)) | supported | Authoring copies two child bundles, records the handoff contract, and refuses a source that is not effect-bound, an unknown target parameter, a single child, a cyclic after-graph, and a backwards handoff. | +| `tests/test_compose_runtime.py` | test | ci (required PR gate (test)) | supported | A two-child fixture runs intake through MockMed with independent effect verification, then a local FakeBackend child that receives the verified patient_id. Missing handoff evidence and an unverified predecessor HALT before the next child starts. | +| `tests/test_cli_compose.py` | test | ci (required PR gate (test)) | supported | The compose parser dispatches, the CLI writes a composition artifact, and replay refuses to run one. | **Caveats (honest limits):** -- `supported` names the registry's required-CI evidence tier. It is not a product state or a general application claim. Production requires active release admissions for all seven product targets. A Production run also needs an active workflow admission for the exact sealed bundle. -- The full record->compile->replay browser suite runs in the required e2e-browser PR gate and repeats in the weekly compatibility matrix. -- Existing-session attachment is Chromium-only and loopback-only. It requires a dedicated browser process with remote debugging. The Playwright-native browser path owns this claim. Capture extension code is outside its evidence scope. +- The parent sequences admitted child runs. It does not enlarge the workflow-program graph and does not introduce a process contract. It does not switch backends inside one recording. +- Evidence is unit tests plus a local mock second child. This claim does not cover Production admission or a live Citrix session. + +### `desktop-readback-separate-session` — supported — bound to required CI pass evidence + +> A save in a desktop, RDP or Citrix application can be checked the way a person checks it: a separate session that is never the one that typed searches for the record, opens the one result that shows its identifier, confirms the record view shows that identifier, and reads the saved fields through UI Automation or OCR, judged by the shared effect judge. The look-up types only into the search box and never clicks a control with a save-like label. With its own sign-in it declares tier 2 (a separate session); without one, tier 3. It is never labeled a system-of-record read. + +- Surfaces: docs +- Strongest evidence strength: **supported** (tier is `supported`) + +| Backing evidence | Kind | Gating / CI stage | Strength | Proves | +|---|---|---|---|---| +| `tests/test_desktop_readback.py` | test | ci (required PR gate (test)) | supported | On the WinForms patient-notes fixture through the real in-guest agent and Windows client (UI Automation): confirms a saved note, refutes a wrong one, opens only the row that shows the full identity past a same-first-name decoy, halts on two matching rows, and refuses a search button with a save-like label. On the RDP kiosk's look-up panel through the RDP backend and real OCR: confirms a booking from its own RDP logon (tier 2), never turns an OCR mismatch into REFUTED, and never takes "not found" as proof that nothing was saved. The same look-up confirms through a Citrix Workspace window and a native macOS window (tier 3, a window as the same user). Neither fixture's save control or form is touched. The deployment refuses a read-back session that is the session that types. | + +**Caveats (honest limits):** + +- The WinForms fixture runs as a UI Automation stand-in that mirrors patient_notes.ps1 and its pn_db.py persistence, and the kiosk as pixels drawn at the Tk layout; neither is the live Windows VM or the Docker RDP fixture in this evidence. On the pixel path OpenAdapt cannot prove where keyboard focus is; it checks the search box shows the query before it submits. ### `deterministic-zero-model-replay` — supported — bound to required CI pass evidence @@ -89,148 +116,164 @@ - Verification requires the step to DECLARE typed `effects` AND a configured EffectVerifier. Without a real system-of-record verifier, on-screen read-back is SAME-SURFACE and not independent. -### `effect-verifier-kit` — validating — opt-in / infra-gated or field test +### `halt-teach-promote` — supported — bound to required CI pass evidence -> The effect-verifier kit makes declaring and wiring effect verification a reviewed deployment-config exercise instead of bespoke per-deployment code: declarative REST / FHIR / read-only-SQL / file-arrival / document-hash verifier configs with secret-isolated auth references and explicit run-parameter binding, a cross-substrate exactly-one-NEW-record duplicate guard, per-consequential-step effect-coverage lint/certify gates, and typed reconciliation tasks on halt. A deployment with multiple reviewed read boundaries selects the strongest evidence tier before actuation, retains that exact selection through durable resume, and never downgrades to a weaker verifier after an action. +> A halt is learnable: halt -> teach a correction -> promote a guarded branch, refusing underdetermined fixes. -- Surfaces: docs -- Strongest evidence strength: **supported** (tier is `validating`) +- Surfaces: README.md, docs +- Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_effect_sql.py` | test | ci (required PR gate (test)) | supported | The read-only SQL verifier's whitelist (mutation/stacking/comment smuggling refused at construction) and full verdict contract, plus the exact table-delta audit promoted from the Frappe Lending reference matrix — against LOCAL sqlite fixtures only. | -| `tests/test_effect_file_arrival.py` | test | ci (required PR gate (test)) | supported | File-arrival verdicts (pattern / size>0 / mtime freshness / content probe / duplicate export) against real temp directories, and the SFTP path against an in-memory fake paramiko-shaped transport. | -| `tests/test_effect_kit_config.py` | test | ci (required PR gate (test)) | supported | The declarative construction path: env-var auth references fail loud when unset, run-parameter references resolve at build (and refuse to construct unresolved), and pre-kit configs build byte-identically. | -| `tests/test_effect_verifier_candidates.py` | test | ci (required PR gate (test)) | supported | Required CI constructs and preflights all reviewed candidates before input, pins the strongest verifier and its pre-state, preserves the binding through durable resume, and refuses an unavailable selected verifier rather than falling back after an action. | -| `tests/test_effect_coverage_lint.py` | test | ci (required PR gate (test)) | supported | lint warns per consequential step lacking an effect contract and reports coverage %; certify fails the same gap only when the policy sets require_effects_for_irreversible (warn-vs-fail is policy-configurable). | -| `tests/test_effect_reconciliation.py` | test | ci (required PR gate (test)) | supported | Every escalated verification failure emits a typed ReconciliationTask carrying the one-way contract hash and verdict evidence — never the resolved selector values. | -| `docs/EFFECT_KIT.md` | doc | artifact (doc/benchmark) | roadmap | The operator-facing kit contract: config reference plus Frappe (REST/SQL) and OpenEMR (FHIR/SQL) worked examples targeting the reference fixtures. | +| `tests/test_halt_learn_loop.py` | test | ci (required PR gate (test)) | supported | A surprise modal halts and emits a learnable trace; teaching promotes a guarded dismiss branch that replays without regression; an underdetermined correction is refused. | +| `tests/test_teach_cli.py` | test | ci (required PR gate (test)) | supported | The `teach` CLI resolves a halt via a correction spec or a recording, refuses an underdetermined fix, and errors on a non-halted run. | +| `tests/test_teach_placement.py` | test | ci (required PR gate (test)) | supported | A recorded fix's own target is carried into the taught bundle; the fix is placed before a step that never acted and after a step that acted (retried, or checked against its expected screen); retrying a step that can write, and a fix with no recorded target, are refused. | **Caveats (honest limits):** -- CONTRACT-PROVEN, not live-proven: the SQL verifier is exercised against sqlite fixtures (no production MariaDB/Postgres), the SFTP arrival path against a fake transport (no real SFTP server), and the worked-example configs are templates — only the FHIR substrate has an additional opt-in live-OpenEMR test. Per-verifier claims are exactly as strong as these tests. +- Promotion is governed by a regression gate that blocks identity- weakening corrections; the loop refuses to guess when the fix is underdetermined. -### `record-check-from-app-reads` — supported — bound to required CI pass evidence +### `identifier-crop-compile-emission` — supported — bound to required CI pass evidence -> scaffold-verifier builds a record check from the reads the app made after the save (the recording's network capture, a SQLite database read path, or a reviewed verifier section), binds the recorded values to run parameters, guards every other table when a database path is given (no row added, changed or removed), and tests the check against injected bad writes before anyone reviews it. A check that misses one is written as a draft with the misses listed. Every effect stays unconfirmed until a person removes the flag. +> The compiler emits a pixel identifier crop (anchor.identifier_crop) for identity-armed steps without structured identity — and for any step whose identifying region is marked at record time (--identifier) — so the pixel-compare identity tier arms on remote-display/pixel replays; every crop-less identity-applicable step records an explicit degrade reason, and lint surfaces per-bundle pixel-identity coverage. - Surfaces: docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | On the benchmark/effect_e2e record service, a check built from a database read path catches every injected bad write end to end through the real replayer (including the stray billing write) and passes the clean save. | -| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | A check built from one REST read misses the stray billing write, both in the recorded-state fault test and end to end, and is written as a draft with that miss listed. | -| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | On the MockMed --break-it fault server, the check built from the app's /api/db read catches every fault end to end once a person declares the read complete, and stays a draft until then. | -| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | On the OpenEMR-shaped FHIR R4 fake, the check found from the Observation search refutes partial, duplicate, phantom, wrong-patient and lost-update faults and confirms the clean save. | -| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | The generated SQL reads, run against a real SQLite file, refute a save that also changed or deleted a row in another table. | -| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | verify-run refuses the proposed check until every needs_operator_confirmation line is removed. | -| `docs/EFFECT_KIT.md` | doc | artifact (doc/benchmark) | roadmap | The operator guide: inputs, outputs, the fault classes, and what the proof does not cover. | +| `tests/test_compile_identifier_crop.py` | test | ci (required PR gate (test)) | supported | Synthetic-fixture proof of the emission mechanism: a pixel-only recording compiles WITH a crop under templates/identifiers/ (sealed + manifest-hashed like every image crop); a structured recording writes NO identity pixels and records why; explicit --identifier markings (event rect / meta region) win; encrypted save seals the crop and the sealed crop still reaches the tier; the compiled crop drives a wrong-MRN MISMATCH through the real replayer ladder while pixel VERIFY stays hard-gated off (zero-false-accept preserved). | +| `tests/test_identifier_crop_lint.py` | test | ci (required PR gate (test)) | supported | Lint coverage surfacing: identity-armed steps with vs without crops (missing_identifier_crop findings carry the compiler's degrade reason; warn on band-only identity, info under structured identity). | **Caveats (honest limits):** -- Proven on synthetic fixtures only (MockMed, the effect_e2e SQLite record service, an OpenEMR-shaped FHIR fake). A check built from API reads alone cannot see writes to tables it does not read, so it stays a draft unless a database path covers them or a person declares the read complete. The fault classes are the effect_e2e taxonomy, not a measured field incident rate. -- Saves that update an existing record are not handled yet: the check expects one new record. The read's credential is the operator's job; the recording's reads used the browser's sign-in. +- Mechanism proven on synthetic fixtures and the bundled demo app only — this does NOT re-qualify any desktop/remote-display substrate, and the pixel tier remains MISMATCH-or-ABSTAIN (it can add a safe halt on a wrong identifier, never authorize a match; PIXEL_VERIFY_ENABLED stays off pending a jitter-robust distance). +- Automatic emission requires an OCR-readable identity band at compile time; icon-only or unreadable rows still compile crop-less (with the recorded reason) and fall back to the OCR band tier at replay. -### `ui-readback-separate-session` — supported — bound to required CI pass evidence +### `identity-gate-halt-armed` — supported — bound to required CI pass evidence -> With no API or database access, a save can be checked through the application's own record page: a separate browser with a new, empty context and its own sign-in opens the record by identifier, confirms the page shows that identifier, reads the saved fields from the page structure, and judges them with the shared effect judge. After sign-in the session refuses every request that is not a read. The check declares tier 2 (a separate session) and is never labeled a system-of-record read. +> On ambiguity the runtime halts instead of guessing, and an identity gate refuses a wrong-entity (wrong-patient) click — on ARMED steps only. - Surfaces: README.md, docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_ui_readback_verifier.py` | test | ci (required PR gate (test)) | supported | The verdict rules without a browser: confirms, refutes partial, duplicate and lost-update saves, never claims absence as proof that nothing was saved, halts on another record's page, a refused request, a changed layout, a shortened value, an unfresh session or a failed sign-in, declares tier 2, and keeps every existing verifier identity digest unchanged. | -| `tests/test_ui_readback_browser.py` | test | ci (required PR gate (test)) | supported | In a real browser against MockMed's server-rendered record pages: its own sign-in even when another session is signed in, refuted wrong saves, fetch/beacon/XHR/form posts refused with none reaching the server, display changes that stop rather than pass, and tier-2 evidence through the real replayer. | -| `tests/test_ui_readback_benchmark.py` | test | ci (required PR gate (test)) | supported | A subset of the measurement: the same-screen check misses accepted wrong saves, the UI read-back catches partial, wrong-record and lost-update saves, and the measured blind spots stay blind. | -| `benchmark/ui_readback` | benchmark | artifact (doc/benchmark) | roadmap | The full measurement next to a same-screen check and an API read, on the GUI replay and API-write fault lists plus display probes. | +| `tests/test_identity.py` | test | ci (required PR gate (test)) | supported | Wrong-entity / near-name sibling / generic-band / param-in-band probes: the identity check refuses to verify a mismatched target and never arms on non-discriminative bands. | +| `tests/test_disambiguation.py` | test | ci (required PR gate (test)) | supported | Underdetermined targets surface as explicit disambiguation rather than a guessed click. | +| `tests/test_identity_fuzz.py` | test | ci (required PR gate (test)) | supported | Public property-based checks preserve the never-false-accept invariant for collapsible identifiers while requiring clean identifiers to remain verifiable. | +| `tests/test_identity_ladder.py` | test | ci (required PR gate (test)) | supported | The identity resolution ladder (structural/template/OCR) escalation. | **Caveats (honest limits):** -- Measured on synthetic fixtures (MockMed and the effect_e2e record service) whose record pages were written for these tests, not on a production application's record pages. The check sees only what a record page shows and is only as independent as the page's own read path. +- Identity verification covers ONLY armed steps. Real bundles arm a MINORITY of clicks (4 of 12 on a recent live OpenEMR bundle); an UNARMED click proceeds with no identity check whatsoever. Coverage is an auditable per-step metric, but disclosure does not close the gap. `scaffold-verifier --bundle` reports coverage before and after evidence from the recording's DOM / accessibility text at each unarmed click; it proposes only evidence the runtime checks on that surface, and a person applies it. -### `desktop-readback-separate-session` — supported — bound to required CI pass evidence +### `lookup-teaches-the-check` — supported — bound to required CI pass evidence -> A save in a desktop, RDP or Citrix application can be checked the way a person checks it: a separate session that is never the one that typed searches for the record, opens the one result that shows its identifier, confirms the record view shows that identifier, and reads the saved fields through UI Automation or OCR, judged by the shared effect judge. The look-up types only into the search box and never clicks a control with a save-like label. With its own sign-in it declares tier 2 (a separate session); without one, tier 3. It is never labeled a system-of-record read. +> When a recording shows the person or the agent look the record up after saving, Flow proposes that look-up as the record check with no marking or configuration: a same-session check and, for desktop, RDP and Citrix recordings, a separate-session desktop_readback. Every proposal waits for a person. - Surfaces: docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_desktop_readback.py` | test | ci (required PR gate (test)) | supported | On the WinForms patient-notes fixture through the real in-guest agent and Windows client (UI Automation): confirms a saved note, refutes a wrong one, opens only the row that shows the full identity past a same-first-name decoy, halts on two matching rows, and refuses a search button with a save-like label. On the RDP kiosk's look-up panel through the RDP backend and real OCR: confirms a booking from its own RDP logon (tier 2), never turns an OCR mismatch into REFUTED, and never takes "not found" as proof that nothing was saved. The same look-up confirms through a Citrix Workspace window and a native macOS window (tier 3, a window as the same user). Neither fixture's save control or form is touched. The deployment refuses a read-back session that is the session that types. | +| `tests/test_lookup_detect.py` | test | ci (required PR gate (test)) | supported | On a synthetic recording of the RDP kiosk: finds the save by its OCR label, the search, and only the values the look-up brought onto the screen (not the saved form still showing the same text); proposes nothing without a look-up; the proposed desktop_readback, with only its address filled in, confirms the booking through real OCR from separate sessions; check accept writes check.json and never overwrites one; record --verify needs no file and ends with the look-up prompt when none is found. | **Caveats (honest limits):** -- The WinForms fixture runs as a UI Automation stand-in that mirrors patient_notes.ps1 and its pn_db.py persistence, and the kiosk as pixels drawn at the Tk layout; neither is the live Windows VM or the Docker RDP fixture in this evidence. On the pixel path OpenAdapt cannot prove where keyboard focus is; it checks the search box shows the query before it submits. +- Measured on one synthetic kiosk recording. The detector needs a save button with a save word, a typed and submitted search, and the saved values readable by OCR on the last frame. -### `lookup-teaches-the-check` — supported — bound to required CI pass evidence +### `mockmed-benchmark-ci-reproducible` — supported — bound to required CI pass evidence -> When a recording shows the person or the agent look the record up after saving, Flow proposes that look-up as the record check with no marking or configuration: a same-session check and, for desktop, RDP and Citrix recordings, a separate-session desktop_readback. Every proposal waits for a person. +> The MockMed benchmark is CI-reproducible: compiled replay finishes ~4.9s p50 with zero model calls versus ~37.5s p50 (~$0.27/run) for the agent. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build; not re-measured on a later release. + +- Surfaces: README.md, docs +- Strongest evidence strength: **supported** (tier is `supported`) + +| Backing evidence | Kind | Gating / CI stage | Strength | Proves | +|---|---|---|---|---| +| `tests/test_mockmed.py` | test | ci (required PR gate (test)) | supported | The MockMed app + drift screens are deterministic and reachable, the substrate the benchmark replays against. | +| `tests/test_benchmark.py` | test | ci (required PR gate (test)) | supported | The benchmark harness / report accounting that produces the numbers. | +| `benchmark/BENCHMARK.md` | benchmark | artifact (doc/benchmark) | roadmap | Full numbers, methodology, and caveats for the CI-reproducible MockMed comparison (dated run artifact). | + +**Caveats (honest limits):** + +- The published latency/cost figures come from a dated run artifact measured on Flow 0.1.0 (pre-v0.2.0 source checkout; exact runtime HEAD not retained) on 2026-07-08; the app is intentionally simple, so success rate (100/100 vs 20/20) is not the story — the standing cost/latency delta is. Agent cost is a list-price estimate. + +### `qualified-remote-decision-v2-supported` — supported — bound to required CI pass evidence + +> A negotiated V2 attended task binds optional reviewed entity wording to the exact qualification, bundle, step, policy, and pause authority. An unqualified or unrecognized entity class stays local and the remote task uses the signed neutral record or item fallback. - Surfaces: docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_lookup_detect.py` | test | ci (required PR gate (test)) | supported | On a synthetic recording of the RDP kiosk: finds the save by its OCR label, the search, and only the values the look-up brought onto the screen (not the saved form still showing the same text); proposes nothing without a look-up; the proposed desktop_readback, with only its address filled in, confirms the booking through real OCR from separate sessions; check accept writes check.json and never overwrites one; record --verify needs no file and ends with the look-up prompt when none is found. | +| `tests/test_attended_actions.py` | test | ci (required PR gate (test)) | supported | Required CI covers the V1-compatible and V2 signed envelopes, provenance binding, remote-safe entity vocabulary, idempotent decisions, and fresh revalidation before resumed actuation. | +| `tests/test_qualification_project.py` | test | ci (required PR gate (test)) | supported | Required CI requires the current exact qualification contract before the V2 producer can emit its reviewed presentation metadata. | +| `docs/DECISION_DELIVERY.md` | doc | artifact (doc/benchmark) | roadmap | The delivery contract defines explicit V2 negotiation, neutral V1 fallback, and the local boundary for actual entity identifiers. | **Caveats (honest limits):** -- Measured on one synthetic kiosk recording. The detector needs a save button with a save word, a typed and submitted search, and the saved values readable by OCR on the last frame. +- V2 requires openadapt-types 0.10.x and explicit peer negotiation. The dependency does not upgrade a V1 consumer, and the byte-compatible V1 path remains available. +- The entity class is presentation metadata only. Actual record identity remains inside the customer-controlled runner and is revalidated before any resumed action. -### `identity-gate-halt-armed` — supported — bound to required CI pass evidence +### `record-check-from-app-reads` — supported — bound to required CI pass evidence -> On ambiguity the runtime halts instead of guessing, and an identity gate refuses a wrong-entity (wrong-patient) click — on ARMED steps only. +> scaffold-verifier builds a record check from the reads the app made after the save (the recording's network capture, a SQLite database read path, or a reviewed verifier section), binds the recorded values to run parameters, guards every other table when a database path is given (no row added, changed or removed), and tests the check against injected bad writes before anyone reviews it. A check that misses one is written as a draft with the misses listed. Every effect stays unconfirmed until a person removes the flag. -- Surfaces: README.md, docs +- Surfaces: docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_identity.py` | test | ci (required PR gate (test)) | supported | Wrong-entity / near-name sibling / generic-band / param-in-band probes: the identity check refuses to verify a mismatched target and never arms on non-discriminative bands. | -| `tests/test_disambiguation.py` | test | ci (required PR gate (test)) | supported | Underdetermined targets surface as explicit disambiguation rather than a guessed click. | -| `tests/test_identity_fuzz.py` | test | ci (required PR gate (test)) | supported | Public property-based checks preserve the never-false-accept invariant for collapsible identifiers while requiring clean identifiers to remain verifiable. | -| `tests/test_identity_ladder.py` | test | ci (required PR gate (test)) | supported | The identity resolution ladder (structural/template/OCR) escalation. | +| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | On the benchmark/effect_e2e record service, a check built from a database read path catches every injected bad write end to end through the real replayer (including the stray billing write) and passes the clean save. | +| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | A check built from one REST read misses the stray billing write, both in the recorded-state fault test and end to end, and is written as a draft with that miss listed. | +| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | On the MockMed --break-it fault server, the check built from the app's /api/db read catches every fault end to end once a person declares the read complete, and stays a draft until then. | +| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | On the OpenEMR-shaped FHIR R4 fake, the check found from the Observation search refutes partial, duplicate, phantom, wrong-patient and lost-update faults and confirms the clean save. | +| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | The generated SQL reads, run against a real SQLite file, refute a save that also changed or deleted a row in another table. | +| `tests/test_record_check_synthesis.py` | test | ci (required PR gate (test)) | supported | verify-run refuses the proposed check until every needs_operator_confirmation line is removed. | +| `docs/EFFECT_KIT.md` | doc | artifact (doc/benchmark) | roadmap | The operator guide: inputs, outputs, the fault classes, and what the proof does not cover. | **Caveats (honest limits):** -- Identity verification covers ONLY armed steps. Real bundles arm a MINORITY of clicks (4 of 12 on a recent live OpenEMR bundle); an UNARMED click proceeds with no identity check whatsoever. Coverage is an auditable per-step metric, but disclosure does not close the gap. `scaffold-verifier --bundle` reports coverage before and after evidence from the recording's DOM / accessibility text at each unarmed click; it proposes only evidence the runtime checks on that surface, and a person applies it. +- Proven on synthetic fixtures only (MockMed, the effect_e2e SQLite record service, an OpenEMR-shaped FHIR fake). A check built from API reads alone cannot see writes to tables it does not read, so it stays a draft unless a database path covers them or a person declares the read complete. The fault classes are the effect_e2e taxonomy, not a measured field incident rate. +- Saves that update an existing record are not handled yet: the check expects one new record. The read's credential is the operator's job; the recording's reads used the browser's sign-in. -### `identifier-crop-compile-emission` — supported — bound to required CI pass evidence +### `reviewed-judgment-cases-supported` — supported — bound to required CI pass evidence -> The compiler emits a pixel identifier crop (anchor.identifier_crop) for identity-armed steps without structured identity — and for any step whose identifying region is marked at record time (--identifier) — so the pixel-compare identity tier arms on remote-display/pixel replays; every crop-less identity-applicable step records an explicit degrade reason, and lint surfaces per-bundle pixel-identity coverage. +> A qualification project can bind typed local facts, evidence hashes, reviewer provenance, and the exact decision contract to reviewed examples and counterfactuals. It can retain permanent human authority, record a reviewed automatic-rule candidate, or refuse certification until more evidence exists, without converting one historical choice into policy. - Surfaces: docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_compile_identifier_crop.py` | test | ci (required PR gate (test)) | supported | Synthetic-fixture proof of the emission mechanism: a pixel-only recording compiles WITH a crop under templates/identifiers/ (sealed + manifest-hashed like every image crop); a structured recording writes NO identity pixels and records why; explicit --identifier markings (event rect / meta region) win; encrypted save seals the crop and the sealed crop still reaches the tier; the compiled crop drives a wrong-MRN MISMATCH through the real replayer ladder while pixel VERIFY stays hard-gated off (zero-false-accept preserved). | -| `tests/test_identifier_crop_lint.py` | test | ci (required PR gate (test)) | supported | Lint coverage surfacing: identity-armed steps with vs without crops (missing_identifier_crop findings carry the compiler's degrade reason; warn on band-only identity, info under structured identity). | +| `tests/test_judgment_cases.py` | test | ci (required PR gate (test)) | supported | Required CI covers closed fact schemas, exact workflow and decision bindings, local-only evidence references, conflict refusal, reciprocal contrast coverage for automatic-rule candidates, retained human authority, unresolved-evidence refusal, and the invariant that case evaluation never edits or synthesizes the executable rule. | +| `tests/test_qualification_project.py` | test | ci (required PR gate (test)) | supported | Required CI binds the reviewed local evidence bytes and review note into certification, reproduces that exact contract when a qualified workflow is saved, and refuses changed case or evidence digests. | +| `docs/BUSINESS_DECISIONS.md` | doc | artifact (doc/benchmark) | roadmap | The public contract separates qualification-time judgment capture from one live runtime answer and describes the scriptable authoring and judgment-case interfaces. | **Caveats (honest limits):** -- Mechanism proven on synthetic fixtures and the bundled demo app only — this does NOT re-qualify any desktop/remote-display substrate, and the pixel tier remains MISMATCH-or-ABSTAIN (it can add a safe halt on a wrong identifier, never authorize a match; PIXEL_VERIFY_ENABLED stays off pending a jitter-robust distance). -- Automatic emission requires an OCR-readable identity band at compile time; icon-only or unreadable rows still compile crop-less (with the recorded reason) and fall back to the OCR band tier at replay. +- An automatic-rule case names only a reviewed rule identifier and finite option. Flow does not infer or generate executable policy from the case; the rule must be authored and qualified through the normal program path. +- A retained human-node case preserves runtime human authority. A more-evidence-required case refuses certification instead of guessing. -### `halt-teach-promote` — supported — bound to required CI pass evidence +### `substrate-runtime-validation-supported` — supported — bound to required CI pass evidence -> A halt is learnable: halt -> teach a correction -> promote a guarded branch, refusing underdetermined fixes. +> Runtime-validation v3 binds Standard and Regulated hosted activation to the exact governed authorization template reproduced from the sealed qualification. It also binds the successful run's resolved target kind (`web|windows|macos|linux|rdp|citrix`), artifact, compiler, parameter schema, strict lint, policy, risk, report, and opaque environment. Web retains its exact HTTPS/host boundary. Native and remote execution emits no app, window, host, readiness, or backend-hint values to Cloud. Local verification retains signed v1 and v2 compatibility. -- Surfaces: README.md, docs +- Surfaces: README.md, docs, website - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_halt_learn_loop.py` | test | ci (required PR gate (test)) | supported | A surprise modal halts and emits a learnable trace; teaching promotes a guarded dismiss branch that replays without regression; an underdetermined correction is refused. | -| `tests/test_teach_cli.py` | test | ci (required PR gate (test)) | supported | The `teach` CLI resolves a halt via a correction spec or a recording, refuses an underdetermined fix, and errors on a non-halted run. | -| `tests/test_teach_placement.py` | test | ci (required PR gate (test)) | supported | A recorded fix's own target is carried into the taught bundle; the fix is placed before a step that never acted and after a step that acted (retried, or checked against its expected screen); retrying a step that can write, and a fix with no recorded target, are refused. | +| `tests/test_runtime_validation.py` | test | ci (required PR gate (test)) | supported | Required CI exercises all six target kinds, validates v3 against its closed JSON Schema, refuses a Standard or Regulated activation without an exact template, binds the template SHA to the HMAC, preserves web URL/host checks, keeps native/remote execution empty, verifies the canonical HMAC vector, and retains signed v1/v2 compatibility. | +| `tests/test_cli_new_commands.py` | test | ci (required PR gate (test)) | supported | Required CI carries the resolved web, Windows, and Citrix backend token through durable resume into the new run report rather than trusting an upload-time relabel. | +| `schemas/runtime-validation-attestation-v3.json` | doc | artifact (doc/benchmark) | roadmap | The public closed envelope requires target_kind and the governed authorization template SHA, and conditionally permits browser execution fields only for web. | **Caveats (honest limits):** -- Promotion is governed by a regression gate that blocks identity- weakening corrections; the loop refuses to guess when the fix is underdetermined. +- The HMAC proves operator-token possession and envelope integrity; it is not independent observation of the local replay or certification of an arbitrary target application. ### `typed-business-decisions-supported` — supported — bound to required CI pass evidence @@ -249,96 +292,124 @@ - The engine validates a principal and its roles; it does not authenticate a self-asserted user. Desktop, Cloud, or a customer-local identity route must supply the authenticated principal. - A human choice is control authority only. It cannot satisfy entity identity, a postcondition, or effect verification, and it cannot turn a screen statement or a human assertion into VERIFIED. -### `reviewed-judgment-cases-supported` — supported — bound to required CI pass evidence +### `ui-readback-separate-session` — supported — bound to required CI pass evidence -> A qualification project can bind typed local facts, evidence hashes, reviewer provenance, and the exact decision contract to reviewed examples and counterfactuals. It can retain permanent human authority, record a reviewed automatic-rule candidate, or refuse certification until more evidence exists, without converting one historical choice into policy. +> With no API or database access, a save can be checked through the application's own record page: a separate browser with a new, empty context and its own sign-in opens the record by identifier, confirms the page shows that identifier, reads the saved fields from the page structure, and judges them with the shared effect judge. After sign-in the session refuses every request that is not a read. The check declares tier 2 (a separate session) and is never labeled a system-of-record read. -- Surfaces: docs +- Surfaces: README.md, docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_judgment_cases.py` | test | ci (required PR gate (test)) | supported | Required CI covers closed fact schemas, exact workflow and decision bindings, local-only evidence references, conflict refusal, reciprocal contrast coverage for automatic-rule candidates, retained human authority, unresolved-evidence refusal, and the invariant that case evaluation never edits or synthesizes the executable rule. | -| `tests/test_qualification_project.py` | test | ci (required PR gate (test)) | supported | Required CI binds the reviewed local evidence bytes and review note into certification, reproduces that exact contract when a qualified workflow is saved, and refuses changed case or evidence digests. | -| `docs/BUSINESS_DECISIONS.md` | doc | artifact (doc/benchmark) | roadmap | The public contract separates qualification-time judgment capture from one live runtime answer and describes the scriptable authoring and judgment-case interfaces. | +| `tests/test_ui_readback_verifier.py` | test | ci (required PR gate (test)) | supported | The verdict rules without a browser: confirms, refutes partial, duplicate and lost-update saves, never claims absence as proof that nothing was saved, halts on another record's page, a refused request, a changed layout, a shortened value, an unfresh session or a failed sign-in, declares tier 2, and keeps every existing verifier identity digest unchanged. | +| `tests/test_ui_readback_browser.py` | test | ci (required PR gate (test)) | supported | In a real browser against MockMed's server-rendered record pages: its own sign-in even when another session is signed in, refuted wrong saves, fetch/beacon/XHR/form posts refused with none reaching the server, display changes that stop rather than pass, and tier-2 evidence through the real replayer. | +| `tests/test_ui_readback_benchmark.py` | test | ci (required PR gate (test)) | supported | A subset of the measurement: the same-screen check misses accepted wrong saves, the UI read-back catches partial, wrong-record and lost-update saves, and the measured blind spots stay blind. | +| `benchmark/ui_readback` | benchmark | artifact (doc/benchmark) | roadmap | The full measurement next to a same-screen check and an API read, on the GUI replay and API-write fault lists plus display probes. | **Caveats (honest limits):** -- An automatic-rule case names only a reviewed rule identifier and finite option. Flow does not infer or generate executable policy from the case; the rule must be authored and qualified through the normal program path. -- A retained human-node case preserves runtime human authority. A more-evidence-required case refuses certification instead of guessing. +- Measured on synthetic fixtures (MockMed and the effect_e2e record service) whose record pages were written for these tests, not on a production application's record pages. The check sees only what a record page shows and is only as independent as the page's own read path. -### `qualified-remote-decision-v2-supported` — supported — bound to required CI pass evidence +### `web-supported` — supported — bound to required CI pass evidence -> A negotiated V2 attended task binds optional reviewed entity wording to the exact qualification, bundle, step, policy, and pause authority. An unqualified or unrecognized entity class stays local and the remote task uses the signed neutral record or item fallback. +> The Playwright browser path records a GUI workflow and replays it deterministically and locally. Required CI exercises the recorder, compiler, and replay contract. -- Surfaces: docs +- Surfaces: README.md, website, docs - Strongest evidence strength: **supported** (tier is `supported`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_attended_actions.py` | test | ci (required PR gate (test)) | supported | Required CI covers the V1-compatible and V2 signed envelopes, provenance binding, remote-safe entity vocabulary, idempotent decisions, and fresh revalidation before resumed actuation. | -| `tests/test_qualification_project.py` | test | ci (required PR gate (test)) | supported | Required CI requires the current exact qualification contract before the V2 producer can emit its reviewed presentation metadata. | -| `docs/DECISION_DELIVERY.md` | doc | artifact (doc/benchmark) | roadmap | The delivery contract defines explicit V2 negotiation, neutral V1 fallback, and the local boundary for actual entity identifiers. | +| `tests/e2e/test_record_compile_replay.py` | test | ci (required PR gate (e2e-browser)) | supported | Records the MockMed browser demo once, compiles it, and replays it under baseline + theme/move/rename drift and parameter substitution through the headless-browser Backend. | +| `tests/test_mockmed.py` | test | ci (required PR gate (test)) | supported | The reference browser demo app and its drift screens render deterministically (no CSS transitions), so replay is repeatable. | +| `tests/test_replayer.py` | test | ci (required PR gate (test)) | supported | The deterministic replayer resolves steps, substitutes parameters, enforces postconditions and the risk gate — no model in the loop. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | Three real Chromium CDP-attach trials record and compile the same synthetic workflow, exclude password values before persistence, preserve CSS-pixel frame/coordinate alignment, and detach without closing the external browser. The same live campaign covers same-task replacement, declared open and closed shadow hosts, contenteditable click metadata, and same-document URL/title reflection through history.replaceState. A live case records and compiles actions across viewport and monitor-scale changes. It binds each event to its exact frame dimensions. A separate live case refuses an action that overlaps the transition. Unit cases refuse remote endpoints, cross-origin selectors and navigation, iframe events, invalid viewport evidence, and ambiguous same-origin tabs. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A live Chromium recording submits a same-origin GET form. The document that submit reaches is a fresh closure that holds no value to match against, so Flow withholds its URL and its title and says so, and the recorded surface is stamped before publish. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A server that answers a GET submit with a 302 to `/results/` puts a declared secret in a path segment, where no parameter name identifies it. Flow withholds the whole URL for every document after the one that first held the value, so the literal never reaches events.jsonl. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A lowercase secret typed one character at a time into a page whose URL, title, and button ID share those characters leaves the URL, the title, the DOM selector, and the accessible name exact. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A password that begins with a common English word leaves that word exact in the page URL, the page title, the clicked row's identity characters, the accessible name, and an unrelated button ID. Matching uses only the value the field holds at that moment, so an intermediate keystroke prefix never becomes a matching value. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | Identity evidence that holds a declared value is WITHHELD with a stated reason, never rewritten. Replay compares identity evidence against the live page, so a rewritten copy would compare against characters the page never showed, invisibly. No placeholder string appears anywhere in the recorded evidence. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A page that replaces its input element on every keystroke and writes the value into its URL and title can end up showing a version the field no longer holds. Flow withholds that reflected text whole -- an origin-only URL and an empty title -- instead of matching it against the current value, and keeps the clicked element's identity evidence exact. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A single-page application route change through history.pushState does not build a new document, so the closure that held the declared value is the one being sampled and its URL is still reported exactly. The cross-document rule that withholds a later document's URL therefore does not cost this evidence. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A scanner input that writes the badge into the page URL and title and then clears its own field holds nothing at any moment Flow samples. Flow arms the document's secret boundary from the input event itself, so both channels are checked and both are withheld. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A second scan into the same cleared field does not displace the first badge while the first badge is still shown in the URL. A value the next one does not continue was taken by the page, not edited away by the operator, so it is promoted into the withhold-only set. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A second declared field holding a value does not re-expose the first field's consumed value. The last-value test is per element, so the same URL is withheld before and after the second field is filled. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A DOM selector is identity evidence and uses the same value set as the accessible name and the clicked-row identity. An element id built from a value carried in an inbound declared parameter is withheld with a reason, not emitted verbatim. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A query parameter whose value Flow cannot prove predates the moment the document first held a declared value loses only ITS value. Every parameter name survives, the path stays exact, and the drop is recorded with its reason. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A value that no parameter name identifies -- here written into a path segment -- is caught by detection rather than structure: Flow withholds the whole URL, marks it, and warns the operator that the application placed a declared secret into its own URL. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | A single-page wizard that removes its declared field and renders the value into a summary row cannot leak it into the clicked row's identity: the value the field held at a commit point is retained for the single purpose of WITHHOLDING identity text, never to rewrite it and never for the URL or the title. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | Flow never reads the visible text of a bound secret field, because that text is the value. The resulting missing accessible name is reported as WITHHELD with a reason and counted, never left as a silent null, while a control field beside it returns its name. | +| `tests/test_browser_attach.py` | test | ci (required PR gate (test)) | supported | No browser event carries a URL or a title. The in-page listeners run in the capture phase, before the page's own handlers, so anything they read describes the state before the action. Flow samples reflected evidence from Python at the settled boundary instead. | **Caveats (honest limits):** -- V2 requires openadapt-types 0.10.x and explicit peer negotiation. The dependency does not upgrade a V1 consumer, and the byte-compatible V1 path remains available. -- The entity class is presentation metadata only. Actual record identity remains inside the customer-controlled runner and is revalidated before any resumed action. +- `supported` names the registry's required-CI evidence tier. It is not a product state or a general application claim. Production requires active release admissions for all seven product targets. A Production run also needs an active workflow admission for the exact sealed bundle. +- The full record->compile->replay browser suite runs in the required e2e-browser PR gate and repeats in the weekly compatibility matrix. +- Existing-session attachment is Chromium-only and loopback-only. It requires a dedicated browser process with remote debugging. The Playwright-native browser path owns this claim. Capture extension code is outside its evidence scope. -### `mockmed-benchmark-ci-reproducible` — supported — bound to required CI pass evidence +### `citrix-pixel-validating` — validating — opt-in / infra-gated or field test -> The MockMed benchmark is CI-reproducible: compiled replay finishes ~4.9s p50 with zero model calls versus ~37.5s p50 (~$0.27/run) for the agent. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build; not re-measured on a later release. +> Citrix uses a dedicated exact-Workspace-window backend beneath the governed pixel-only remote-display contract. Required CI covers its readiness gate, governed execution, durable resume, report binding, and refusal contracts; the counted no-DOM qualification covers the driver, visual ladder, independent effects, and drift halts. Live ICA/HDX acceptance remains separately bound to the exact deployment. -- Surfaces: README.md, docs -- Strongest evidence strength: **supported** (tier is `supported`) +- Surfaces: README.md, docs, website +- Strongest evidence strength: **supported** (tier is `validating`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_mockmed.py` | test | ci (required PR gate (test)) | supported | The MockMed app + drift screens are deterministic and reachable, the substrate the benchmark replays against. | -| `tests/test_benchmark.py` | test | ci (required PR gate (test)) | supported | The benchmark harness / report accounting that produces the numbers. | -| `benchmark/BENCHMARK.md` | benchmark | artifact (doc/benchmark) | roadmap | Full numbers, methodology, and caveats for the CI-reproducible MockMed comparison (dated run artifact). | +| `tests/e2e/test_citrix_pixel_e2e.py` | test | opt-in (OAFLOW_CITRIX_PIXEL_E2E) | validating | OPT-IN pixel-only proof: structural_armed_coverage == 0, replay resolves on template/ocr/geometry only, on-screen OCR read-back verifies the write, the identity gate HALTs on a look-alike patient, and render drift triggers halt-on-ambiguity. | +| `tests/test_pixel_identity_probe.py` | test | ci (required PR gate (test)) | supported | The pixel-substrate identity probe behind the on-pixels identity gate. | +| `tests/test_citrix_workspace_backend.py` | test | ci (required PR gate (test)) | supported | Required CI covers the dedicated backend preset, exact owner/title overrides, readiness probe construction, pixel-only capability boundary, backend factory, and product CLI selectors. | +| `tests/test_run_gate.py` | test | ci (required PR gate (test)) | supported | Required CI refuses governed Citrix execution before action when its readiness binding is absent or blank, admits a sealed bundle carrying a recorded readiness binding, and reports only the resolved backend token rather than sensitive target strings. | +| `tests/test_cli_new_commands.py` | test | ci (required PR gate (test)) | supported | Required CI restores the recorded Citrix owner, exact title, and readiness binding through durable approve/resume, and refuses before backend construction when resumed configuration is incomplete. | +| `tests/test_hosted.py` | test | ci (required PR gate (test)) | supported | Required CI binds a completed local Citrix report to the closed `citrix` execution token without copying target owner, title, or readiness values into the hosted summary. | +| `tests/e2e/test_citrix_workspace_standin_e2e.py` | test | opt-in (OAFLOW_CITRIX_STANDIN_E2E) | validating | The dedicated Citrix backend passes three healthy effect-confirmed record->compile->replay trials and three severe-drift safe-halts over a no-DOM surface, with zero model calls, false completion, or silent incorrect success. | +| `tests/test_citrix_real_acceptance.py` | test | ci (required PR gate (test)) | supported | Required CI validates the public real-ICA campaign preflight, distinct authority keys, executable and oracle attestations, one-use nonce journal, crash recovery, signed display and monitor-topology observation, explicit reliability metrics, uncertain dispatch, and fail-closed report contract without provisioning infrastructure. | +| `benchmark/citrix_workspace/results.json` | artifact | artifact (doc/benchmark) | roadmap | The retained six-trial record reports code_readiness_accepted=true and ica_hdx_accepted=false, keeping driver readiness distinct from a counted live ICA/HDX qualification. | +| `docs/desktop/CITRIX_PIXEL.md` | doc | artifact (doc/benchmark) | roadmap | The Citrix driver model, reusable evidence, exact-deployment acceptance contract, independent-effect boundary, and customer-controlled posture. | **Caveats (honest limits):** -- The published latency/cost figures come from a dated run artifact measured on Flow 0.1.0 (pre-v0.2.0 source checkout; exact runtime HEAD not retained) on 2026-07-08; the app is intentionally simple, so success rate (100/100 vs 20/20) is not the story — the standing cost/latency delta is. Agent cost is a list-price estimate. +- PIXEL-ONLY: no UIA/DOM crosses to the driver. On-screen OCR read-back is SAME-SURFACE, not an independent system-of-record check. +- A Parallels VM window is a Citrix ANALOG; real HDX/latency/DPI/lock- screen drift is not simulated. OPT-IN + infra-gated (`OAFLOW_CITRIX_PIXEL_E2E=1` or `OAFLOW_CITRIX_STANDIN_E2E=1`); neither live-window proof runs on default CI, and neither replaces a counted live ICA/HDX acceptance record. +- The public real-acceptance harness contains no customer recipe, credential, identifier, screenshot, or deployment-specific threshold. A private qualified configuration supplies those exact bindings. -### `windows-desktop-validating` — validating — opt-in / infra-gated or field test +### `desktop-recording-validating` — validating — opt-in / infra-gated or field test -> Windows UIA has scoped acceptance: the deterministic structural rung delivered native actions in a fixed WinForms workflow with independent effects and fail-closed stale/ambiguity refusal. +> The product CLI records desktop workflows through openadapt-capture and `record --backend windows|macos|linux|rdp|citrix` captures the operator's real demonstration and emits the compile-ready recording format, so record -> compile -> replay closes on the desktop substrate, not just the browser. - Surfaces: README.md, docs, website - Strongest evidence strength: **supported** (tier is `validating`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/e2e/test_parallels_desktop_e2e.py` | test | opt-in (OAFLOW_PARALLELS_E2E) | validating | OPT-IN live proof on a real Win11-ARM VM: record->compile->replay through WindowsBackend with the structural rung resolving every click by AutomationId (armed_coverage == 1.0). | -| `tests/test_windows_backend.py` | test | ci (required PR gate (test)) | supported | The 4-method Backend protocol on Windows against a MOCKED WAA server (runs in CI post-merge; proves the wire, not a live desktop). | -| `benchmark/structural_action/STRUCTURAL_ACTION.md` | benchmark | artifact (doc/benchmark) | roadmap | Desktop drift benchmark: the structural rung resolved 21/21 targets where visual replay alone managed 6/21. | -| `benchmark/windows_uia/results.json` | benchmark | artifact (doc/benchmark) | roadmap | Accepted candidate 20260717-candidate-56759c8-v2: 3/3 exact task and SQLite effects, 12 UIA receipts, and 3/3 stale plus 3/3 ambiguity refusals with zero silent incorrect success, over-halt, or model calls. | +| `tests/test_desktop_record.py` | test | ci (required PR gate (test)) | supported | The live-capture orchestration + CLI wiring (record --backend windows|macos|linux|rdp|citrix -> openadapt-capture -> convert_capture), and that a desktop-shaped recording COMPILES into a bundle and REPLAYS to completion through the desktop backend path, resolving each click to its recorded target (runs on default CI). | +| `tests/test_capture_adapter.py` | test | ci (required PR gate (test)) | supported | The capture->recording bridge over a REAL openadapt-capture session (its own event-processing pipeline + frame extraction) feeding the UNMODIFIED compiler (runs on default CI: the `test` job installs the `capture` extra; openadapt-capture >=0.5.4 imports clean headless). | +| `docs/desktop/RECORDING.md` | doc | artifact (doc/benchmark) | roadmap | The capture-assisted and live-observer paths, fail-closed secret handling, RDP coordinate binding, and reuse of openadapt-capture + the capture adapter. | **Caveats (honest limits):** -- The live desktop e2e is OPT-IN and infra-gated (needs a Parallels Win11-ARM VM; `OAFLOW_PARALLELS_E2E=1`); it never runs on default CI. Only the mocked backend protocol runs in CI. -- Acceptance covers the named in-tree workflow and exact Windows VM. Third-party applications require workflow-specific qualification. +- Offline capture carries NO structural (UIA AutomationId) locator, so replay uses the visual ladder (template/ocr/geometry). The live capture needs a display (openadapt-capture is the optional `capture` extra); the CI proof covers a real on-disk capture session -> convert -> compile -> replay, not a live recorder run (the live recorder has its own integration suite in the openadapt-capture repo). +- `--secret` is refused on an unqualified pixel/desktop capture with no field geometry, and RDP recording uses the replay pixel space or a deployment-calibrated client-window mapping. -### `macos-native-validating` — validating — opt-in / infra-gated or field test +### `effect-verifier-kit` — validating — opt-in / infra-gated or field test -> Native macOS has scoped acceptance for exact-window-bound text delivery, independent file effects, and ambiguity refusal on a fixed TextEdit task. +> The effect-verifier kit makes declaring and wiring effect verification a reviewed deployment-config exercise instead of bespoke per-deployment code: declarative REST / FHIR / read-only-SQL / file-arrival / document-hash verifier configs with secret-isolated auth references and explicit run-parameter binding, a cross-substrate exactly-one-NEW-record duplicate guard, per-consequential-step effect-coverage lint/certify gates, and typed reconciliation tasks on halt. A deployment with multiple reviewed read boundaries selects the strongest evidence tier before actuation, retains that exact selection through durable resume, and never downgrades to a weaker verifier after an action. -- Reproducibility: **field** -- Surfaces: README.md, docs, website +- Surfaces: docs - Strongest evidence strength: **supported** (tier is `validating`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_macos_backend.py` | test | ci (required PR gate (test)) | supported | CI covers unique-window binding, foreground/focus proof, exact-element text delivery, and refusal before physical input when proof fails. | -| `tests/test_macos_qualification.py` | test | ci (required PR gate (test)) | supported | CI validates the qualification oracle, failure taxonomy, evidence hashes, cleanup adjudication, and ambiguity-refusal accounting. | -| `benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json` | benchmark | artifact (doc/benchmark) | roadmap | Candidate b1b61a5 completed 3/3 exact-byte TextEdit effects and refused two ambiguous windows without modifying either file. | +| `tests/test_effect_sql.py` | test | ci (required PR gate (test)) | supported | The read-only SQL verifier's whitelist (mutation/stacking/comment smuggling refused at construction) and full verdict contract, plus the exact table-delta audit promoted from the Frappe Lending reference matrix — against LOCAL sqlite fixtures only. | +| `tests/test_effect_file_arrival.py` | test | ci (required PR gate (test)) | supported | File-arrival verdicts (pattern / size>0 / mtime freshness / content probe / duplicate export) against real temp directories, and the SFTP path against an in-memory fake paramiko-shaped transport. | +| `tests/test_effect_kit_config.py` | test | ci (required PR gate (test)) | supported | The declarative construction path: env-var auth references fail loud when unset, run-parameter references resolve at build (and refuse to construct unresolved), and pre-kit configs build byte-identically. | +| `tests/test_effect_verifier_candidates.py` | test | ci (required PR gate (test)) | supported | Required CI constructs and preflights all reviewed candidates before input, pins the strongest verifier and its pre-state, preserves the binding through durable resume, and refuses an unavailable selected verifier rather than falling back after an action. | +| `tests/test_effect_coverage_lint.py` | test | ci (required PR gate (test)) | supported | lint warns per consequential step lacking an effect contract and reports coverage %; certify fails the same gap only when the policy sets require_effects_for_irreversible (warn-vs-fail is policy-configurable). | +| `tests/test_effect_reconciliation.py` | test | ci (required PR gate (test)) | supported | Every escalated verification failure emits a typed ReconciliationTask carrying the one-way contract hash and verdict evidence — never the resolved selector values. | +| `docs/EFFECT_KIT.md` | doc | artifact (doc/benchmark) | roadmap | The operator-facing kit contract: config reference plus Frappe (REST/SQL) and OpenEMR (FHIR/SQL) worked examples targeting the reference fixtures. | **Caveats (honest limits):** -- Acceptance covers TextEdit on one macOS 15.7.3 Apple Silicon host and active user session; each customer application is qualified separately. -- The original counted report remains failed. The hash-bound adjudication accepts only its independently confirmed action/effect/refusal evidence. +- CONTRACT-PROVEN, not live-proven: the SQL verifier is exercised against sqlite fixtures (no production MariaDB/Postgres), the SFTP arrival path against a fake transport (no real SFTP server), and the worked-example configs are templates — only the FHIR substrate has an additional opt-in live-OpenEMR test. Per-verifier claims are exactly as strong as these tests. ### `linux-native-validating` — validating — opt-in / infra-gated or field test @@ -359,9 +430,9 @@ - Required CI establishes live scoped acceptance only for the in-tree GTK3 application on its isolated Xvfb image. Each third-party application and environment requires its own qualification. - X11 is the initial built-in live transport. Wayland requires a real operator-approved XDG RemoteDesktop/ScreenCast portal session; the built-in client currently refuses rather than pretending a grant exists. -### `rdp-validating` — validating — opt-in / infra-gated or field test +### `macos-native-validating` — validating — opt-in / infra-gated or field test -> RDP has scoped acceptance for real-network framebuffer decode and input delivery into Windows 11 with independent exact file-effect verification. +> Native macOS has scoped acceptance for exact-window-bound text delivery, independent file effects, and ambiguity refusal on a fixed TextEdit task. - Reproducibility: **field** - Surfaces: README.md, docs, website @@ -369,77 +440,74 @@ | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/e2e/test_parallels_rdp_e2e.py` | test | opt-in (OAFLOW_PARALLELS_RDP_E2E) | validating | Opt-in snapshot-safe real RDP qualification harness with exactly three trials, independent guest-tools oracle, failure taxonomy, and cleanup. | -| `tests/test_rdp_backend.py` | test | ci (required PR gate (test)) | supported | CI covers the backend/transport contract, framebuffer conversion, pointer and keyboard delivery, resize rebaseline between actions, mid-lease geometry refusal, pre-delivery horizontal-scroll refusal, typed uncertain transport failures, and record-compile-replay conformance. | -| `tests/test_rdp_multiapp_campaign_contract.py` | test | ci (required PR gate (test)) | supported | Required CI covers the bounded 27-trial FreeRDP campaign contract, independent SQLite, CSV, and Maildir oracles, fail-closed visual action preflight, uncertain-delivery handling, and result accounting. | -| `benchmark/rdp_multiapp/README.md` | doc | artifact (doc/benchmark) | roadmap | The public synthetic multi-window campaign defines the workflow, faults, independent persisted surfaces, and acceptance denominator. | -| `benchmark/rdp/results_82a658a_20260718.sanitized.json` | benchmark | artifact (doc/benchmark) | roadmap | Candidate 82a658a passed 3/3 at 51.845, 10.467, and 7.477 seconds, with zero failures, silent incorrect successes, over-halts, or model calls. | +| `tests/test_macos_backend.py` | test | ci (required PR gate (test)) | supported | CI covers unique-window binding, foreground/focus proof, exact-element text delivery, and refusal before physical input when proof fails. | +| `tests/test_macos_qualification.py` | test | ci (required PR gate (test)) | supported | CI validates the qualification oracle, failure taxonomy, evidence hashes, cleanup adjudication, and ambiguity-refusal accounting. | +| `benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json` | benchmark | artifact (doc/benchmark) | roadmap | Candidate b1b61a5 completed 3/3 exact-byte TextEdit effects and refused two ambiguous windows without modifying either file. | **Caveats (honest limits):** -- Acceptance covers the named 1280x800 Windows Run/file task and exact VM environment, not arbitrary applications, identity policies, or Citrix. -- The multi-window campaign uses deterministic synthetic applications. It exercises the real FreeRDP pixel and input path but does not qualify a named customer application or environment. +- Acceptance covers TextEdit on one macOS 15.7.3 Apple Silicon host and active user session; each customer application is qualified separately. +- The original counted report remains failed. The hash-bound adjudication accepts only its independently confirmed action/effect/refusal evidence. -### `substrate-runtime-validation-supported` — supported — bound to required CI pass evidence +### `openemr-field-benchmark` — validating — opt-in / infra-gated or field test -> Runtime-validation v3 binds Standard and Regulated hosted activation to the exact governed authorization template reproduced from the sealed qualification. It also binds the successful run's resolved target kind (`web|windows|macos|linux|rdp|citrix`), artifact, compiler, parameter schema, strict lint, policy, risk, report, and opaque environment. Web retains its exact HTTPS/host boundary. Native and remote execution emits no app, window, host, readiness, or backend-hint values to Cloud. Local verification retains signed v1 and v2 compatibility. +> On the real third-party OpenEMR public demo, compiled replay went 19/20 versus 10/10 for a computer-use agent, faster and with zero model calls. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build. +- Reproducibility: **field** - Surfaces: README.md, docs, website -- Strongest evidence strength: **supported** (tier is `supported`) +- Strongest evidence strength: **supported** (tier is `validating`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_runtime_validation.py` | test | ci (required PR gate (test)) | supported | Required CI exercises all six target kinds, validates v3 against its closed JSON Schema, refuses a Standard or Regulated activation without an exact template, binds the template SHA to the HMAC, preserves web URL/host checks, keeps native/remote execution empty, verifies the canonical HMAC vector, and retains signed v1/v2 compatibility. | -| `tests/test_cli_new_commands.py` | test | ci (required PR gate (test)) | supported | Required CI carries the resolved web, Windows, and Citrix backend token through durable resume into the new run report rather than trusting an upload-time relabel. | -| `schemas/runtime-validation-attestation-v3.json` | doc | artifact (doc/benchmark) | roadmap | The public closed envelope requires target_kind and the governed authorization template SHA, and conditionally permits browser execution fields only for web. | +| `tests/test_openemr_benchmark.py` | test | ci (required PR gate (test)) | supported | The CI-reproducible half: the saved-message-row verifier, its unsaved-entry-form rejection, and the intent-not-coordinates task prompt that both benchmark arms use. | +| `tests/test_openemr_retained_finals.py` | test | opt-in (OPENADAPT_OPENEMR_FINALS_DIR) | validating | When the local-only retained final frames are mounted, the guard replays all 30 with the current verifier and requires 19/20 compiled, 10/10 agent, and exactly one corrected legacy false success. | +| `benchmark/openemr/BENCHMARK.md` | benchmark | artifact (doc/benchmark) | roadmap | The corrected field-test numbers, saved-row screen-oracle contract, methodology, and cost caps for the 20-vs-10 head-to-head run. | +| `docs/showcase-openemr/FINDINGS.md` | doc | artifact (doc/benchmark) | roadmap | The correctness-only field findings (fresh browsers, zero model calls, closed-loop scrolling). | **Caveats (honest limits):** -- The HMAC proves operator-token possession and envelope integrity; it is not independent observation of the local replay or certification of an arbitrary target application. +- The historical result uses OCR evidence from a visible saved message row. It does not use an out-of-band OpenEMR system-of-record read. +- FIELD TEST, NOT CI-reproducible: the head-to-head ran against a SHARED public demo that other users mutate and that resets daily; the sample is small (10 agent runs). Only the verifier + task-prompt units run in CI. `reproducibility: field` forbids ever labeling this `supported`. -### `desktop-recording-validating` — validating — opt-in / infra-gated or field test +### `rdp-validating` — validating — opt-in / infra-gated or field test -> The product CLI records desktop workflows through openadapt-capture and `record --backend windows|macos|linux|rdp|citrix` captures the operator's real demonstration and emits the compile-ready recording format, so record -> compile -> replay closes on the desktop substrate, not just the browser. +> RDP has scoped acceptance for real-network framebuffer decode and input delivery into Windows 11 with independent exact file-effect verification. +- Reproducibility: **field** - Surfaces: README.md, docs, website - Strongest evidence strength: **supported** (tier is `validating`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/test_desktop_record.py` | test | ci (required PR gate (test)) | supported | The live-capture orchestration + CLI wiring (record --backend windows|macos|linux|rdp|citrix -> openadapt-capture -> convert_capture), and that a desktop-shaped recording COMPILES into a bundle and REPLAYS to completion through the desktop backend path, resolving each click to its recorded target (runs on default CI). | -| `tests/test_capture_adapter.py` | test | ci (required PR gate (test)) | supported | The capture->recording bridge over a REAL openadapt-capture session (its own event-processing pipeline + frame extraction) feeding the UNMODIFIED compiler (runs on default CI: the `test` job installs the `capture` extra; openadapt-capture >=0.5.4 imports clean headless). | -| `docs/desktop/RECORDING.md` | doc | artifact (doc/benchmark) | roadmap | The capture-assisted and live-observer paths, fail-closed secret handling, RDP coordinate binding, and reuse of openadapt-capture + the capture adapter. | +| `tests/e2e/test_parallels_rdp_e2e.py` | test | opt-in (OAFLOW_PARALLELS_RDP_E2E) | validating | Opt-in snapshot-safe real RDP qualification harness with exactly three trials, independent guest-tools oracle, failure taxonomy, and cleanup. | +| `tests/test_rdp_backend.py` | test | ci (required PR gate (test)) | supported | CI covers the backend/transport contract, framebuffer conversion, pointer and keyboard delivery, resize rebaseline between actions, mid-lease geometry refusal, pre-delivery horizontal-scroll refusal, typed uncertain transport failures, and record-compile-replay conformance. | +| `tests/test_rdp_multiapp_campaign_contract.py` | test | ci (required PR gate (test)) | supported | Required CI covers the bounded 27-trial FreeRDP campaign contract, independent SQLite, CSV, and Maildir oracles, fail-closed visual action preflight, uncertain-delivery handling, and result accounting. | +| `benchmark/rdp_multiapp/README.md` | doc | artifact (doc/benchmark) | roadmap | The public synthetic multi-window campaign defines the workflow, faults, independent persisted surfaces, and acceptance denominator. | +| `benchmark/rdp/results_82a658a_20260718.sanitized.json` | benchmark | artifact (doc/benchmark) | roadmap | Candidate 82a658a passed 3/3 at 51.845, 10.467, and 7.477 seconds, with zero failures, silent incorrect successes, over-halts, or model calls. | **Caveats (honest limits):** -- Offline capture carries NO structural (UIA AutomationId) locator, so replay uses the visual ladder (template/ocr/geometry). The live capture needs a display (openadapt-capture is the optional `capture` extra); the CI proof covers a real on-disk capture session -> convert -> compile -> replay, not a live recorder run (the live recorder has its own integration suite in the openadapt-capture repo). -- `--secret` is refused on an unqualified pixel/desktop capture with no field geometry, and RDP recording uses the replay pixel space or a deployment-calibrated client-window mapping. +- Acceptance covers the named 1280x800 Windows Run/file task and exact VM environment, not arbitrary applications, identity policies, or Citrix. +- The multi-window campaign uses deterministic synthetic applications. It exercises the real FreeRDP pixel and input path but does not qualify a named customer application or environment. -### `citrix-pixel-validating` — validating — opt-in / infra-gated or field test +### `windows-desktop-validating` — validating — opt-in / infra-gated or field test -> Citrix uses a dedicated exact-Workspace-window backend beneath the governed pixel-only remote-display contract. Required CI covers its readiness gate, governed execution, durable resume, report binding, and refusal contracts; the counted no-DOM qualification covers the driver, visual ladder, independent effects, and drift halts. Live ICA/HDX acceptance remains separately bound to the exact deployment. +> Windows UIA has scoped acceptance: the deterministic structural rung delivered native actions in a fixed WinForms workflow with independent effects and fail-closed stale/ambiguity refusal. - Surfaces: README.md, docs, website - Strongest evidence strength: **supported** (tier is `validating`) | Backing evidence | Kind | Gating / CI stage | Strength | Proves | |---|---|---|---|---| -| `tests/e2e/test_citrix_pixel_e2e.py` | test | opt-in (OAFLOW_CITRIX_PIXEL_E2E) | validating | OPT-IN pixel-only proof: structural_armed_coverage == 0, replay resolves on template/ocr/geometry only, on-screen OCR read-back verifies the write, the identity gate HALTs on a look-alike patient, and render drift triggers halt-on-ambiguity. | -| `tests/test_pixel_identity_probe.py` | test | ci (required PR gate (test)) | supported | The pixel-substrate identity probe behind the on-pixels identity gate. | -| `tests/test_citrix_workspace_backend.py` | test | ci (required PR gate (test)) | supported | Required CI covers the dedicated backend preset, exact owner/title overrides, readiness probe construction, pixel-only capability boundary, backend factory, and product CLI selectors. | -| `tests/test_run_gate.py` | test | ci (required PR gate (test)) | supported | Required CI refuses governed Citrix execution before action when its readiness binding is absent or blank, admits a sealed bundle carrying a recorded readiness binding, and reports only the resolved backend token rather than sensitive target strings. | -| `tests/test_cli_new_commands.py` | test | ci (required PR gate (test)) | supported | Required CI restores the recorded Citrix owner, exact title, and readiness binding through durable approve/resume, and refuses before backend construction when resumed configuration is incomplete. | -| `tests/test_hosted.py` | test | ci (required PR gate (test)) | supported | Required CI binds a completed local Citrix report to the closed `citrix` execution token without copying target owner, title, or readiness values into the hosted summary. | -| `tests/e2e/test_citrix_workspace_standin_e2e.py` | test | opt-in (OAFLOW_CITRIX_STANDIN_E2E) | validating | The dedicated Citrix backend passes three healthy effect-confirmed record->compile->replay trials and three severe-drift safe-halts over a no-DOM surface, with zero model calls, false completion, or silent incorrect success. | -| `tests/test_citrix_real_acceptance.py` | test | ci (required PR gate (test)) | supported | Required CI validates the public real-ICA campaign preflight, distinct authority keys, executable and oracle attestations, one-use nonce journal, crash recovery, signed display and monitor-topology observation, explicit reliability metrics, uncertain dispatch, and fail-closed report contract without provisioning infrastructure. | -| `benchmark/citrix_workspace/results.json` | artifact | artifact (doc/benchmark) | roadmap | The retained six-trial record reports code_readiness_accepted=true and ica_hdx_accepted=false, keeping driver readiness distinct from a counted live ICA/HDX qualification. | -| `docs/desktop/CITRIX_PIXEL.md` | doc | artifact (doc/benchmark) | roadmap | The Citrix driver model, reusable evidence, exact-deployment acceptance contract, independent-effect boundary, and customer-controlled posture. | +| `tests/e2e/test_parallels_desktop_e2e.py` | test | opt-in (OAFLOW_PARALLELS_E2E) | validating | OPT-IN live proof on a real Win11-ARM VM: record->compile->replay through WindowsBackend with the structural rung resolving every click by AutomationId (armed_coverage == 1.0). | +| `tests/test_windows_backend.py` | test | ci (required PR gate (test)) | supported | The 4-method Backend protocol on Windows against a MOCKED WAA server (runs in CI post-merge; proves the wire, not a live desktop). | +| `benchmark/structural_action/STRUCTURAL_ACTION.md` | benchmark | artifact (doc/benchmark) | roadmap | Desktop drift benchmark: the structural rung resolved 21/21 targets where visual replay alone managed 6/21. | +| `benchmark/windows_uia/results.json` | benchmark | artifact (doc/benchmark) | roadmap | Accepted candidate 20260717-candidate-56759c8-v2: 3/3 exact task and SQLite effects, 12 UIA receipts, and 3/3 stale plus 3/3 ambiguity refusals with zero silent incorrect success, over-halt, or model calls. | **Caveats (honest limits):** -- PIXEL-ONLY: no UIA/DOM crosses to the driver. On-screen OCR read-back is SAME-SURFACE, not an independent system-of-record check. -- A Parallels VM window is a Citrix ANALOG; real HDX/latency/DPI/lock- screen drift is not simulated. OPT-IN + infra-gated (`OAFLOW_CITRIX_PIXEL_E2E=1` or `OAFLOW_CITRIX_STANDIN_E2E=1`); neither live-window proof runs on default CI, and neither replaces a counted live ICA/HDX acceptance record. -- The public real-acceptance harness contains no customer recipe, credential, identifier, screenshot, or deployment-specific threshold. A private qualified configuration supplies those exact bindings. +- The live desktop e2e is OPT-IN and infra-gated (needs a Parallels Win11-ARM VM; `OAFLOW_PARALLELS_E2E=1`); it never runs on default CI. Only the mocked backend protocol runs in CI. +- Acceptance covers the named in-tree workflow and exact Windows VM. Third-party applications require workflow-specific qualification. ### `win32-window-replay-roadmap` — roadmap — designed, not yet proven @@ -456,41 +524,3 @@ **Caveats (honest limits):** - NOT qualified: no counted end-to-end batch on a real Windows host or a real client window exists. The contract tests mock every Win32 call; real DPI virtualization, UIPI, foreground-arbitration, and PrintWindow rendering behavior remain unproven until the Parallels/real-Windows validation procedure is executed and counted. - -### `openemr-field-benchmark` — validating — opt-in / infra-gated or field test - -> On the real third-party OpenEMR public demo, compiled replay went 19/20 versus 10/10 for a computer-use agent, faster and with zero model calls. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build. - -- Reproducibility: **field** -- Surfaces: README.md, docs, website -- Strongest evidence strength: **supported** (tier is `validating`) - -| Backing evidence | Kind | Gating / CI stage | Strength | Proves | -|---|---|---|---|---| -| `tests/test_openemr_benchmark.py` | test | ci (required PR gate (test)) | supported | The CI-reproducible half: the saved-message-row verifier, its unsaved-entry-form rejection, and the intent-not-coordinates task prompt that both benchmark arms use. | -| `tests/test_openemr_retained_finals.py` | test | opt-in (OPENADAPT_OPENEMR_FINALS_DIR) | validating | When the local-only retained final frames are mounted, the guard replays all 30 with the current verifier and requires 19/20 compiled, 10/10 agent, and exactly one corrected legacy false success. | -| `benchmark/openemr/BENCHMARK.md` | benchmark | artifact (doc/benchmark) | roadmap | The corrected field-test numbers, saved-row screen-oracle contract, methodology, and cost caps for the 20-vs-10 head-to-head run. | -| `docs/showcase-openemr/FINDINGS.md` | doc | artifact (doc/benchmark) | roadmap | The correctness-only field findings (fresh browsers, zero model calls, closed-loop scrolling). | - -**Caveats (honest limits):** - -- The historical result uses OCR evidence from a visible saved message row. It does not use an out-of-band OpenEMR system-of-record read. -- FIELD TEST, NOT CI-reproducible: the head-to-head ran against a SHARED public demo that other users mutate and that resets daily; the sample is small (10 agent runs). Only the verifier + task-prompt units run in CI. `reproducibility: field` forbids ever labeling this `supported`. - -### `compose-recorded-bundles` — supported — bound to required CI pass evidence - -> openadapt-flow compose sequences named, already-compiled child bundles under a handoff contract. Each child stays bound to its recorded surface. The parent starts a child only after a predecessor ends VERIFIED (or an explicit allowed halt class). Handoffs copy effect-bound parameter values from confirmed effect receipts; missing evidence HALTs. certify and run execute the parent artifact. - -- Surfaces: README.md, docs -- Strongest evidence strength: **supported** (tier is `supported`) - -| Backing evidence | Kind | Gating / CI stage | Strength | Proves | -|---|---|---|---|---| -| `tests/test_compose_authoring.py` | test | ci (required PR gate (test)) | supported | Authoring copies two child bundles, records the handoff contract, and refuses a source that is not effect-bound, an unknown target parameter, a single child, a cyclic after-graph, and a backwards handoff. | -| `tests/test_compose_runtime.py` | test | ci (required PR gate (test)) | supported | A two-child fixture runs intake through MockMed with independent effect verification, then a local FakeBackend child that receives the verified patient_id. Missing handoff evidence and an unverified predecessor HALT before the next child starts. | -| `tests/test_cli_compose.py` | test | ci (required PR gate (test)) | supported | The compose parser dispatches, the CLI writes a composition artifact, and replay refuses to run one. | - -**Caveats (honest limits):** - -- The parent sequences admitted child runs. It does not enlarge the workflow-program graph and does not introduce a process contract. It does not switch backends inside one recording. -- Evidence is unit tests plus a local mock second child. This claim does not cover Production admission or a live Citrix session. diff --git a/packages/flow/docs/desktop/CITRIX_PIXEL.md b/packages/flow/docs/desktop/CITRIX_PIXEL.md index 009118cc7b..78e6451d6c 100644 --- a/packages/flow/docs/desktop/CITRIX_PIXEL.md +++ b/packages/flow/docs/desktop/CITRIX_PIXEL.md @@ -49,7 +49,7 @@ counted real Workspace multi-monitor result. Windows-host client for the same backend (PrintWindow/BitBlt client-area capture, SendInput injection, per-monitor-v2 DPI, UIPI refusal). The win32 client is mock-contract-tested only — no counted batch on a real Windows host -exists yet (`claims.yaml` `win32-window-replay-roadmap`). The backend +exists yet (`claims/win32-window-replay-roadmap.yaml`). The backend deliberately remains small: target uniqueness, identity, policy, postconditions, independent effects, retries, repair, and audit belong to the OpenAdapt runtime rather than the display driver. diff --git a/packages/flow/docs/verification.json b/packages/flow/docs/verification.json index ed6c8a9851..2cb77c93af 100644 --- a/packages/flow/docs/verification.json +++ b/packages/flow/docs/verification.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-10-18T17:52:16-04:00 (git HEAD commit date)", + "generated_at": "committed registry state (regenerate: scripts/validate_claims.py --report)", "green_check_run": false, "green_check_job": null, "green_check_scope": [], @@ -7,48 +7,22 @@ "validation_errors": [], "claims": [ { - "id": "web-supported", - "claim": "The Playwright browser path records a GUI workflow and replays it deterministically and locally. Required CI exercises the recorder, compiler, and replay contract.", + "id": "compose-recorded-bundles", + "claim": "openadapt-flow compose sequences named, already-compiled child bundles under a handoff contract. Each child stays bound to its recorded surface. The parent starts a child only after a predecessor ends VERIFIED (or an explicit allowed halt class). Handoffs copy effect-bound parameter values from confirmed effect receipts; missing evidence HALTs. certify and run execute the parent artifact.", "tier": "supported", "reproducibility": null, "surfaces": [ "README.md", - "website", "docs" ], "strongest_evidence": "supported", "caveats": [ - "`supported` names the registry's required-CI evidence tier. It is not a product state or a general application claim. Production requires active release admissions for all seven product targets. A Production run also needs an active workflow admission for the exact sealed bundle.", - "The full record->compile->replay browser suite runs in the required e2e-browser PR gate and repeats in the weekly compatibility matrix.", - "Existing-session attachment is Chromium-only and loopback-only. It requires a dedicated browser process with remote debugging. The Playwright-native browser path owns this claim. Capture extension code is outside its evidence scope." + "The parent sequences admitted child runs. It does not enlarge the workflow-program graph and does not introduce a process contract. It does not switch backends inside one recording.", + "Evidence is unit tests plus a local mock second child. This claim does not cover Production admission or a live Citrix session." ], "evidence": [ { - "path": "tests/e2e/test_record_compile_replay.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (e2e-browser))", - "node": null, - "node_found": null, - "ci_job": "e2e-browser", - "junit_status": null, - "proves": "Records the MockMed browser demo once, compiles it, and replays it under baseline + theme/move/rename drift and parameter substitution through the headless-browser Backend." - }, - { - "path": "tests/test_mockmed.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": null, - "node_found": null, - "ci_job": "test", - "junit_status": null, - "proves": "The reference browser demo app and its drift screens render deterministically (no CSS transitions), so replay is repeatable." - }, - { - "path": "tests/test_replayer.py", + "path": "tests/test_compose_authoring.py", "kind": "test", "exists": true, "strength": "supported", @@ -57,211 +31,59 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The deterministic replayer resolves steps, substitutes parameters, enforces postconditions and the risk gate \u2014 no model in the loop." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_live_cdp_attach_records_compiles_and_leaves_browser_running_three_trials", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "Three real Chromium CDP-attach trials record and compile the same synthetic workflow, exclude password values before persistence, preserve CSS-pixel frame/coordinate alignment, and detach without closing the external browser. The same live campaign covers same-task replacement, declared open and closed shadow hosts, contenteditable click metadata, and same-document URL/title reflection through history.replaceState. A live case records and compiles actions across viewport and monitor-scale changes. It binds each event to its exact frame dimensions. A separate live case refuses an action that overlaps the transition. Unit cases refuse remote endpoints, cross-origin selectors and navigation, iframe events, invalid viewport evidence, and ambiguous same-origin tabs." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_launched_recording_withholds_a_later_document_url_after_a_get_submit", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A live Chromium recording submits a same-origin GET form. The document that submit reaches is a fresh closure that holds no value to match against, so Flow withholds its URL and its title and says so, and the recorded surface is stamped before publish." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_launched_recording_withholds_a_redirect_that_puts_the_value_in_a_path", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A server that answers a GET submit with a 302 to `/results/` puts a declared secret in a path segment, where no parameter name identifies it. Flow withholds the whole URL for every document after the one that first held the value, so the literal never reaches events.jsonl." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_keeps_url_and_identity_evidence_for_a_lowercase_secret", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A lowercase secret typed one character at a time into a page whose URL, title, and button ID share those characters leaves the URL, the title, the DOM selector, and the accessible name exact." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_keeps_all_evidence_for_a_password_starting_with_a_word", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A password that begins with a common English word leaves that word exact in the page URL, the page title, the clicked row's identity characters, the accessible name, and an unrelated button ID. Matching uses only the value the field holds at that moment, so an intermediate keystroke prefix never becomes a matching value." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_withholds_identity_that_holds_a_declared_value", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "Identity evidence that holds a declared value is WITHHELD with a stated reason, never rewritten. Replay compares identity evidence against the live page, so a rewritten copy would compare against characters the page never showed, invisibly. No placeholder string appears anywhere in the recorded evidence." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_withholds_a_stale_reflection_from_a_swapping_input", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A page that replaces its input element on every keystroke and writes the value into its URL and title can end up showing a version the field no longer holds. Flow withholds that reflected text whole -- an origin-only URL and an empty title -- instead of matching it against the current value, and keeps the clicked element's identity evidence exact." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_still_reports_a_same_document_route_after_the_fix", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A single-page application route change through history.pushState does not build a new document, so the closure that held the declared value is the one being sampled and its URL is still reported exactly. The cross-document rule that withholds a later document's URL therefore does not cost this evidence." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_withholds_a_title_a_consumed_field_produced", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A scanner input that writes the badge into the page URL and title and then clears its own field holds nothing at any moment Flow samples. Flow arms the document's secret boundary from the input event itself, so both channels are checked and both are withheld." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_keeps_a_consumed_value_across_a_second_entry", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A second scan into the same cleared field does not displace the first badge while the first badge is still shown in the URL. A value the next one does not continue was taken by the page, not edited away by the operator, so it is promoted into the withhold-only set." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_keeps_a_consumed_value_while_another_field_is_live", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A second declared field holding a value does not re-expose the first field's consumed value. The last-value test is per element, so the same URL is withheld before and after the second field is filled." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_withholds_a_selector_built_from_an_inbound_value", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A DOM selector is identity evidence and uses the same value set as the accessible name and the clicked-row identity. An element id built from a value carried in an inbound declared parameter is withheld with a reason, not emitted verbatim." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_drops_only_the_unproven_parameter_value", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A query parameter whose value Flow cannot prove predates the moment the document first held a declared value loses only ITS value. Every parameter name survives, the path stays exact, and the drop is recorded with its reason." - }, - { - "path": "tests/test_browser_attach.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_page_closure_withholds_a_url_that_holds_the_value_in_its_path", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A value that no parameter name identifies -- here written into a path segment -- is caught by detection rather than structure: Flow withholds the whole URL, marks it, and warns the operator that the application placed a declared secret into its own URL." + "proves": "Authoring copies two child bundles, records the handoff contract, and refuses a source that is not effect-bound, an unknown target parameter, a single child, a cyclic after-graph, and a backwards handoff." }, { - "path": "tests/test_browser_attach.py", + "path": "tests/test_compose_runtime.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": "test_page_closure_withholds_identity_after_the_field_is_removed", + "node": "test_two_child_fixture_second_is_local_backend", "node_found": true, "ci_job": "test", "junit_status": null, - "proves": "A single-page wizard that removes its declared field and renders the value into a summary row cannot leak it into the clicked row's identity: the value the field held at a commit point is retained for the single purpose of WITHHOLDING identity text, never to rewrite it and never for the URL or the title." + "proves": "A two-child fixture runs intake through MockMed with independent effect verification, then a local FakeBackend child that receives the verified patient_id. Missing handoff evidence and an unverified predecessor HALT before the next child starts." }, { - "path": "tests/test_browser_attach.py", + "path": "tests/test_cli_compose.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": "test_page_closure_marks_a_withheld_secret_field_name", - "node_found": true, + "node": null, + "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Flow never reads the visible text of a bound secret field, because that text is the value. The resulting missing accessible name is reported as WITHHELD with a reason and counted, never left as a silent null, while a control field beside it returns its name." - }, + "proves": "The compose parser dispatches, the CLI writes a composition artifact, and replay refuses to run one." + } + ], + "errors": [] + }, + { + "id": "desktop-readback-separate-session", + "claim": "A save in a desktop, RDP or Citrix application can be checked the way a person checks it: a separate session that is never the one that typed searches for the record, opens the one result that shows its identifier, confirms the record view shows that identifier, and reads the saved fields through UI Automation or OCR, judged by the shared effect judge. The look-up types only into the search box and never clicks a control with a save-like label. With its own sign-in it declares tier 2 (a separate session); without one, tier 3. It is never labeled a system-of-record read.", + "tier": "supported", + "reproducibility": null, + "surfaces": [ + "docs" + ], + "strongest_evidence": "supported", + "caveats": [ + "The WinForms fixture runs as a UI Automation stand-in that mirrors patient_notes.ps1 and its pn_db.py persistence, and the kiosk as pixels drawn at the Tk layout; neither is the live Windows VM or the Docker RDP fixture in this evidence. On the pixel path OpenAdapt cannot prove where keyboard focus is; it checks the search box shows the query before it submits." + ], + "evidence": [ { - "path": "tests/test_browser_attach.py", + "path": "tests/test_desktop_readback.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": "test_page_closure_emits_no_reflected_text_from_the_capture_phase", - "node_found": true, + "node": null, + "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "No browser event carries a URL or a title. The in-page listeners run in the capture phase, before the page's own handlers, so anything they read describes the state before the action. Flow samples reflected evidence from Python at the settled boundary instead." + "proves": "On the WinForms patient-notes fixture through the real in-guest agent and Windows client (UI Automation): confirms a saved note, refutes a wrong one, opens only the row that shows the full identity past a same-first-name decoy, halts on two matching rows, and refuses a search button with a save-like label. On the RDP kiosk's look-up panel through the RDP backend and real OCR: confirms a booking from its own RDP logon (tier 2), never turns an OCR mismatch into REFUTED, and never takes \"not found\" as proof that nothing was saved. The same look-up confirms through a Citrix Workspace window and a native macOS window (tier 3, a window as the same user). Neither fixture's save control or form is touched. The deployment refuses a read-back session that is the session that types." } ], "errors": [] @@ -386,32 +208,21 @@ "errors": [] }, { - "id": "effect-verifier-kit", - "claim": "The effect-verifier kit makes declaring and wiring effect verification a reviewed deployment-config exercise instead of bespoke per-deployment code: declarative REST / FHIR / read-only-SQL / file-arrival / document-hash verifier configs with secret-isolated auth references and explicit run-parameter binding, a cross-substrate exactly-one-NEW-record duplicate guard, per-consequential-step effect-coverage lint/certify gates, and typed reconciliation tasks on halt. A deployment with multiple reviewed read boundaries selects the strongest evidence tier before actuation, retains that exact selection through durable resume, and never downgrades to a weaker verifier after an action.", - "tier": "validating", + "id": "halt-teach-promote", + "claim": "A halt is learnable: halt -> teach a correction -> promote a guarded branch, refusing underdetermined fixes.", + "tier": "supported", "reproducibility": null, "surfaces": [ + "README.md", "docs" ], "strongest_evidence": "supported", "caveats": [ - "CONTRACT-PROVEN, not live-proven: the SQL verifier is exercised against sqlite fixtures (no production MariaDB/Postgres), the SFTP arrival path against a fake transport (no real SFTP server), and the worked-example configs are templates \u2014 only the FHIR substrate has an additional opt-in live-OpenEMR test. Per-verifier claims are exactly as strong as these tests." + "Promotion is governed by a regression gate that blocks identity- weakening corrections; the loop refuses to guess when the fix is underdetermined." ], "evidence": [ { - "path": "tests/test_effect_sql.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": null, - "node_found": null, - "ci_job": "test", - "junit_status": null, - "proves": "The read-only SQL verifier's whitelist (mutation/stacking/comment smuggling refused at construction) and full verdict contract, plus the exact table-delta audit promoted from the Frappe Lending reference matrix \u2014 against LOCAL sqlite fixtures only." - }, - { - "path": "tests/test_effect_file_arrival.py", + "path": "tests/test_halt_learn_loop.py", "kind": "test", "exists": true, "strength": "supported", @@ -420,10 +231,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "File-arrival verdicts (pattern / size>0 / mtime freshness / content probe / duplicate export) against real temp directories, and the SFTP path against an in-memory fake paramiko-shaped transport." + "proves": "A surprise modal halts and emits a learnable trace; teaching promotes a guarded dismiss branch that replays without regression; an underdetermined correction is refused." }, { - "path": "tests/test_effect_kit_config.py", + "path": "tests/test_teach_cli.py", "kind": "test", "exists": true, "strength": "supported", @@ -432,10 +243,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The declarative construction path: env-var auth references fail loud when unset, run-parameter references resolve at build (and refuse to construct unresolved), and pre-kit configs build byte-identically." + "proves": "The `teach` CLI resolves a halt via a correction spec or a recording, refuses an underdetermined fix, and errors on a non-halted run." }, { - "path": "tests/test_effect_verifier_candidates.py", + "path": "tests/test_teach_placement.py", "kind": "test", "exists": true, "strength": "supported", @@ -444,10 +255,27 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI constructs and preflights all reviewed candidates before input, pins the strongest verifier and its pre-state, preserves the binding through durable resume, and refuses an unavailable selected verifier rather than falling back after an action." - }, + "proves": "A recorded fix's own target is carried into the taught bundle; the fix is placed before a step that never acted and after a step that acted (retried, or checked against its expected screen); retrying a step that can write, and a fix with no recorded target, are refused." + } + ], + "errors": [] + }, + { + "id": "identifier-crop-compile-emission", + "claim": "The compiler emits a pixel identifier crop (anchor.identifier_crop) for identity-armed steps without structured identity \u2014 and for any step whose identifying region is marked at record time (--identifier) \u2014 so the pixel-compare identity tier arms on remote-display/pixel replays; every crop-less identity-applicable step records an explicit degrade reason, and lint surfaces per-bundle pixel-identity coverage.", + "tier": "supported", + "reproducibility": null, + "surfaces": [ + "docs" + ], + "strongest_evidence": "supported", + "caveats": [ + "Mechanism proven on synthetic fixtures and the bundled demo app only \u2014 this does NOT re-qualify any desktop/remote-display substrate, and the pixel tier remains MISMATCH-or-ABSTAIN (it can add a safe halt on a wrong identifier, never authorize a match; PIXEL_VERIFY_ENABLED stays off pending a jitter-robust distance).", + "Automatic emission requires an OCR-readable identity band at compile time; icon-only or unreadable rows still compile crop-less (with the recorded reason) and fall back to the OCR band tier at replay." + ], + "evidence": [ { - "path": "tests/test_effect_coverage_lint.py", + "path": "tests/test_compile_identifier_crop.py", "kind": "test", "exists": true, "strength": "supported", @@ -456,10 +284,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "lint warns per consequential step lacking an effect contract and reports coverage %; certify fails the same gap only when the policy sets require_effects_for_irreversible (warn-vs-fail is policy-configurable)." + "proves": "Synthetic-fixture proof of the emission mechanism: a pixel-only recording compiles WITH a crop under templates/identifiers/ (sealed + manifest-hashed like every image crop); a structured recording writes NO identity pixels and records why; explicit --identifier markings (event rect / meta region) win; encrypted save seals the crop and the sealed crop still reaches the tier; the compiled crop drives a wrong-MRN MISMATCH through the real replayer ladder while pixel VERIFY stays hard-gated off (zero-false-accept preserved)." }, { - "path": "tests/test_effect_reconciliation.py", + "path": "tests/test_identifier_crop_lint.py", "kind": "test", "exists": true, "strength": "supported", @@ -468,140 +296,91 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Every escalated verification failure emits a typed ReconciliationTask carrying the one-way contract hash and verdict evidence \u2014 never the resolved selector values." - }, - { - "path": "docs/EFFECT_KIT.md", - "kind": "doc", - "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", - "node": null, - "node_found": null, - "ci_job": null, - "junit_status": null, - "proves": "The operator-facing kit contract: config reference plus Frappe (REST/SQL) and OpenEMR (FHIR/SQL) worked examples targeting the reference fixtures." + "proves": "Lint coverage surfacing: identity-armed steps with vs without crops (missing_identifier_crop findings carry the compiler's degrade reason; warn on band-only identity, info under structured identity)." } ], "errors": [] }, { - "id": "record-check-from-app-reads", - "claim": "scaffold-verifier builds a record check from the reads the app made after the save (the recording's network capture, a SQLite database read path, or a reviewed verifier section), binds the recorded values to run parameters, guards every other table when a database path is given (no row added, changed or removed), and tests the check against injected bad writes before anyone reviews it. A check that misses one is written as a draft with the misses listed. Every effect stays unconfirmed until a person removes the flag.", + "id": "identity-gate-halt-armed", + "claim": "On ambiguity the runtime halts instead of guessing, and an identity gate refuses a wrong-entity (wrong-patient) click \u2014 on ARMED steps only.", "tier": "supported", "reproducibility": null, "surfaces": [ + "README.md", "docs" ], "strongest_evidence": "supported", "caveats": [ - "Proven on synthetic fixtures only (MockMed, the effect_e2e SQLite record service, an OpenEMR-shaped FHIR fake). A check built from API reads alone cannot see writes to tables it does not read, so it stays a draft unless a database path covers them or a person declares the read complete. The fault classes are the effect_e2e taxonomy, not a measured field incident rate.", - "Saves that update an existing record are not handled yet: the check expects one new record. The read's credential is the operator's job; the recording's reads used the browser's sign-in." + "Identity verification covers ONLY armed steps. Real bundles arm a MINORITY of clicks (4 of 12 on a recent live OpenEMR bundle); an UNARMED click proceeds with no identity check whatsoever. Coverage is an auditable per-step metric, but disclosure does not close the gap. `scaffold-verifier --bundle` reports coverage before and after evidence from the recording's DOM / accessibility text at each unarmed click; it proposes only evidence the runtime checks on that surface, and a person applies it." ], "evidence": [ { - "path": "tests/test_record_check_synthesis.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_database_read_path_covers_every_table_and_passes_the_suite", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "On the benchmark/effect_e2e record service, a check built from a database read path catches every injected bad write end to end through the real replayer (including the stray billing write) and passes the clean save." - }, - { - "path": "tests/test_record_check_synthesis.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_one_rest_read_misses_the_billing_write_and_stays_a_draft", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A check built from one REST read misses the stray billing write, both in the recorded-state fault test and end to end, and is written as a draft with that miss listed." - }, - { - "path": "tests/test_record_check_synthesis.py", + "path": "tests/test_identity.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": "test_mockmed_needs_a_declared_complete_read", - "node_found": true, + "node": null, + "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "On the MockMed --break-it fault server, the check built from the app's /api/db read catches every fault end to end once a person declares the read complete, and stays a draft until then." + "proves": "Wrong-entity / near-name sibling / generic-band / param-in-band probes: the identity check refuses to verify a mismatched target and never arms on non-discriminative bands." }, { - "path": "tests/test_record_check_synthesis.py", + "path": "tests/test_disambiguation.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": "test_openemr_fhir_check_refutes_store_level_faults", - "node_found": true, + "node": null, + "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "On the OpenEMR-shaped FHIR R4 fake, the check found from the Observation search refutes partial, duplicate, phantom, wrong-patient and lost-update faults and confirms the clean save." + "proves": "Underdetermined targets surface as explicit disambiguation rather than a guessed click." }, { - "path": "tests/test_record_check_synthesis.py", + "path": "tests/test_identity_fuzz.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": "test_guards_catch_a_changed_or_deleted_row_through_the_real_read", - "node_found": true, + "node": null, + "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The generated SQL reads, run against a real SQLite file, refute a save that also changed or deleted a row in another table." + "proves": "Public property-based checks preserve the never-false-accept invariant for collapsible identifiers while requiring clean identifiers to remain verifiable." }, { - "path": "tests/test_record_check_synthesis.py", + "path": "tests/test_identity_ladder.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": "test_verify_run_refuses_until_a_person_removes_the_flags", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "verify-run refuses the proposed check until every needs_operator_confirmation line is removed." - }, - { - "path": "docs/EFFECT_KIT.md", - "kind": "doc", - "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", "node": null, "node_found": null, - "ci_job": null, + "ci_job": "test", "junit_status": null, - "proves": "The operator guide: inputs, outputs, the fault classes, and what the proof does not cover." + "proves": "The identity resolution ladder (structural/template/OCR) escalation." } ], "errors": [] }, { - "id": "ui-readback-separate-session", - "claim": "With no API or database access, a save can be checked through the application's own record page: a separate browser with a new, empty context and its own sign-in opens the record by identifier, confirms the page shows that identifier, reads the saved fields from the page structure, and judges them with the shared effect judge. After sign-in the session refuses every request that is not a read. The check declares tier 2 (a separate session) and is never labeled a system-of-record read.", + "id": "lookup-teaches-the-check", + "claim": "When a recording shows the person or the agent look the record up after saving, Flow proposes that look-up as the record check with no marking or configuration: a same-session check and, for desktop, RDP and Citrix recordings, a separate-session desktop_readback. Every proposal waits for a person.", "tier": "supported", "reproducibility": null, "surfaces": [ - "README.md", "docs" ], "strongest_evidence": "supported", "caveats": [ - "Measured on synthetic fixtures (MockMed and the effect_e2e record service) whose record pages were written for these tests, not on a production application's record pages. The check sees only what a record page shows and is only as independent as the page's own read path." + "Measured on one synthetic kiosk recording. The detector needs a save button with a save word, a typed and submitted search, and the saved values readable by OCR on the last frame." ], "evidence": [ { - "path": "tests/test_ui_readback_verifier.py", + "path": "tests/test_lookup_detect.py", "kind": "test", "exists": true, "strength": "supported", @@ -610,10 +389,27 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The verdict rules without a browser: confirms, refutes partial, duplicate and lost-update saves, never claims absence as proof that nothing was saved, halts on another record's page, a refused request, a changed layout, a shortened value, an unfresh session or a failed sign-in, declares tier 2, and keeps every existing verifier identity digest unchanged." - }, + "proves": "On a synthetic recording of the RDP kiosk: finds the save by its OCR label, the search, and only the values the look-up brought onto the screen (not the saved form still showing the same text); proposes nothing without a look-up; the proposed desktop_readback, with only its address filled in, confirms the booking through real OCR from separate sessions; check accept writes check.json and never overwrites one; record --verify needs no file and ends with the look-up prompt when none is found." + } + ], + "errors": [] + }, + { + "id": "mockmed-benchmark-ci-reproducible", + "claim": "The MockMed benchmark is CI-reproducible: compiled replay finishes ~4.9s p50 with zero model calls versus ~37.5s p50 (~$0.27/run) for the agent. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build; not re-measured on a later release.", + "tier": "supported", + "reproducibility": null, + "surfaces": [ + "README.md", + "docs" + ], + "strongest_evidence": "supported", + "caveats": [ + "The published latency/cost figures come from a dated run artifact measured on Flow 0.1.0 (pre-v0.2.0 source checkout; exact runtime HEAD not retained) on 2026-07-08; the app is intentionally simple, so success rate (100/100 vs 20/20) is not the story \u2014 the standing cost/latency delta is. Agent cost is a list-price estimate." + ], + "evidence": [ { - "path": "tests/test_ui_readback_browser.py", + "path": "tests/test_mockmed.py", "kind": "test", "exists": true, "strength": "supported", @@ -622,10 +418,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "In a real browser against MockMed's server-rendered record pages: its own sign-in even when another session is signed in, refuted wrong saves, fetch/beacon/XHR/form posts refused with none reaching the server, display changes that stop rather than pass, and tier-2 evidence through the real replayer." + "proves": "The MockMed app + drift screens are deterministic and reachable, the substrate the benchmark replays against." }, { - "path": "tests/test_ui_readback_benchmark.py", + "path": "tests/test_benchmark.py", "kind": "test", "exists": true, "strength": "supported", @@ -634,10 +430,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "A subset of the measurement: the same-screen check misses accepted wrong saves, the UI read-back catches partial, wrong-record and lost-update saves, and the measured blind spots stay blind." + "proves": "The benchmark harness / report accounting that produces the numbers." }, { - "path": "benchmark/ui_readback", + "path": "benchmark/BENCHMARK.md", "kind": "benchmark", "exists": true, "strength": "roadmap", @@ -646,14 +442,14 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The full measurement next to a same-screen check and an API read, on the GUI replay and API-write fault lists plus display probes." + "proves": "Full numbers, methodology, and caveats for the CI-reproducible MockMed comparison (dated run artifact)." } ], "errors": [] }, { - "id": "desktop-readback-separate-session", - "claim": "A save in a desktop, RDP or Citrix application can be checked the way a person checks it: a separate session that is never the one that typed searches for the record, opens the one result that shows its identifier, confirms the record view shows that identifier, and reads the saved fields through UI Automation or OCR, judged by the shared effect judge. The look-up types only into the search box and never clicks a control with a save-like label. With its own sign-in it declares tier 2 (a separate session); without one, tier 3. It is never labeled a system-of-record read.", + "id": "qualified-remote-decision-v2-supported", + "claim": "A negotiated V2 attended task binds optional reviewed entity wording to the exact qualification, bundle, step, policy, and pause authority. An unqualified or unrecognized entity class stays local and the remote task uses the signed neutral record or item fallback.", "tier": "supported", "reproducibility": null, "surfaces": [ @@ -661,11 +457,12 @@ ], "strongest_evidence": "supported", "caveats": [ - "The WinForms fixture runs as a UI Automation stand-in that mirrors patient_notes.ps1 and its pn_db.py persistence, and the kiosk as pixels drawn at the Tk layout; neither is the live Windows VM or the Docker RDP fixture in this evidence. On the pixel path OpenAdapt cannot prove where keyboard focus is; it checks the search box shows the query before it submits." + "V2 requires openadapt-types 0.10.x and explicit peer negotiation. The dependency does not upgrade a V1 consumer, and the byte-compatible V1 path remains available.", + "The entity class is presentation metadata only. Actual record identity remains inside the customer-controlled runner and is revalidated before any resumed action." ], "evidence": [ { - "path": "tests/test_desktop_readback.py", + "path": "tests/test_attended_actions.py", "kind": "test", "exists": true, "strength": "supported", @@ -674,26 +471,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "On the WinForms patient-notes fixture through the real in-guest agent and Windows client (UI Automation): confirms a saved note, refutes a wrong one, opens only the row that shows the full identity past a same-first-name decoy, halts on two matching rows, and refuses a search button with a save-like label. On the RDP kiosk's look-up panel through the RDP backend and real OCR: confirms a booking from its own RDP logon (tier 2), never turns an OCR mismatch into REFUTED, and never takes \"not found\" as proof that nothing was saved. The same look-up confirms through a Citrix Workspace window and a native macOS window (tier 3, a window as the same user). Neither fixture's save control or form is touched. The deployment refuses a read-back session that is the session that types." - } - ], - "errors": [] - }, - { - "id": "lookup-teaches-the-check", - "claim": "When a recording shows the person or the agent look the record up after saving, Flow proposes that look-up as the record check with no marking or configuration: a same-session check and, for desktop, RDP and Citrix recordings, a separate-session desktop_readback. Every proposal waits for a person.", - "tier": "supported", - "reproducibility": null, - "surfaces": [ - "docs" - ], - "strongest_evidence": "supported", - "caveats": [ - "Measured on one synthetic kiosk recording. The detector needs a save button with a save word, a typed and submitted search, and the saved values readable by OCR on the last frame." - ], - "evidence": [ + "proves": "Required CI covers the V1-compatible and V2 signed envelopes, provenance binding, remote-safe entity vocabulary, idempotent decisions, and fresh revalidation before resumed actuation." + }, { - "path": "tests/test_lookup_detect.py", + "path": "tests/test_qualification_project.py", "kind": "test", "exists": true, "strength": "supported", @@ -702,79 +483,127 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "On a synthetic recording of the RDP kiosk: finds the save by its OCR label, the search, and only the values the look-up brought onto the screen (not the saved form still showing the same text); proposes nothing without a look-up; the proposed desktop_readback, with only its address filled in, confirms the booking through real OCR from separate sessions; check accept writes check.json and never overwrites one; record --verify needs no file and ends with the look-up prompt when none is found." + "proves": "Required CI requires the current exact qualification contract before the V2 producer can emit its reviewed presentation metadata." + }, + { + "path": "docs/DECISION_DELIVERY.md", + "kind": "doc", + "exists": true, + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", + "node": null, + "node_found": null, + "ci_job": null, + "junit_status": null, + "proves": "The delivery contract defines explicit V2 negotiation, neutral V1 fallback, and the local boundary for actual entity identifiers." } ], "errors": [] }, { - "id": "identity-gate-halt-armed", - "claim": "On ambiguity the runtime halts instead of guessing, and an identity gate refuses a wrong-entity (wrong-patient) click \u2014 on ARMED steps only.", + "id": "record-check-from-app-reads", + "claim": "scaffold-verifier builds a record check from the reads the app made after the save (the recording's network capture, a SQLite database read path, or a reviewed verifier section), binds the recorded values to run parameters, guards every other table when a database path is given (no row added, changed or removed), and tests the check against injected bad writes before anyone reviews it. A check that misses one is written as a draft with the misses listed. Every effect stays unconfirmed until a person removes the flag.", "tier": "supported", "reproducibility": null, "surfaces": [ - "README.md", "docs" ], "strongest_evidence": "supported", "caveats": [ - "Identity verification covers ONLY armed steps. Real bundles arm a MINORITY of clicks (4 of 12 on a recent live OpenEMR bundle); an UNARMED click proceeds with no identity check whatsoever. Coverage is an auditable per-step metric, but disclosure does not close the gap. `scaffold-verifier --bundle` reports coverage before and after evidence from the recording's DOM / accessibility text at each unarmed click; it proposes only evidence the runtime checks on that surface, and a person applies it." + "Proven on synthetic fixtures only (MockMed, the effect_e2e SQLite record service, an OpenEMR-shaped FHIR fake). A check built from API reads alone cannot see writes to tables it does not read, so it stays a draft unless a database path covers them or a person declares the read complete. The fault classes are the effect_e2e taxonomy, not a measured field incident rate.", + "Saves that update an existing record are not handled yet: the check expects one new record. The read's credential is the operator's job; the recording's reads used the browser's sign-in." ], "evidence": [ { - "path": "tests/test_identity.py", + "path": "tests/test_record_check_synthesis.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": null, - "node_found": null, + "node": "test_database_read_path_covers_every_table_and_passes_the_suite", + "node_found": true, "ci_job": "test", "junit_status": null, - "proves": "Wrong-entity / near-name sibling / generic-band / param-in-band probes: the identity check refuses to verify a mismatched target and never arms on non-discriminative bands." + "proves": "On the benchmark/effect_e2e record service, a check built from a database read path catches every injected bad write end to end through the real replayer (including the stray billing write) and passes the clean save." }, { - "path": "tests/test_disambiguation.py", + "path": "tests/test_record_check_synthesis.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": null, - "node_found": null, + "node": "test_one_rest_read_misses_the_billing_write_and_stays_a_draft", + "node_found": true, "ci_job": "test", "junit_status": null, - "proves": "Underdetermined targets surface as explicit disambiguation rather than a guessed click." + "proves": "A check built from one REST read misses the stray billing write, both in the recorded-state fault test and end to end, and is written as a draft with that miss listed." }, { - "path": "tests/test_identity_fuzz.py", + "path": "tests/test_record_check_synthesis.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", - "node": null, - "node_found": null, + "node": "test_mockmed_needs_a_declared_complete_read", + "node_found": true, "ci_job": "test", "junit_status": null, - "proves": "Public property-based checks preserve the never-false-accept invariant for collapsible identifiers while requiring clean identifiers to remain verifiable." + "proves": "On the MockMed --break-it fault server, the check built from the app's /api/db read catches every fault end to end once a person declares the read complete, and stays a draft until then." }, { - "path": "tests/test_identity_ladder.py", + "path": "tests/test_record_check_synthesis.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_openemr_fhir_check_refutes_store_level_faults", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "On the OpenEMR-shaped FHIR R4 fake, the check found from the Observation search refutes partial, duplicate, phantom, wrong-patient and lost-update faults and confirms the clean save." + }, + { + "path": "tests/test_record_check_synthesis.py", "kind": "test", "exists": true, "strength": "supported", "gating": "ci (required PR gate (test))", + "node": "test_guards_catch_a_changed_or_deleted_row_through_the_real_read", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "The generated SQL reads, run against a real SQLite file, refute a save that also changed or deleted a row in another table." + }, + { + "path": "tests/test_record_check_synthesis.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_verify_run_refuses_until_a_person_removes_the_flags", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "verify-run refuses the proposed check until every needs_operator_confirmation line is removed." + }, + { + "path": "docs/EFFECT_KIT.md", + "kind": "doc", + "exists": true, + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", "node": null, "node_found": null, - "ci_job": "test", + "ci_job": null, "junit_status": null, - "proves": "The identity resolution ladder (structural/template/OCR) escalation." + "proves": "The operator guide: inputs, outputs, the fault classes, and what the proof does not cover." } ], "errors": [] }, { - "id": "identifier-crop-compile-emission", - "claim": "The compiler emits a pixel identifier crop (anchor.identifier_crop) for identity-armed steps without structured identity \u2014 and for any step whose identifying region is marked at record time (--identifier) \u2014 so the pixel-compare identity tier arms on remote-display/pixel replays; every crop-less identity-applicable step records an explicit degrade reason, and lint surfaces per-bundle pixel-identity coverage.", + "id": "reviewed-judgment-cases-supported", + "claim": "A qualification project can bind typed local facts, evidence hashes, reviewer provenance, and the exact decision contract to reviewed examples and counterfactuals. It can retain permanent human authority, record a reviewed automatic-rule candidate, or refuse certification until more evidence exists, without converting one historical choice into policy.", "tier": "supported", "reproducibility": null, "surfaces": [ @@ -782,12 +611,12 @@ ], "strongest_evidence": "supported", "caveats": [ - "Mechanism proven on synthetic fixtures and the bundled demo app only \u2014 this does NOT re-qualify any desktop/remote-display substrate, and the pixel tier remains MISMATCH-or-ABSTAIN (it can add a safe halt on a wrong identifier, never authorize a match; PIXEL_VERIFY_ENABLED stays off pending a jitter-robust distance).", - "Automatic emission requires an OCR-readable identity band at compile time; icon-only or unreadable rows still compile crop-less (with the recorded reason) and fall back to the OCR band tier at replay." + "An automatic-rule case names only a reviewed rule identifier and finite option. Flow does not infer or generate executable policy from the case; the rule must be authored and qualified through the normal program path.", + "A retained human-node case preserves runtime human authority. A more-evidence-required case refuses certification instead of guessing." ], "evidence": [ { - "path": "tests/test_compile_identifier_crop.py", + "path": "tests/test_judgment_cases.py", "kind": "test", "exists": true, "strength": "supported", @@ -796,10 +625,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Synthetic-fixture proof of the emission mechanism: a pixel-only recording compiles WITH a crop under templates/identifiers/ (sealed + manifest-hashed like every image crop); a structured recording writes NO identity pixels and records why; explicit --identifier markings (event rect / meta region) win; encrypted save seals the crop and the sealed crop still reaches the tier; the compiled crop drives a wrong-MRN MISMATCH through the real replayer ladder while pixel VERIFY stays hard-gated off (zero-false-accept preserved)." + "proves": "Required CI covers closed fact schemas, exact workflow and decision bindings, local-only evidence references, conflict refusal, reciprocal contrast coverage for automatic-rule candidates, retained human authority, unresolved-evidence refusal, and the invariant that case evaluation never edits or synthesizes the executable rule." }, { - "path": "tests/test_identifier_crop_lint.py", + "path": "tests/test_qualification_project.py", "kind": "test", "exists": true, "strength": "supported", @@ -808,27 +637,40 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Lint coverage surfacing: identity-armed steps with vs without crops (missing_identifier_crop findings carry the compiler's degrade reason; warn on band-only identity, info under structured identity)." + "proves": "Required CI binds the reviewed local evidence bytes and review note into certification, reproduces that exact contract when a qualified workflow is saved, and refuses changed case or evidence digests." + }, + { + "path": "docs/BUSINESS_DECISIONS.md", + "kind": "doc", + "exists": true, + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", + "node": null, + "node_found": null, + "ci_job": null, + "junit_status": null, + "proves": "The public contract separates qualification-time judgment capture from one live runtime answer and describes the scriptable authoring and judgment-case interfaces." } ], "errors": [] }, { - "id": "halt-teach-promote", - "claim": "A halt is learnable: halt -> teach a correction -> promote a guarded branch, refusing underdetermined fixes.", + "id": "substrate-runtime-validation-supported", + "claim": "Runtime-validation v3 binds Standard and Regulated hosted activation to the exact governed authorization template reproduced from the sealed qualification. It also binds the successful run's resolved target kind (`web|windows|macos|linux|rdp|citrix`), artifact, compiler, parameter schema, strict lint, policy, risk, report, and opaque environment. Web retains its exact HTTPS/host boundary. Native and remote execution emits no app, window, host, readiness, or backend-hint values to Cloud. Local verification retains signed v1 and v2 compatibility.", "tier": "supported", "reproducibility": null, "surfaces": [ "README.md", - "docs" + "docs", + "website" ], "strongest_evidence": "supported", "caveats": [ - "Promotion is governed by a regression gate that blocks identity- weakening corrections; the loop refuses to guess when the fix is underdetermined." + "The HMAC proves operator-token possession and envelope integrity; it is not independent observation of the local replay or certification of an arbitrary target application." ], "evidence": [ { - "path": "tests/test_halt_learn_loop.py", + "path": "tests/test_runtime_validation.py", "kind": "test", "exists": true, "strength": "supported", @@ -837,10 +679,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "A surprise modal halts and emits a learnable trace; teaching promotes a guarded dismiss branch that replays without regression; an underdetermined correction is refused." + "proves": "Required CI exercises all six target kinds, validates v3 against its closed JSON Schema, refuses a Standard or Regulated activation without an exact template, binds the template SHA to the HMAC, preserves web URL/host checks, keeps native/remote execution empty, verifies the canonical HMAC vector, and retains signed v1/v2 compatibility." }, { - "path": "tests/test_teach_cli.py", + "path": "tests/test_cli_new_commands.py", "kind": "test", "exists": true, "strength": "supported", @@ -849,19 +691,19 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The `teach` CLI resolves a halt via a correction spec or a recording, refuses an underdetermined fix, and errors on a non-halted run." + "proves": "Required CI carries the resolved web, Windows, and Citrix backend token through durable resume into the new run report rather than trusting an upload-time relabel." }, { - "path": "tests/test_teach_placement.py", - "kind": "test", + "path": "schemas/runtime-validation-attestation-v3.json", + "kind": "doc", "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", "node": null, "node_found": null, - "ci_job": "test", + "ci_job": null, "junit_status": null, - "proves": "A recorded fix's own target is carried into the taught bundle; the fix is placed before a step that never acted and after a step that acted (retried, or checked against its expected screen); retrying a step that can write, and a fix with no recorded target, are refused." + "proves": "The public closed envelope requires target_kind and the governed authorization template SHA, and conditionally permits browser execution fields only for web." } ], "errors": [] @@ -908,21 +750,21 @@ "errors": [] }, { - "id": "reviewed-judgment-cases-supported", - "claim": "A qualification project can bind typed local facts, evidence hashes, reviewer provenance, and the exact decision contract to reviewed examples and counterfactuals. It can retain permanent human authority, record a reviewed automatic-rule candidate, or refuse certification until more evidence exists, without converting one historical choice into policy.", + "id": "ui-readback-separate-session", + "claim": "With no API or database access, a save can be checked through the application's own record page: a separate browser with a new, empty context and its own sign-in opens the record by identifier, confirms the page shows that identifier, reads the saved fields from the page structure, and judges them with the shared effect judge. After sign-in the session refuses every request that is not a read. The check declares tier 2 (a separate session) and is never labeled a system-of-record read.", "tier": "supported", "reproducibility": null, "surfaces": [ + "README.md", "docs" ], "strongest_evidence": "supported", "caveats": [ - "An automatic-rule case names only a reviewed rule identifier and finite option. Flow does not infer or generate executable policy from the case; the rule must be authored and qualified through the normal program path.", - "A retained human-node case preserves runtime human authority. A more-evidence-required case refuses certification instead of guessing." + "Measured on synthetic fixtures (MockMed and the effect_e2e record service) whose record pages were written for these tests, not on a production application's record pages. The check sees only what a record page shows and is only as independent as the page's own read path." ], "evidence": [ { - "path": "tests/test_judgment_cases.py", + "path": "tests/test_ui_readback_verifier.py", "kind": "test", "exists": true, "strength": "supported", @@ -931,10 +773,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI covers closed fact schemas, exact workflow and decision bindings, local-only evidence references, conflict refusal, reciprocal contrast coverage for automatic-rule candidates, retained human authority, unresolved-evidence refusal, and the invariant that case evaluation never edits or synthesizes the executable rule." + "proves": "The verdict rules without a browser: confirms, refutes partial, duplicate and lost-update saves, never claims absence as proof that nothing was saved, halts on another record's page, a refused request, a changed layout, a shortened value, an unfresh session or a failed sign-in, declares tier 2, and keeps every existing verifier identity digest unchanged." }, { - "path": "tests/test_qualification_project.py", + "path": "tests/test_ui_readback_browser.py", "kind": "test", "exists": true, "strength": "supported", @@ -943,11 +785,23 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI binds the reviewed local evidence bytes and review note into certification, reproduces that exact contract when a qualified workflow is saved, and refuses changed case or evidence digests." + "proves": "In a real browser against MockMed's server-rendered record pages: its own sign-in even when another session is signed in, refuted wrong saves, fetch/beacon/XHR/form posts refused with none reaching the server, display changes that stop rather than pass, and tier-2 evidence through the real replayer." }, { - "path": "docs/BUSINESS_DECISIONS.md", - "kind": "doc", + "path": "tests/test_ui_readback_benchmark.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": null, + "node_found": null, + "ci_job": "test", + "junit_status": null, + "proves": "A subset of the measurement: the same-screen check misses accepted wrong saves, the UI read-back catches partial, wrong-record and lost-update saves, and the measured blind spots stay blind." + }, + { + "path": "benchmark/ui_readback", + "kind": "benchmark", "exists": true, "strength": "roadmap", "gating": "artifact (doc/benchmark)", @@ -955,27 +809,302 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The public contract separates qualification-time judgment capture from one live runtime answer and describes the scriptable authoring and judgment-case interfaces." + "proves": "The full measurement next to a same-screen check and an API read, on the GUI replay and API-write fault lists plus display probes." } ], "errors": [] }, { - "id": "qualified-remote-decision-v2-supported", - "claim": "A negotiated V2 attended task binds optional reviewed entity wording to the exact qualification, bundle, step, policy, and pause authority. An unqualified or unrecognized entity class stays local and the remote task uses the signed neutral record or item fallback.", + "id": "web-supported", + "claim": "The Playwright browser path records a GUI workflow and replays it deterministically and locally. Required CI exercises the recorder, compiler, and replay contract.", "tier": "supported", "reproducibility": null, "surfaces": [ + "README.md", + "website", "docs" ], "strongest_evidence": "supported", "caveats": [ - "V2 requires openadapt-types 0.10.x and explicit peer negotiation. The dependency does not upgrade a V1 consumer, and the byte-compatible V1 path remains available.", - "The entity class is presentation metadata only. Actual record identity remains inside the customer-controlled runner and is revalidated before any resumed action." + "`supported` names the registry's required-CI evidence tier. It is not a product state or a general application claim. Production requires active release admissions for all seven product targets. A Production run also needs an active workflow admission for the exact sealed bundle.", + "The full record->compile->replay browser suite runs in the required e2e-browser PR gate and repeats in the weekly compatibility matrix.", + "Existing-session attachment is Chromium-only and loopback-only. It requires a dedicated browser process with remote debugging. The Playwright-native browser path owns this claim. Capture extension code is outside its evidence scope." + ], + "evidence": [ + { + "path": "tests/e2e/test_record_compile_replay.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (e2e-browser))", + "node": null, + "node_found": null, + "ci_job": "e2e-browser", + "junit_status": null, + "proves": "Records the MockMed browser demo once, compiles it, and replays it under baseline + theme/move/rename drift and parameter substitution through the headless-browser Backend." + }, + { + "path": "tests/test_mockmed.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": null, + "node_found": null, + "ci_job": "test", + "junit_status": null, + "proves": "The reference browser demo app and its drift screens render deterministically (no CSS transitions), so replay is repeatable." + }, + { + "path": "tests/test_replayer.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": null, + "node_found": null, + "ci_job": "test", + "junit_status": null, + "proves": "The deterministic replayer resolves steps, substitutes parameters, enforces postconditions and the risk gate \u2014 no model in the loop." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_live_cdp_attach_records_compiles_and_leaves_browser_running_three_trials", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "Three real Chromium CDP-attach trials record and compile the same synthetic workflow, exclude password values before persistence, preserve CSS-pixel frame/coordinate alignment, and detach without closing the external browser. The same live campaign covers same-task replacement, declared open and closed shadow hosts, contenteditable click metadata, and same-document URL/title reflection through history.replaceState. A live case records and compiles actions across viewport and monitor-scale changes. It binds each event to its exact frame dimensions. A separate live case refuses an action that overlaps the transition. Unit cases refuse remote endpoints, cross-origin selectors and navigation, iframe events, invalid viewport evidence, and ambiguous same-origin tabs." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_launched_recording_withholds_a_later_document_url_after_a_get_submit", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A live Chromium recording submits a same-origin GET form. The document that submit reaches is a fresh closure that holds no value to match against, so Flow withholds its URL and its title and says so, and the recorded surface is stamped before publish." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_launched_recording_withholds_a_redirect_that_puts_the_value_in_a_path", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A server that answers a GET submit with a 302 to `/results/` puts a declared secret in a path segment, where no parameter name identifies it. Flow withholds the whole URL for every document after the one that first held the value, so the literal never reaches events.jsonl." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_keeps_url_and_identity_evidence_for_a_lowercase_secret", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A lowercase secret typed one character at a time into a page whose URL, title, and button ID share those characters leaves the URL, the title, the DOM selector, and the accessible name exact." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_keeps_all_evidence_for_a_password_starting_with_a_word", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A password that begins with a common English word leaves that word exact in the page URL, the page title, the clicked row's identity characters, the accessible name, and an unrelated button ID. Matching uses only the value the field holds at that moment, so an intermediate keystroke prefix never becomes a matching value." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_withholds_identity_that_holds_a_declared_value", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "Identity evidence that holds a declared value is WITHHELD with a stated reason, never rewritten. Replay compares identity evidence against the live page, so a rewritten copy would compare against characters the page never showed, invisibly. No placeholder string appears anywhere in the recorded evidence." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_withholds_a_stale_reflection_from_a_swapping_input", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A page that replaces its input element on every keystroke and writes the value into its URL and title can end up showing a version the field no longer holds. Flow withholds that reflected text whole -- an origin-only URL and an empty title -- instead of matching it against the current value, and keeps the clicked element's identity evidence exact." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_still_reports_a_same_document_route_after_the_fix", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A single-page application route change through history.pushState does not build a new document, so the closure that held the declared value is the one being sampled and its URL is still reported exactly. The cross-document rule that withholds a later document's URL therefore does not cost this evidence." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_withholds_a_title_a_consumed_field_produced", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A scanner input that writes the badge into the page URL and title and then clears its own field holds nothing at any moment Flow samples. Flow arms the document's secret boundary from the input event itself, so both channels are checked and both are withheld." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_keeps_a_consumed_value_across_a_second_entry", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A second scan into the same cleared field does not displace the first badge while the first badge is still shown in the URL. A value the next one does not continue was taken by the page, not edited away by the operator, so it is promoted into the withhold-only set." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_keeps_a_consumed_value_while_another_field_is_live", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A second declared field holding a value does not re-expose the first field's consumed value. The last-value test is per element, so the same URL is withheld before and after the second field is filled." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_withholds_a_selector_built_from_an_inbound_value", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A DOM selector is identity evidence and uses the same value set as the accessible name and the clicked-row identity. An element id built from a value carried in an inbound declared parameter is withheld with a reason, not emitted verbatim." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_drops_only_the_unproven_parameter_value", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A query parameter whose value Flow cannot prove predates the moment the document first held a declared value loses only ITS value. Every parameter name survives, the path stays exact, and the drop is recorded with its reason." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_withholds_a_url_that_holds_the_value_in_its_path", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A value that no parameter name identifies -- here written into a path segment -- is caught by detection rather than structure: Flow withholds the whole URL, marks it, and warns the operator that the application placed a declared secret into its own URL." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_withholds_identity_after_the_field_is_removed", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "A single-page wizard that removes its declared field and renders the value into a summary row cannot leak it into the clicked row's identity: the value the field held at a commit point is retained for the single purpose of WITHHOLDING identity text, never to rewrite it and never for the URL or the title." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_marks_a_withheld_secret_field_name", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "Flow never reads the visible text of a bound secret field, because that text is the value. The resulting missing accessible name is reported as WITHHELD with a reason and counted, never left as a silent null, while a control field beside it returns its name." + }, + { + "path": "tests/test_browser_attach.py", + "kind": "test", + "exists": true, + "strength": "supported", + "gating": "ci (required PR gate (test))", + "node": "test_page_closure_emits_no_reflected_text_from_the_capture_phase", + "node_found": true, + "ci_job": "test", + "junit_status": null, + "proves": "No browser event carries a URL or a title. The in-page listeners run in the capture phase, before the page's own handlers, so anything they read describes the state before the action. Flow samples reflected evidence from Python at the settled boundary instead." + } + ], + "errors": [] + }, + { + "id": "citrix-pixel-validating", + "claim": "Citrix uses a dedicated exact-Workspace-window backend beneath the governed pixel-only remote-display contract. Required CI covers its readiness gate, governed execution, durable resume, report binding, and refusal contracts; the counted no-DOM qualification covers the driver, visual ladder, independent effects, and drift halts. Live ICA/HDX acceptance remains separately bound to the exact deployment.", + "tier": "validating", + "reproducibility": null, + "surfaces": [ + "README.md", + "docs", + "website" + ], + "strongest_evidence": "supported", + "caveats": [ + "PIXEL-ONLY: no UIA/DOM crosses to the driver. On-screen OCR read-back is SAME-SURFACE, not an independent system-of-record check.", + "A Parallels VM window is a Citrix ANALOG; real HDX/latency/DPI/lock- screen drift is not simulated. OPT-IN + infra-gated (`OAFLOW_CITRIX_PIXEL_E2E=1` or `OAFLOW_CITRIX_STANDIN_E2E=1`); neither live-window proof runs on default CI, and neither replaces a counted live ICA/HDX acceptance record.", + "The public real-acceptance harness contains no customer recipe, credential, identifier, screenshot, or deployment-specific threshold. A private qualified configuration supplies those exact bindings." ], "evidence": [ { - "path": "tests/test_attended_actions.py", + "path": "tests/e2e/test_citrix_pixel_e2e.py", + "kind": "test", + "exists": true, + "strength": "validating", + "gating": "opt-in (OAFLOW_CITRIX_PIXEL_E2E)", + "node": null, + "node_found": null, + "ci_job": "validating", + "junit_status": null, + "proves": "OPT-IN pixel-only proof: structural_armed_coverage == 0, replay resolves on template/ocr/geometry only, on-screen OCR read-back verifies the write, the identity gate HALTs on a look-alike patient, and render drift triggers halt-on-ambiguity." + }, + { + "path": "tests/test_pixel_identity_probe.py", "kind": "test", "exists": true, "strength": "supported", @@ -984,10 +1113,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI covers the V1-compatible and V2 signed envelopes, provenance binding, remote-safe entity vocabulary, idempotent decisions, and fresh revalidation before resumed actuation." + "proves": "The pixel-substrate identity probe behind the on-pixels identity gate." }, { - "path": "tests/test_qualification_project.py", + "path": "tests/test_citrix_workspace_backend.py", "kind": "test", "exists": true, "strength": "supported", @@ -996,39 +1125,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI requires the current exact qualification contract before the V2 producer can emit its reviewed presentation metadata." + "proves": "Required CI covers the dedicated backend preset, exact owner/title overrides, readiness probe construction, pixel-only capability boundary, backend factory, and product CLI selectors." }, { - "path": "docs/DECISION_DELIVERY.md", - "kind": "doc", - "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", - "node": null, - "node_found": null, - "ci_job": null, - "junit_status": null, - "proves": "The delivery contract defines explicit V2 negotiation, neutral V1 fallback, and the local boundary for actual entity identifiers." - } - ], - "errors": [] - }, - { - "id": "mockmed-benchmark-ci-reproducible", - "claim": "The MockMed benchmark is CI-reproducible: compiled replay finishes ~4.9s p50 with zero model calls versus ~37.5s p50 (~$0.27/run) for the agent. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build; not re-measured on a later release.", - "tier": "supported", - "reproducibility": null, - "surfaces": [ - "README.md", - "docs" - ], - "strongest_evidence": "supported", - "caveats": [ - "The published latency/cost figures come from a dated run artifact measured on Flow 0.1.0 (pre-v0.2.0 source checkout; exact runtime HEAD not retained) on 2026-07-08; the app is intentionally simple, so success rate (100/100 vs 20/20) is not the story \u2014 the standing cost/latency delta is. Agent cost is a list-price estimate." - ], - "evidence": [ - { - "path": "tests/test_mockmed.py", + "path": "tests/test_run_gate.py", "kind": "test", "exists": true, "strength": "supported", @@ -1037,10 +1137,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The MockMed app + drift screens are deterministic and reachable, the substrate the benchmark replays against." + "proves": "Required CI refuses governed Citrix execution before action when its readiness binding is absent or blank, admits a sealed bundle carrying a recorded readiness binding, and reports only the resolved backend token rather than sensitive target strings." }, { - "path": "tests/test_benchmark.py", + "path": "tests/test_cli_new_commands.py", "kind": "test", "exists": true, "strength": "supported", @@ -1049,53 +1149,34 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The benchmark harness / report accounting that produces the numbers." + "proves": "Required CI restores the recorded Citrix owner, exact title, and readiness binding through durable approve/resume, and refuses before backend construction when resumed configuration is incomplete." }, { - "path": "benchmark/BENCHMARK.md", - "kind": "benchmark", + "path": "tests/test_hosted.py", + "kind": "test", "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", + "strength": "supported", + "gating": "ci (required PR gate (test))", "node": null, "node_found": null, - "ci_job": null, + "ci_job": "test", "junit_status": null, - "proves": "Full numbers, methodology, and caveats for the CI-reproducible MockMed comparison (dated run artifact)." - } - ], - "errors": [] - }, - { - "id": "windows-desktop-validating", - "claim": "Windows UIA has scoped acceptance: the deterministic structural rung delivered native actions in a fixed WinForms workflow with independent effects and fail-closed stale/ambiguity refusal.", - "tier": "validating", - "reproducibility": null, - "surfaces": [ - "README.md", - "docs", - "website" - ], - "strongest_evidence": "supported", - "caveats": [ - "The live desktop e2e is OPT-IN and infra-gated (needs a Parallels Win11-ARM VM; `OAFLOW_PARALLELS_E2E=1`); it never runs on default CI. Only the mocked backend protocol runs in CI.", - "Acceptance covers the named in-tree workflow and exact Windows VM. Third-party applications require workflow-specific qualification." - ], - "evidence": [ + "proves": "Required CI binds a completed local Citrix report to the closed `citrix` execution token without copying target owner, title, or readiness values into the hosted summary." + }, { - "path": "tests/e2e/test_parallels_desktop_e2e.py", + "path": "tests/e2e/test_citrix_workspace_standin_e2e.py", "kind": "test", "exists": true, "strength": "validating", - "gating": "opt-in (OAFLOW_PARALLELS_E2E)", + "gating": "opt-in (OAFLOW_CITRIX_STANDIN_E2E)", "node": null, "node_found": null, "ci_job": "validating", "junit_status": null, - "proves": "OPT-IN live proof on a real Win11-ARM VM: record->compile->replay through WindowsBackend with the structural rung resolving every click by AutomationId (armed_coverage == 1.0)." + "proves": "The dedicated Citrix backend passes three healthy effect-confirmed record->compile->replay trials and three severe-drift safe-halts over a no-DOM surface, with zero model calls, false completion, or silent incorrect success." }, { - "path": "tests/test_windows_backend.py", + "path": "tests/test_citrix_real_acceptance.py", "kind": "test", "exists": true, "strength": "supported", @@ -1104,11 +1185,11 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The 4-method Backend protocol on Windows against a MOCKED WAA server (runs in CI post-merge; proves the wire, not a live desktop)." + "proves": "Required CI validates the public real-ICA campaign preflight, distinct authority keys, executable and oracle attestations, one-use nonce journal, crash recovery, signed display and monitor-topology observation, explicit reliability metrics, uncertain dispatch, and fail-closed report contract without provisioning infrastructure." }, { - "path": "benchmark/structural_action/STRUCTURAL_ACTION.md", - "kind": "benchmark", + "path": "benchmark/citrix_workspace/results.json", + "kind": "artifact", "exists": true, "strength": "roadmap", "gating": "artifact (doc/benchmark)", @@ -1116,11 +1197,11 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "Desktop drift benchmark: the structural rung resolved 21/21 targets where visual replay alone managed 6/21." + "proves": "The retained six-trial record reports code_readiness_accepted=true and ica_hdx_accepted=false, keeping driver readiness distinct from a counted live ICA/HDX qualification." }, { - "path": "benchmark/windows_uia/results.json", - "kind": "benchmark", + "path": "docs/desktop/CITRIX_PIXEL.md", + "kind": "doc", "exists": true, "strength": "roadmap", "gating": "artifact (doc/benchmark)", @@ -1128,16 +1209,16 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "Accepted candidate 20260717-candidate-56759c8-v2: 3/3 exact task and SQLite effects, 12 UIA receipts, and 3/3 stale plus 3/3 ambiguity refusals with zero silent incorrect success, over-halt, or model calls." + "proves": "The Citrix driver model, reusable evidence, exact-deployment acceptance contract, independent-effect boundary, and customer-controlled posture." } ], "errors": [] }, { - "id": "macos-native-validating", - "claim": "Native macOS has scoped acceptance for exact-window-bound text delivery, independent file effects, and ambiguity refusal on a fixed TextEdit task.", + "id": "desktop-recording-validating", + "claim": "The product CLI records desktop workflows through openadapt-capture and `record --backend windows|macos|linux|rdp|citrix` captures the operator's real demonstration and emits the compile-ready recording format, so record -> compile -> replay closes on the desktop substrate, not just the browser.", "tier": "validating", - "reproducibility": "field", + "reproducibility": null, "surfaces": [ "README.md", "docs", @@ -1145,12 +1226,12 @@ ], "strongest_evidence": "supported", "caveats": [ - "Acceptance covers TextEdit on one macOS 15.7.3 Apple Silicon host and active user session; each customer application is qualified separately.", - "The original counted report remains failed. The hash-bound adjudication accepts only its independently confirmed action/effect/refusal evidence." + "Offline capture carries NO structural (UIA AutomationId) locator, so replay uses the visual ladder (template/ocr/geometry). The live capture needs a display (openadapt-capture is the optional `capture` extra); the CI proof covers a real on-disk capture session -> convert -> compile -> replay, not a live recorder run (the live recorder has its own integration suite in the openadapt-capture repo).", + "`--secret` is refused on an unqualified pixel/desktop capture with no field geometry, and RDP recording uses the replay pixel space or a deployment-calibrated client-window mapping." ], "evidence": [ { - "path": "tests/test_macos_backend.py", + "path": "tests/test_desktop_record.py", "kind": "test", "exists": true, "strength": "supported", @@ -1159,10 +1240,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "CI covers unique-window binding, foreground/focus proof, exact-element text delivery, and refusal before physical input when proof fails." + "proves": "The live-capture orchestration + CLI wiring (record --backend windows|macos|linux|rdp|citrix -> openadapt-capture -> convert_capture), and that a desktop-shaped recording COMPILES into a bundle and REPLAYS to completion through the desktop backend path, resolving each click to its recorded target (runs on default CI)." }, { - "path": "tests/test_macos_qualification.py", + "path": "tests/test_capture_adapter.py", "kind": "test", "exists": true, "strength": "supported", @@ -1171,11 +1252,11 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "CI validates the qualification oracle, failure taxonomy, evidence hashes, cleanup adjudication, and ambiguity-refusal accounting." + "proves": "The capture->recording bridge over a REAL openadapt-capture session (its own event-processing pipeline + frame extraction) feeding the UNMODIFIED compiler (runs on default CI: the `test` job installs the `capture` extra; openadapt-capture >=0.5.4 imports clean headless)." }, { - "path": "benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json", - "kind": "benchmark", + "path": "docs/desktop/RECORDING.md", + "kind": "doc", "exists": true, "strength": "roadmap", "gating": "artifact (doc/benchmark)", @@ -1183,28 +1264,26 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "Candidate b1b61a5 completed 3/3 exact-byte TextEdit effects and refused two ambiguous windows without modifying either file." + "proves": "The capture-assisted and live-observer paths, fail-closed secret handling, RDP coordinate binding, and reuse of openadapt-capture + the capture adapter." } ], "errors": [] }, { - "id": "linux-native-validating", - "claim": "Native Linux uses an exact-window AT-SPI backend with complete candidate enumeration, native action delivery, and fail-closed ambiguity, staleness, and Wayland portal boundaries.", + "id": "effect-verifier-kit", + "claim": "The effect-verifier kit makes declaring and wiring effect verification a reviewed deployment-config exercise instead of bespoke per-deployment code: declarative REST / FHIR / read-only-SQL / file-arrival / document-hash verifier configs with secret-isolated auth references and explicit run-parameter binding, a cross-substrate exactly-one-NEW-record duplicate guard, per-consequential-step effect-coverage lint/certify gates, and typed reconciliation tasks on halt. A deployment with multiple reviewed read boundaries selects the strongest evidence tier before actuation, retains that exact selection through durable resume, and never downgrades to a weaker verifier after an action.", "tier": "validating", "reproducibility": null, "surfaces": [ - "README.md", "docs" ], "strongest_evidence": "supported", "caveats": [ - "Required CI establishes live scoped acceptance only for the in-tree GTK3 application on its isolated Xvfb image. Each third-party application and environment requires its own qualification.", - "X11 is the initial built-in live transport. Wayland requires a real operator-approved XDG RemoteDesktop/ScreenCast portal session; the built-in client currently refuses rather than pretending a grant exists." + "CONTRACT-PROVEN, not live-proven: the SQL verifier is exercised against sqlite fixtures (no production MariaDB/Postgres), the SFTP arrival path against a fake transport (no real SFTP server), and the worked-example configs are templates \u2014 only the FHIR substrate has an additional opt-in live-OpenEMR test. Per-verifier claims are exactly as strong as these tests." ], "evidence": [ { - "path": "tests/test_linux_backend.py", + "path": "tests/test_effect_sql.py", "kind": "test", "exists": true, "strength": "supported", @@ -1213,10 +1292,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Default CI covers exact app/window binding, bounded candidate enumeration, ambiguity and stale-target refusal, native invoke/focus and editable-text delivery, window-scoped capture, physical-input opt-in, and Wayland portal refusal through an injected Linux client." + "proves": "The read-only SQL verifier's whitelist (mutation/stacking/comment smuggling refused at construction) and full verdict contract, plus the exact table-delta audit promoted from the Frappe Lending reference matrix \u2014 against LOCAL sqlite fixtures only." }, { - "path": "tests/test_linux_qualification.py", + "path": "tests/test_effect_file_arrival.py", "kind": "test", "exists": true, "strength": "supported", @@ -1225,65 +1304,34 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Default CI enforces the live qualification's fixed three-trial matrix, independent exact-file and absence oracles, and separate silent-incorrect-success, over-halt, and refusal-failure accounting." + "proves": "File-arrival verdicts (pattern / size>0 / mtime freshness / content probe / duplicate export) against real temp directories, and the SFTP path against an in-memory fake paramiko-shaped transport." }, { - "path": "scripts/qualify_linux_atspi.py", - "kind": "benchmark", + "path": "tests/test_effect_kit_config.py", + "kind": "test", "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", + "strength": "supported", + "gating": "ci (required PR gate (test))", "node": null, "node_found": null, - "ci_job": null, + "ci_job": "test", "junit_status": null, - "proves": "The required linux-atspi-x11 job drives the real GTK3 fixture through AT-SPI on an isolated Xvfb display and session D-Bus, emitting a per-trial JSON evidence artifact." + "proves": "The declarative construction path: env-var auth references fail loud when unset, run-parameter references resolve at build (and refuse to construct unresolved), and pre-kit configs build byte-identically." }, { - "path": "docs/desktop/LINUX_NATIVE.md", - "kind": "doc", - "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", - "node": null, - "node_found": null, - "ci_job": null, - "junit_status": null, - "proves": "The operator contract, X11 and Wayland boundaries, configuration, delivery-only receipt semantics, and required real GTK/AT-SPI CI qualification contract." - } - ], - "errors": [] - }, - { - "id": "rdp-validating", - "claim": "RDP has scoped acceptance for real-network framebuffer decode and input delivery into Windows 11 with independent exact file-effect verification.", - "tier": "validating", - "reproducibility": "field", - "surfaces": [ - "README.md", - "docs", - "website" - ], - "strongest_evidence": "supported", - "caveats": [ - "Acceptance covers the named 1280x800 Windows Run/file task and exact VM environment, not arbitrary applications, identity policies, or Citrix.", - "The multi-window campaign uses deterministic synthetic applications. It exercises the real FreeRDP pixel and input path but does not qualify a named customer application or environment." - ], - "evidence": [ - { - "path": "tests/e2e/test_parallels_rdp_e2e.py", + "path": "tests/test_effect_verifier_candidates.py", "kind": "test", "exists": true, - "strength": "validating", - "gating": "opt-in (OAFLOW_PARALLELS_RDP_E2E)", + "strength": "supported", + "gating": "ci (required PR gate (test))", "node": null, "node_found": null, - "ci_job": "validating", + "ci_job": "test", "junit_status": null, - "proves": "Opt-in snapshot-safe real RDP qualification harness with exactly three trials, independent guest-tools oracle, failure taxonomy, and cleanup." + "proves": "Required CI constructs and preflights all reviewed candidates before input, pins the strongest verifier and its pre-state, preserves the binding through durable resume, and refuses an unavailable selected verifier rather than falling back after an action." }, { - "path": "tests/test_rdp_backend.py", + "path": "tests/test_effect_coverage_lint.py", "kind": "test", "exists": true, "strength": "supported", @@ -1292,10 +1340,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "CI covers the backend/transport contract, framebuffer conversion, pointer and keyboard delivery, resize rebaseline between actions, mid-lease geometry refusal, pre-delivery horizontal-scroll refusal, typed uncertain transport failures, and record-compile-replay conformance." + "proves": "lint warns per consequential step lacking an effect contract and reports coverage %; certify fails the same gap only when the policy sets require_effects_for_irreversible (warn-vs-fail is policy-configurable)." }, { - "path": "tests/test_rdp_multiapp_campaign_contract.py", + "path": "tests/test_effect_reconciliation.py", "kind": "test", "exists": true, "strength": "supported", @@ -1304,10 +1352,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI covers the bounded 27-trial FreeRDP campaign contract, independent SQLite, CSV, and Maildir oracles, fail-closed visual action preflight, uncertain-delivery handling, and result accounting." + "proves": "Every escalated verification failure emits a typed ReconciliationTask carrying the one-way contract hash and verdict evidence \u2014 never the resolved selector values." }, { - "path": "benchmark/rdp_multiapp/README.md", + "path": "docs/EFFECT_KIT.md", "kind": "doc", "exists": true, "strength": "roadmap", @@ -1316,40 +1364,28 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The public synthetic multi-window campaign defines the workflow, faults, independent persisted surfaces, and acceptance denominator." - }, - { - "path": "benchmark/rdp/results_82a658a_20260718.sanitized.json", - "kind": "benchmark", - "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", - "node": null, - "node_found": null, - "ci_job": null, - "junit_status": null, - "proves": "Candidate 82a658a passed 3/3 at 51.845, 10.467, and 7.477 seconds, with zero failures, silent incorrect successes, over-halts, or model calls." + "proves": "The operator-facing kit contract: config reference plus Frappe (REST/SQL) and OpenEMR (FHIR/SQL) worked examples targeting the reference fixtures." } ], "errors": [] }, { - "id": "substrate-runtime-validation-supported", - "claim": "Runtime-validation v3 binds Standard and Regulated hosted activation to the exact governed authorization template reproduced from the sealed qualification. It also binds the successful run's resolved target kind (`web|windows|macos|linux|rdp|citrix`), artifact, compiler, parameter schema, strict lint, policy, risk, report, and opaque environment. Web retains its exact HTTPS/host boundary. Native and remote execution emits no app, window, host, readiness, or backend-hint values to Cloud. Local verification retains signed v1 and v2 compatibility.", - "tier": "supported", + "id": "linux-native-validating", + "claim": "Native Linux uses an exact-window AT-SPI backend with complete candidate enumeration, native action delivery, and fail-closed ambiguity, staleness, and Wayland portal boundaries.", + "tier": "validating", "reproducibility": null, "surfaces": [ "README.md", - "docs", - "website" + "docs" ], "strongest_evidence": "supported", "caveats": [ - "The HMAC proves operator-token possession and envelope integrity; it is not independent observation of the local replay or certification of an arbitrary target application." + "Required CI establishes live scoped acceptance only for the in-tree GTK3 application on its isolated Xvfb image. Each third-party application and environment requires its own qualification.", + "X11 is the initial built-in live transport. Wayland requires a real operator-approved XDG RemoteDesktop/ScreenCast portal session; the built-in client currently refuses rather than pretending a grant exists." ], "evidence": [ { - "path": "tests/test_runtime_validation.py", + "path": "tests/test_linux_backend.py", "kind": "test", "exists": true, "strength": "supported", @@ -1358,10 +1394,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI exercises all six target kinds, validates v3 against its closed JSON Schema, refuses a Standard or Regulated activation without an exact template, binds the template SHA to the HMAC, preserves web URL/host checks, keeps native/remote execution empty, verifies the canonical HMAC vector, and retains signed v1/v2 compatibility." + "proves": "Default CI covers exact app/window binding, bounded candidate enumeration, ambiguity and stale-target refusal, native invoke/focus and editable-text delivery, window-scoped capture, physical-input opt-in, and Wayland portal refusal through an injected Linux client." }, { - "path": "tests/test_cli_new_commands.py", + "path": "tests/test_linux_qualification.py", "kind": "test", "exists": true, "strength": "supported", @@ -1370,10 +1406,22 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI carries the resolved web, Windows, and Citrix backend token through durable resume into the new run report rather than trusting an upload-time relabel." + "proves": "Default CI enforces the live qualification's fixed three-trial matrix, independent exact-file and absence oracles, and separate silent-incorrect-success, over-halt, and refusal-failure accounting." }, { - "path": "schemas/runtime-validation-attestation-v3.json", + "path": "scripts/qualify_linux_atspi.py", + "kind": "benchmark", + "exists": true, + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", + "node": null, + "node_found": null, + "ci_job": null, + "junit_status": null, + "proves": "The required linux-atspi-x11 job drives the real GTK3 fixture through AT-SPI on an isolated Xvfb display and session D-Bus, emitting a per-trial JSON evidence artifact." + }, + { + "path": "docs/desktop/LINUX_NATIVE.md", "kind": "doc", "exists": true, "strength": "roadmap", @@ -1382,16 +1430,16 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The public closed envelope requires target_kind and the governed authorization template SHA, and conditionally permits browser execution fields only for web." + "proves": "The operator contract, X11 and Wayland boundaries, configuration, delivery-only receipt semantics, and required real GTK/AT-SPI CI qualification contract." } ], "errors": [] }, { - "id": "desktop-recording-validating", - "claim": "The product CLI records desktop workflows through openadapt-capture and `record --backend windows|macos|linux|rdp|citrix` captures the operator's real demonstration and emits the compile-ready recording format, so record -> compile -> replay closes on the desktop substrate, not just the browser.", + "id": "macos-native-validating", + "claim": "Native macOS has scoped acceptance for exact-window-bound text delivery, independent file effects, and ambiguity refusal on a fixed TextEdit task.", "tier": "validating", - "reproducibility": null, + "reproducibility": "field", "surfaces": [ "README.md", "docs", @@ -1399,12 +1447,12 @@ ], "strongest_evidence": "supported", "caveats": [ - "Offline capture carries NO structural (UIA AutomationId) locator, so replay uses the visual ladder (template/ocr/geometry). The live capture needs a display (openadapt-capture is the optional `capture` extra); the CI proof covers a real on-disk capture session -> convert -> compile -> replay, not a live recorder run (the live recorder has its own integration suite in the openadapt-capture repo).", - "`--secret` is refused on an unqualified pixel/desktop capture with no field geometry, and RDP recording uses the replay pixel space or a deployment-calibrated client-window mapping." + "Acceptance covers TextEdit on one macOS 15.7.3 Apple Silicon host and active user session; each customer application is qualified separately.", + "The original counted report remains failed. The hash-bound adjudication accepts only its independently confirmed action/effect/refusal evidence." ], "evidence": [ { - "path": "tests/test_desktop_record.py", + "path": "tests/test_macos_backend.py", "kind": "test", "exists": true, "strength": "supported", @@ -1413,10 +1461,10 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The live-capture orchestration + CLI wiring (record --backend windows|macos|linux|rdp|citrix -> openadapt-capture -> convert_capture), and that a desktop-shaped recording COMPILES into a bundle and REPLAYS to completion through the desktop backend path, resolving each click to its recorded target (runs on default CI)." + "proves": "CI covers unique-window binding, foreground/focus proof, exact-element text delivery, and refusal before physical input when proof fails." }, { - "path": "tests/test_capture_adapter.py", + "path": "tests/test_macos_qualification.py", "kind": "test", "exists": true, "strength": "supported", @@ -1425,11 +1473,11 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "The capture->recording bridge over a REAL openadapt-capture session (its own event-processing pipeline + frame extraction) feeding the UNMODIFIED compiler (runs on default CI: the `test` job installs the `capture` extra; openadapt-capture >=0.5.4 imports clean headless)." + "proves": "CI validates the qualification oracle, failure taxonomy, evidence hashes, cleanup adjudication, and ambiguity-refusal accounting." }, { - "path": "docs/desktop/RECORDING.md", - "kind": "doc", + "path": "benchmark/macos_native/textedit_counted_3plus1_b1b61a5_20260717.adjudication.json", + "kind": "benchmark", "exists": true, "strength": "roadmap", "gating": "artifact (doc/benchmark)", @@ -1437,16 +1485,16 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The capture-assisted and live-observer paths, fail-closed secret handling, RDP coordinate binding, and reuse of openadapt-capture + the capture adapter." + "proves": "Candidate b1b61a5 completed 3/3 exact-byte TextEdit effects and refused two ambiguous windows without modifying either file." } ], "errors": [] }, { - "id": "citrix-pixel-validating", - "claim": "Citrix uses a dedicated exact-Workspace-window backend beneath the governed pixel-only remote-display contract. Required CI covers its readiness gate, governed execution, durable resume, report binding, and refusal contracts; the counted no-DOM qualification covers the driver, visual ladder, independent effects, and drift halts. Live ICA/HDX acceptance remains separately bound to the exact deployment.", + "id": "openemr-field-benchmark", + "claim": "On the real third-party OpenEMR public demo, compiled replay went 19/20 versus 10/10 for a computer-use agent, faster and with zero model calls. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build.", "tier": "validating", - "reproducibility": null, + "reproducibility": "field", "surfaces": [ "README.md", "docs", @@ -1454,37 +1502,12 @@ ], "strongest_evidence": "supported", "caveats": [ - "PIXEL-ONLY: no UIA/DOM crosses to the driver. On-screen OCR read-back is SAME-SURFACE, not an independent system-of-record check.", - "A Parallels VM window is a Citrix ANALOG; real HDX/latency/DPI/lock- screen drift is not simulated. OPT-IN + infra-gated (`OAFLOW_CITRIX_PIXEL_E2E=1` or `OAFLOW_CITRIX_STANDIN_E2E=1`); neither live-window proof runs on default CI, and neither replaces a counted live ICA/HDX acceptance record.", - "The public real-acceptance harness contains no customer recipe, credential, identifier, screenshot, or deployment-specific threshold. A private qualified configuration supplies those exact bindings." + "The historical result uses OCR evidence from a visible saved message row. It does not use an out-of-band OpenEMR system-of-record read.", + "FIELD TEST, NOT CI-reproducible: the head-to-head ran against a SHARED public demo that other users mutate and that resets daily; the sample is small (10 agent runs). Only the verifier + task-prompt units run in CI. `reproducibility: field` forbids ever labeling this `supported`." ], "evidence": [ { - "path": "tests/e2e/test_citrix_pixel_e2e.py", - "kind": "test", - "exists": true, - "strength": "validating", - "gating": "opt-in (OAFLOW_CITRIX_PIXEL_E2E)", - "node": null, - "node_found": null, - "ci_job": "validating", - "junit_status": null, - "proves": "OPT-IN pixel-only proof: structural_armed_coverage == 0, replay resolves on template/ocr/geometry only, on-screen OCR read-back verifies the write, the identity gate HALTs on a look-alike patient, and render drift triggers halt-on-ambiguity." - }, - { - "path": "tests/test_pixel_identity_probe.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": null, - "node_found": null, - "ci_job": "test", - "junit_status": null, - "proves": "The pixel-substrate identity probe behind the on-pixels identity gate." - }, - { - "path": "tests/test_citrix_workspace_backend.py", + "path": "tests/test_openemr_benchmark.py", "kind": "test", "exists": true, "strength": "supported", @@ -1493,58 +1516,77 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI covers the dedicated backend preset, exact owner/title overrides, readiness probe construction, pixel-only capability boundary, backend factory, and product CLI selectors." + "proves": "The CI-reproducible half: the saved-message-row verifier, its unsaved-entry-form rejection, and the intent-not-coordinates task prompt that both benchmark arms use." }, { - "path": "tests/test_run_gate.py", + "path": "tests/test_openemr_retained_finals.py", "kind": "test", "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", + "strength": "validating", + "gating": "opt-in (OPENADAPT_OPENEMR_FINALS_DIR)", "node": null, "node_found": null, - "ci_job": "test", + "ci_job": "validating", "junit_status": null, - "proves": "Required CI refuses governed Citrix execution before action when its readiness binding is absent or blank, admits a sealed bundle carrying a recorded readiness binding, and reports only the resolved backend token rather than sensitive target strings." + "proves": "When the local-only retained final frames are mounted, the guard replays all 30 with the current verifier and requires 19/20 compiled, 10/10 agent, and exactly one corrected legacy false success." }, { - "path": "tests/test_cli_new_commands.py", - "kind": "test", + "path": "benchmark/openemr/BENCHMARK.md", + "kind": "benchmark", "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", "node": null, "node_found": null, - "ci_job": "test", + "ci_job": null, "junit_status": null, - "proves": "Required CI restores the recorded Citrix owner, exact title, and readiness binding through durable approve/resume, and refuses before backend construction when resumed configuration is incomplete." + "proves": "The corrected field-test numbers, saved-row screen-oracle contract, methodology, and cost caps for the 20-vs-10 head-to-head run." }, { - "path": "tests/test_hosted.py", - "kind": "test", + "path": "docs/showcase-openemr/FINDINGS.md", + "kind": "doc", "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", "node": null, "node_found": null, - "ci_job": "test", + "ci_job": null, "junit_status": null, - "proves": "Required CI binds a completed local Citrix report to the closed `citrix` execution token without copying target owner, title, or readiness values into the hosted summary." - }, + "proves": "The correctness-only field findings (fresh browsers, zero model calls, closed-loop scrolling)." + } + ], + "errors": [] + }, + { + "id": "rdp-validating", + "claim": "RDP has scoped acceptance for real-network framebuffer decode and input delivery into Windows 11 with independent exact file-effect verification.", + "tier": "validating", + "reproducibility": "field", + "surfaces": [ + "README.md", + "docs", + "website" + ], + "strongest_evidence": "supported", + "caveats": [ + "Acceptance covers the named 1280x800 Windows Run/file task and exact VM environment, not arbitrary applications, identity policies, or Citrix.", + "The multi-window campaign uses deterministic synthetic applications. It exercises the real FreeRDP pixel and input path but does not qualify a named customer application or environment." + ], + "evidence": [ { - "path": "tests/e2e/test_citrix_workspace_standin_e2e.py", + "path": "tests/e2e/test_parallels_rdp_e2e.py", "kind": "test", "exists": true, "strength": "validating", - "gating": "opt-in (OAFLOW_CITRIX_STANDIN_E2E)", + "gating": "opt-in (OAFLOW_PARALLELS_RDP_E2E)", "node": null, "node_found": null, "ci_job": "validating", "junit_status": null, - "proves": "The dedicated Citrix backend passes three healthy effect-confirmed record->compile->replay trials and three severe-drift safe-halts over a no-DOM surface, with zero model calls, false completion, or silent incorrect success." + "proves": "Opt-in snapshot-safe real RDP qualification harness with exactly three trials, independent guest-tools oracle, failure taxonomy, and cleanup." }, { - "path": "tests/test_citrix_real_acceptance.py", + "path": "tests/test_rdp_backend.py", "kind": "test", "exists": true, "strength": "supported", @@ -1553,22 +1595,22 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Required CI validates the public real-ICA campaign preflight, distinct authority keys, executable and oracle attestations, one-use nonce journal, crash recovery, signed display and monitor-topology observation, explicit reliability metrics, uncertain dispatch, and fail-closed report contract without provisioning infrastructure." + "proves": "CI covers the backend/transport contract, framebuffer conversion, pointer and keyboard delivery, resize rebaseline between actions, mid-lease geometry refusal, pre-delivery horizontal-scroll refusal, typed uncertain transport failures, and record-compile-replay conformance." }, { - "path": "benchmark/citrix_workspace/results.json", - "kind": "artifact", + "path": "tests/test_rdp_multiapp_campaign_contract.py", + "kind": "test", "exists": true, - "strength": "roadmap", - "gating": "artifact (doc/benchmark)", + "strength": "supported", + "gating": "ci (required PR gate (test))", "node": null, "node_found": null, - "ci_job": null, + "ci_job": "test", "junit_status": null, - "proves": "The retained six-trial record reports code_readiness_accepted=true and ica_hdx_accepted=false, keeping driver readiness distinct from a counted live ICA/HDX qualification." + "proves": "Required CI covers the bounded 27-trial FreeRDP campaign contract, independent SQLite, CSV, and Maildir oracles, fail-closed visual action preflight, uncertain-delivery handling, and result accounting." }, { - "path": "docs/desktop/CITRIX_PIXEL.md", + "path": "benchmark/rdp_multiapp/README.md", "kind": "doc", "exists": true, "strength": "roadmap", @@ -1577,39 +1619,11 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The Citrix driver model, reusable evidence, exact-deployment acceptance contract, independent-effect boundary, and customer-controlled posture." - } - ], - "errors": [] - }, - { - "id": "win32-window-replay-roadmap", - "claim": "Windows hosts can replay window-scoped remote-display workflows (the Citrix/RDP client window on a Windows endpoint) through the same governed pixel contract already proven on macOS hosts.", - "tier": "roadmap", - "reproducibility": null, - "surfaces": [ - "docs" - ], - "strongest_evidence": "supported", - "caveats": [ - "NOT qualified: no counted end-to-end batch on a real Windows host or a real client window exists. The contract tests mock every Win32 call; real DPI virtualization, UIPI, foreground-arbitration, and PrintWindow rendering behavior remain unproven until the Parallels/real-Windows validation procedure is executed and counted." - ], - "evidence": [ - { - "path": "tests/test_win32_window_client.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": null, - "node_found": null, - "ci_job": "test", - "junit_status": null, - "proves": "MOCK-ONLY conformance: the win32 WindowClient implements the remote-display WindowClient seam (exact process/title/class selection with ambiguity halt, client-area coordinate mapping under per-monitor DPI awareness, PrintWindow-then-BitBlt capture fallback, focus-verification refusal, and the UIPI elevation guard) against a scripted Win32 API \u2014 never against a real Windows host." + "proves": "The public synthetic multi-window campaign defines the workflow, faults, independent persisted surfaces, and acceptance denominator." }, { - "path": "docs/desktop/CITRIX_PIXEL.md", - "kind": "doc", + "path": "benchmark/rdp/results_82a658a_20260718.sanitized.json", + "kind": "benchmark", "exists": true, "strength": "roadmap", "gating": "artifact (doc/benchmark)", @@ -1617,16 +1631,16 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The remote-display contract the client implements and the evidence ladder for qualifying it (Parallels/RDP client-window analog first, then a counted live Citrix host run)." + "proves": "Candidate 82a658a passed 3/3 at 51.845, 10.467, and 7.477 seconds, with zero failures, silent incorrect successes, over-halts, or model calls." } ], "errors": [] }, { - "id": "openemr-field-benchmark", - "claim": "On the real third-party OpenEMR public demo, compiled replay went 19/20 versus 10/10 for a computer-use agent, faster and with zero model calls. Measured 2026-07-08 on Flow 0.1.0, a pre-v0.2.0 source build.", + "id": "windows-desktop-validating", + "claim": "Windows UIA has scoped acceptance: the deterministic structural rung delivered native actions in a fixed WinForms workflow with independent effects and fail-closed stale/ambiguity refusal.", "tier": "validating", - "reproducibility": "field", + "reproducibility": null, "surfaces": [ "README.md", "docs", @@ -1634,36 +1648,36 @@ ], "strongest_evidence": "supported", "caveats": [ - "The historical result uses OCR evidence from a visible saved message row. It does not use an out-of-band OpenEMR system-of-record read.", - "FIELD TEST, NOT CI-reproducible: the head-to-head ran against a SHARED public demo that other users mutate and that resets daily; the sample is small (10 agent runs). Only the verifier + task-prompt units run in CI. `reproducibility: field` forbids ever labeling this `supported`." + "The live desktop e2e is OPT-IN and infra-gated (needs a Parallels Win11-ARM VM; `OAFLOW_PARALLELS_E2E=1`); it never runs on default CI. Only the mocked backend protocol runs in CI.", + "Acceptance covers the named in-tree workflow and exact Windows VM. Third-party applications require workflow-specific qualification." ], "evidence": [ { - "path": "tests/test_openemr_benchmark.py", + "path": "tests/e2e/test_parallels_desktop_e2e.py", "kind": "test", "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", + "strength": "validating", + "gating": "opt-in (OAFLOW_PARALLELS_E2E)", "node": null, "node_found": null, - "ci_job": "test", + "ci_job": "validating", "junit_status": null, - "proves": "The CI-reproducible half: the saved-message-row verifier, its unsaved-entry-form rejection, and the intent-not-coordinates task prompt that both benchmark arms use." + "proves": "OPT-IN live proof on a real Win11-ARM VM: record->compile->replay through WindowsBackend with the structural rung resolving every click by AutomationId (armed_coverage == 1.0)." }, { - "path": "tests/test_openemr_retained_finals.py", + "path": "tests/test_windows_backend.py", "kind": "test", "exists": true, - "strength": "validating", - "gating": "opt-in (OPENADAPT_OPENEMR_FINALS_DIR)", + "strength": "supported", + "gating": "ci (required PR gate (test))", "node": null, "node_found": null, - "ci_job": "validating", + "ci_job": "test", "junit_status": null, - "proves": "When the local-only retained final frames are mounted, the guard replays all 30 with the current verifier and requires 19/20 compiled, 10/10 agent, and exactly one corrected legacy false success." + "proves": "The 4-method Backend protocol on Windows against a MOCKED WAA server (runs in CI post-merge; proves the wire, not a live desktop)." }, { - "path": "benchmark/openemr/BENCHMARK.md", + "path": "benchmark/structural_action/STRUCTURAL_ACTION.md", "kind": "benchmark", "exists": true, "strength": "roadmap", @@ -1672,11 +1686,11 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The corrected field-test numbers, saved-row screen-oracle contract, methodology, and cost caps for the 20-vs-10 head-to-head run." + "proves": "Desktop drift benchmark: the structural rung resolved 21/21 targets where visual replay alone managed 6/21." }, { - "path": "docs/showcase-openemr/FINDINGS.md", - "kind": "doc", + "path": "benchmark/windows_uia/results.json", + "kind": "benchmark", "exists": true, "strength": "roadmap", "gating": "artifact (doc/benchmark)", @@ -1684,28 +1698,26 @@ "node_found": null, "ci_job": null, "junit_status": null, - "proves": "The correctness-only field findings (fresh browsers, zero model calls, closed-loop scrolling)." + "proves": "Accepted candidate 20260717-candidate-56759c8-v2: 3/3 exact task and SQLite effects, 12 UIA receipts, and 3/3 stale plus 3/3 ambiguity refusals with zero silent incorrect success, over-halt, or model calls." } ], "errors": [] }, { - "id": "compose-recorded-bundles", - "claim": "openadapt-flow compose sequences named, already-compiled child bundles under a handoff contract. Each child stays bound to its recorded surface. The parent starts a child only after a predecessor ends VERIFIED (or an explicit allowed halt class). Handoffs copy effect-bound parameter values from confirmed effect receipts; missing evidence HALTs. certify and run execute the parent artifact.", - "tier": "supported", + "id": "win32-window-replay-roadmap", + "claim": "Windows hosts can replay window-scoped remote-display workflows (the Citrix/RDP client window on a Windows endpoint) through the same governed pixel contract already proven on macOS hosts.", + "tier": "roadmap", "reproducibility": null, "surfaces": [ - "README.md", "docs" ], "strongest_evidence": "supported", "caveats": [ - "The parent sequences admitted child runs. It does not enlarge the workflow-program graph and does not introduce a process contract. It does not switch backends inside one recording.", - "Evidence is unit tests plus a local mock second child. This claim does not cover Production admission or a live Citrix session." + "NOT qualified: no counted end-to-end batch on a real Windows host or a real client window exists. The contract tests mock every Win32 call; real DPI virtualization, UIPI, foreground-arbitration, and PrintWindow rendering behavior remain unproven until the Parallels/real-Windows validation procedure is executed and counted." ], "evidence": [ { - "path": "tests/test_compose_authoring.py", + "path": "tests/test_win32_window_client.py", "kind": "test", "exists": true, "strength": "supported", @@ -1714,31 +1726,19 @@ "node_found": null, "ci_job": "test", "junit_status": null, - "proves": "Authoring copies two child bundles, records the handoff contract, and refuses a source that is not effect-bound, an unknown target parameter, a single child, a cyclic after-graph, and a backwards handoff." - }, - { - "path": "tests/test_compose_runtime.py", - "kind": "test", - "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", - "node": "test_two_child_fixture_second_is_local_backend", - "node_found": true, - "ci_job": "test", - "junit_status": null, - "proves": "A two-child fixture runs intake through MockMed with independent effect verification, then a local FakeBackend child that receives the verified patient_id. Missing handoff evidence and an unverified predecessor HALT before the next child starts." + "proves": "MOCK-ONLY conformance: the win32 WindowClient implements the remote-display WindowClient seam (exact process/title/class selection with ambiguity halt, client-area coordinate mapping under per-monitor DPI awareness, PrintWindow-then-BitBlt capture fallback, focus-verification refusal, and the UIPI elevation guard) against a scripted Win32 API \u2014 never against a real Windows host." }, { - "path": "tests/test_cli_compose.py", - "kind": "test", + "path": "docs/desktop/CITRIX_PIXEL.md", + "kind": "doc", "exists": true, - "strength": "supported", - "gating": "ci (required PR gate (test))", + "strength": "roadmap", + "gating": "artifact (doc/benchmark)", "node": null, "node_found": null, - "ci_job": "test", + "ci_job": null, "junit_status": null, - "proves": "The compose parser dispatches, the CLI writes a composition artifact, and replay refuses to run one." + "proves": "The remote-display contract the client implements and the evidence ladder for qualifying it (Parallels/RDP client-window analog first, then a counted live Citrix host run)." } ], "errors": [] diff --git a/packages/flow/openadapt_flow/backends/win32_window_client.py b/packages/flow/openadapt_flow/backends/win32_window_client.py index 6e50a0c992..1e6b3b7580 100644 --- a/packages/flow/openadapt_flow/backends/win32_window_client.py +++ b/packages/flow/openadapt_flow/backends/win32_window_client.py @@ -70,7 +70,7 @@ Status honesty: this client is **mock-contract-tested only**. No counted qualification batch against a real Windows host / real client window has been -published; see ``claims.yaml`` (``win32-window-replay-roadmap``) and +published; see ``claims/win32-window-replay-roadmap.yaml`` and ``docs/desktop/CITRIX_PIXEL.md`` for the evidence ladder. """ diff --git a/packages/flow/public-artifacts.json b/packages/flow/public-artifacts.json index cad16571bb..f34f066933 100644 --- a/packages/flow/public-artifacts.json +++ b/packages/flow/public-artifacts.json @@ -268,7 +268,31 @@ "benchmark/vlm_identity/pairs/drift_MG4482_dark.png", "benchmark/vlm_identity/vlm_identity.json", "benchmark/windows_uia/results.json", - "claims.yaml", + "claims/citrix-pixel-validating.yaml", + "claims/compose-recorded-bundles.yaml", + "claims/desktop-readback-separate-session.yaml", + "claims/desktop-recording-validating.yaml", + "claims/deterministic-zero-model-replay.yaml", + "claims/effect-verification-silent-writes.yaml", + "claims/effect-verifier-kit.yaml", + "claims/halt-teach-promote.yaml", + "claims/identifier-crop-compile-emission.yaml", + "claims/identity-gate-halt-armed.yaml", + "claims/linux-native-validating.yaml", + "claims/lookup-teaches-the-check.yaml", + "claims/macos-native-validating.yaml", + "claims/mockmed-benchmark-ci-reproducible.yaml", + "claims/openemr-field-benchmark.yaml", + "claims/qualified-remote-decision-v2-supported.yaml", + "claims/rdp-validating.yaml", + "claims/record-check-from-app-reads.yaml", + "claims/reviewed-judgment-cases-supported.yaml", + "claims/substrate-runtime-validation-supported.yaml", + "claims/typed-business-decisions-supported.yaml", + "claims/ui-readback-separate-session.yaml", + "claims/web-supported.yaml", + "claims/win32-window-replay-roadmap.yaml", + "claims/windows-desktop-validating.yaml", "deploy/on-prem/docker-compose.yml", "deploy/on-prem/onprem.example.yaml", "docs/console/run-halted.png", diff --git a/packages/flow/scripts/validate_claims.py b/packages/flow/scripts/validate_claims.py index b54a137d45..5a87802408 100644 --- a/packages/flow/scripts/validate_claims.py +++ b/packages/flow/scripts/validate_claims.py @@ -3,7 +3,7 @@ `scripts/check_consistency.py` stops the README from carrying stale *strings*. This script stops it from carrying stale capability claims. It reads the -machine-readable registry `claims.yaml` (each claim -> a `tier` -> the backing +machine-readable registry `claims/` (one `.yaml` per claim: a `tier` and the backing test(s)/benchmark(s)) and enforces a tier<->evidence contract. A "supported" claim whose proof is only an opt-in/infra-gated test, is missing, is absent from the required job's JUnit result, is skipped, or fails is a hard CI failure. @@ -47,7 +47,6 @@ import json import os import re -import subprocess from dataclasses import dataclass, field from pathlib import Path from typing import Any, Optional @@ -55,10 +54,17 @@ import yaml REPO_ROOT = Path(__file__).resolve().parent.parent -REGISTRY = REPO_ROOT / "claims.yaml" +# One file per claim, so pull requests that add claims don't edit shared lines. +REGISTRY = REPO_ROOT / "claims" DOC_OUT = REPO_ROOT / "docs" / "VERIFICATION.md" JSON_OUT = REPO_ROOT / "docs" / "verification.json" +# The committed report is a function of the registry alone, so it carries this +# fixed stamp instead of a date that changes with every regeneration. +COMMITTED_REPORT_STAMP = ( + "committed registry state (regenerate: scripts/validate_claims.py --report)" +) + # Evidence tiers, weakest -> strongest. A claim's tier must not outrank the # strongest evidence backing it. TIER_RANK = {"research": 0, "roadmap": 1, "validating": 2, "supported": 3} @@ -241,6 +247,27 @@ def ok(self) -> bool: # core validation # --------------------------------------------------------------------------- # def load_registry(path: Path = REGISTRY) -> dict[str, Any]: + """Load a registry directory (one claim per file) or a single YAML file. + + In a directory each ``.yaml`` holds one claim mapping whose ``id`` must + equal the file stem, which also makes ids unique. Claims come back sorted + by id, so the order never depends on which pull request merged first. + """ + if path.is_dir(): + claims: list[dict[str, Any]] = [] + for file in sorted(path.glob("*.yaml")): + claim = yaml.safe_load(file.read_text(encoding="utf-8")) + if not isinstance(claim, dict): + raise ValueError(f"{file} must hold one claim mapping") + if claim.get("id") != file.stem: + raise ValueError( + f"{file} has id {claim.get('id')!r}; the file must be " + "named after the claim id" + ) + claims.append(claim) + if not claims: + raise ValueError(f"{path} has no claim files") + return {"version": 1, "claims": claims} data = yaml.safe_load(path.read_text(encoding="utf-8")) if not isinstance(data, dict) or "claims" not in data: raise ValueError( @@ -249,6 +276,11 @@ def load_registry(path: Path = REGISTRY) -> dict[str, Any]: return data +def report_order(results: list[ClaimResult]) -> list[ClaimResult]: + """Strongest tier first, then id: independent of registry order.""" + return sorted(results, key=lambda r: (-TIER_RANK.get(r.tier, -1), r.id)) + + def _required_ci_job(path: str, strength: str) -> Optional[str]: if strength == STRENGTH_OPTIN: return "validating" @@ -547,27 +579,20 @@ def parse_junit(path: Path, repo_root: Path = REPO_ROOT) -> dict[str, str]: # --------------------------------------------------------------------------- # -# timestamp (runtime forbids wall-clock in some contexts) +# report stamp (the committed report must not change with the clock) # --------------------------------------------------------------------------- # def resolve_now(explicit: Optional[str]) -> str: + """Stamp for the report header. + + The default is fixed. A commit date here changed on every regeneration, so + every two pull requests that regenerated the report conflicted on line one. + """ if explicit: return explicit env = os.environ.get("OAFLOW_CLAIMS_NOW") if env: return env - try: - out = subprocess.run( - ["git", "-C", str(REPO_ROOT), "show", "-s", "--format=%cI", "HEAD"], - capture_output=True, - text=True, - check=True, - ) - stamp = out.stdout.strip() - if stamp: - return f"{stamp} (git HEAD commit date)" - except (subprocess.CalledProcessError, FileNotFoundError): - pass - return "unknown (no --now, OAFLOW_CLAIMS_NOW, or git available)" + return COMMITTED_REPORT_STAMP # --------------------------------------------------------------------------- # @@ -593,8 +618,9 @@ def render_markdown( lines.append("# VERIFICATION: capability claims backed by evidence") lines.append("") lines.append( - "> GENERATED by `scripts/validate_claims.py --report` from `claims.yaml`. " - "Do not edit by hand — edit the registry and regenerate." + "> GENERATED by `scripts/validate_claims.py --report` from `claims/` " + "(one file per claim). Do not edit by hand — edit the registry and " + "regenerate." ) lines.append("") lines.append(f"- Generated at: **{now}**") @@ -646,26 +672,23 @@ def render_markdown( ) lines.append("") - # honesty summary - ci = [r for r in results if r.tier == "supported"] - val = [r for r in results if r.tier == "validating"] - other = [r for r in results if r.tier in ("roadmap", "research")] + # honesty summary: one id per line and no counts, so two pull requests + # that add different claims touch different lines. + results = report_order(results) lines.append("## What is bound to required CI vs. being validated") lines.append("") - lines.append( - f"- **Bound to required CI pass evidence ({len(ci)}):** " - + ", ".join(f"`{r.id}`" for r in ci) - ) - lines.append( - f"- **Being validated — opt-in / infra-gated or field ({len(val)}):** " - + ", ".join(f"`{r.id}`" for r in val) - ) - if other: - lines.append( - f"- **Roadmap / research ({len(other)}):** " - + ", ".join(f"`{r.id}`" for r in other) - ) - lines.append("") + for heading, tiers in ( + ("Bound to required CI pass evidence", ("supported",)), + ("Being validated — opt-in / infra-gated or field", ("validating",)), + ("Roadmap / research", ("roadmap", "research")), + ): + group = [r for r in results if r.tier in tiers] + if not group: + continue + lines.append(f"**{heading}:**") + lines.append("") + lines.extend(f"- `{r.id}`" for r in group) + lines.append("") # per-claim detail lines.append("## Claims") @@ -751,7 +774,7 @@ def render_json( ], "errors": r.errors, } - for r in results + for r in report_order(results) ], } @@ -773,7 +796,11 @@ def main(argv: Optional[list[str]] = None) -> int: parser.add_argument( "--report", action="store_true", help="regenerate docs/VERIFICATION.md + .json" ) - parser.add_argument("--registry", default=str(REGISTRY), help="path to claims.yaml") + parser.add_argument( + "--registry", + default=str(REGISTRY), + help="claims directory (or a single registry file)", + ) parser.add_argument( "--junit", default=None, @@ -802,7 +829,10 @@ def main(argv: Optional[list[str]] = None) -> int: parser.add_argument( "--now", default=None, - help="ISO timestamp for the report (else OAFLOW_CLAIMS_NOW / git HEAD)", + help=( + "stamp for the report (else OAFLOW_CLAIMS_NOW, else the fixed " + "committed-report stamp)" + ), ) args = parser.parse_args(argv) @@ -834,7 +864,7 @@ def main(argv: Optional[list[str]] = None) -> int: if args.ci_job in {"test", "e2e-browser"} and evidence_scope is not None: print( "Claims gate FAILED: required supported CI jobs derive their complete " - "evidence scope from claims.yaml" + "evidence scope from the claims registry" ) return 1 diff --git a/packages/flow/tests/test_validate_claims.py b/packages/flow/tests/test_validate_claims.py index 0ab56aaa5a..e41565efe1 100644 --- a/packages/flow/tests/test_validate_claims.py +++ b/packages/flow/tests/test_validate_claims.py @@ -8,13 +8,16 @@ * the validator actually FAILS on a mislabeled claim (a `supported` claim whose only backing is an opt-in / infra-gated test, or a `field` result labeled `supported`, or a missing path) so the gate cannot rot into a no-op; and -* every real claim in `claims.yaml` points at a path that exists (registry-rot - guard, independent of the tier contract). +* every real claim in `claims/` points at a path that exists (registry-rot + guard, independent of the tier contract); and +* the committed report is exactly what the registry renders, in an order that + does not depend on which pull request added a claim first. """ from __future__ import annotations import importlib.util +import json import sys from pathlib import Path @@ -70,7 +73,7 @@ def test_every_real_evidence_path_exists() -> None: for ev in claim.get("evidence", []) or []: if not (REPO_ROOT / ev["path"]).exists(): missing.append(f"{claim['id']} -> {ev['path']}") - assert missing == [], "claims.yaml references missing paths:\n" + "\n".join(missing) + assert missing == [], "claims/ references missing paths:\n" + "\n".join(missing) # --------------------------------------------------------------------------- # @@ -406,3 +409,59 @@ def test_report_renders_without_crashing() -> None: for evidence in claim["evidence"] ) assert {c["id"] for c in blob["claims"]} # non-empty + + +# --------------------------------------------------------------------------- # +# one file per claim; the committed report is deterministic +# --------------------------------------------------------------------------- # +def _committed_render() -> tuple[str, str]: + results = vc.validate_all(vc.load_registry()) + now = vc.COMMITTED_REPORT_STAMP + md = vc.render_markdown(results, now, False) + blob = json.dumps(vc.render_json(results, now, False), indent=2) + "\n" + return md, blob + + +def test_committed_report_is_in_sync_with_the_registry() -> None: + md, blob = _committed_render() + hint = "run: python scripts/validate_claims.py --report" + assert (REPO_ROOT / "docs" / "VERIFICATION.md").read_text(encoding="utf-8") == ( + md + ), f"docs/VERIFICATION.md is stale; {hint}" + assert (REPO_ROOT / "docs" / "verification.json").read_text( + encoding="utf-8" + ) == blob, f"docs/verification.json is stale; {hint}" + + +def test_report_does_not_depend_on_registry_order() -> None: + claims = vc.load_registry()["claims"] + forward = vc.validate_all({"claims": claims}) + backward = vc.validate_all({"claims": list(reversed(claims))}) + now = vc.COMMITTED_REPORT_STAMP + assert vc.render_markdown(forward, now, False) == vc.render_markdown( + backward, now, False + ) + assert vc.render_json(forward, now, False) == vc.render_json(backward, now, False) + + +def test_registry_is_one_file_per_claim_named_by_id(tmp_path: Path) -> None: + assert not (REPO_ROOT / "claims.yaml").exists() + assert vc.load_registry(REPO_ROOT / "claims")["claims"] + (tmp_path / "b-claim.yaml").write_text("id: b-claim\ntier: research\n") + (tmp_path / "a-claim.yaml").write_text("id: a-claim\ntier: research\n") + assert [c["id"] for c in vc.load_registry(tmp_path)["claims"]] == [ + "a-claim", + "b-claim", + ] + (tmp_path / "renamed.yaml").write_text("id: other-id\ntier: research\n") + try: + vc.load_registry(tmp_path) + except ValueError as exc: + assert "named after the claim id" in str(exc) + else: # pragma: no cover - the assertion above is the contract + raise AssertionError("a file named differently from its id must fail") + + +def test_default_report_stamp_is_fixed(monkeypatch) -> None: + monkeypatch.delenv("OAFLOW_CLAIMS_NOW", raising=False) + assert vc.resolve_now(None) == vc.COMMITTED_REPORT_STAMP diff --git a/packages/flow/tests/test_win32_window_client.py b/packages/flow/tests/test_win32_window_client.py index cf99ec8160..421c3547df 100644 --- a/packages/flow/tests/test_win32_window_client.py +++ b/packages/flow/tests/test_win32_window_client.py @@ -25,8 +25,8 @@ HONESTY: these are mock-contract tests. They prove the client implements the WindowClient seam correctly; they do NOT prove behavior on a real Windows -host (no counted qualification batch exists — see claims.yaml -``win32-window-replay-roadmap``). +host (no counted qualification batch exists — see +``claims/win32-window-replay-roadmap.yaml``). """ from __future__ import annotations