diff --git a/docs/plans/igneum-2.0-test-harness-map.md b/docs/plans/igneum-2.0-test-harness-map.md index c1d31f202..68b90bf37 100644 --- a/docs/plans/igneum-2.0-test-harness-map.md +++ b/docs/plans/igneum-2.0-test-harness-map.md @@ -259,6 +259,15 @@ Rule: a case maps to a cell only where the cell's tests visibly answer it; cover - VER-01 Authenticate light-client bootstrap: fails today, disclosed: the light client authenticates the certificate's signatures and the header path but the voter table is a node-supplied trust anchor named on /light; a forged table signature and a wrong-network certificate are refused - VER-02 Verify evolving authority and execution statements: fails today, disclosed: the execution statement's proof is verified by the nodes and the browser verifies the aggregator signature and the post root under it; an in-browser verifier for the permitted proof and a table commitment close it +### suite:pool + +- Command: `tools/build-remote.sh --box 2 -- test --release -p igneum-pool (from pool/, the pool-2.0 branch against the fork's successor-2.0.1)` +- Box class: suite (bounded; box 2) +- Fixtures: F0, F1 +- Cases: + - UX-05 Keep voting keys with the miner through pooling: partial: the vote-key commitment on the wire (verify::tests::a_share_under_another_key_is_refused_before_the_hash: known-pass the member's key, known-fail another key on the share and a job naming another key, refused with code vote_key before the hash), the open pool's sidechain::check_key (the claimed key, the header's key and the reveal are one key), the same-nonce-other-template wrong_hash test, the TLS binding test; the malicious-pool run and the leave-and-retain run on the devnet-4 pair are the UX-05 batch's other evidence + - UX-04 Pay small operators without hidden custody: partial: PPLNS distribution tests (fee first, never overpays, late joiner), the payout key file round trip, the signed transfer decode; the live payout path on the devnet-4 pair is the UX-04 batch's evidence + ## Automated cases with no harness in the matrix (NOT RUN, the reason) - GOV-02 Approve thresholds before results: the approval is recorded in the registry's approval field; the automated half (thresholds frozen before any run_status) is the gate rule landing by 21:00 @@ -322,4 +331,4 @@ Rule: a case maps to a cell only where the cell's tests visibly answer it; cover ## Count -109 automated cases: 55 mapped to a cell, 58 NOT RUN with a reason. +109 automated cases: 56 mapped to a cell, 58 NOT RUN with a reason. diff --git a/docs/plans/igneum-2.0-test-registry.json b/docs/plans/igneum-2.0-test-registry.json index cde81defd..b44faa000 100644 --- a/docs/plans/igneum-2.0-test-registry.json +++ b/docs/plans/igneum-2.0-test-registry.json @@ -165,10 +165,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "the evidence vault F9 (raw and negative evidence preserved) is the gate rule landing by 21:00: a PASS must carry its evidence file", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -321,10 +321,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "the stale-evidence rule (evidence older than the manifest sha reads NOT RUN) is the gate rule landing by 21:00", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } } ] @@ -587,10 +587,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "accepted work under ordinary connectivity needs the fault network F4", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -1466,10 +1466,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "seed-selection resistance is the census harness (the class v6 invention lane), not yet in the matrix", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -1624,10 +1624,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "the no-new-rules counterfactual is a research harness", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } } ] @@ -2272,10 +2272,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "execution DoS workloads need the workload catalogue F3", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2749,10 +2749,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "the consumer-shard reproduction is the fleet lane's pods", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2784,10 +2784,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "proving on the mining configuration is the fleet lane's", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2819,10 +2819,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "the request-to-payment path is the proving fleet's measurement", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2854,10 +2854,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "sustained load is the proving fleet's", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2889,10 +2889,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "overload and recovery is the proving fleet's", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2924,10 +2924,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "assignment windows are the proving fleet's", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2959,10 +2959,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "reassignment is the proving fleet's", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -2994,10 +2994,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "customer-verifiable output is the reference apps plus the fleet", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } } ] @@ -3092,10 +3092,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "revenue separation is the economics lane's model", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -3129,10 +3129,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "the modified-client task choice needs an adversarial client harness", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -3166,10 +3166,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "demand spikes are the economic model", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -3203,10 +3203,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "reservation abuse needs the capacity harness", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -3240,10 +3240,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "difficulty and timestamp manipulation needs the fault network F4", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -3277,10 +3277,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "self-dealing fees need the economic model and a live window", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -3314,10 +3314,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "failure concentration is a live-window measurement", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } } ] @@ -3974,10 +3974,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "wallet key protection is the wallet lane's security row", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4068,10 +4068,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "the no-founder exercise is an operations run, not a suite", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4103,10 +4103,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "bootstrap diversity needs the fault network F4", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4217,10 +4217,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "proving workload isolation is the fleet's pod row", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4292,10 +4292,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "runbook detection is an operations run", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4327,10 +4327,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "repeat independent operation is a cross-release observation", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } } ] @@ -4491,18 +4491,17 @@ "manual_page": 58, "owner_lane": "pool design seat (a3832b1c3b274b310)", "run_status": "RUNNING", - "evidence_path": "build-1:/srv/artefacts/tas/201-ef0f2ed8-2826f37e/node-ef0f2ed8/box4-miner.log", - "run_id": "201-ef0f2ed8-2826f37e", - "updated": "2026-10-08T18:51:08.658Z", + "evidence_path": "build-2 suite 30 of 30 ok on 72cc306e8 (the vote-key known-pass and known-fail and the sidechain key check among them); the devnet-4 pair runs pending", + "run_id": "pool-2.0-20261008-01", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { - "cell": "suite:miner", - "manifest_sha": "ef0f2ed8", + "cell": "suite:pool", + "manifest_sha": "72cc306e8", "coverage": { - "UX-06": "partial: the miner's own template selection tests", - "UX-04": "partial: payout label and share accounting tests; custody is the pool lane's row", - "POW-01": "partial: the pack re-check seam against the pack's 96 vectors (recheck_pack); the million-vector campaign is harness:p01-vectors" + "UX-05": "partial: the vote-key commitment on the wire (verify::tests::a_share_under_another_key_is_refused_before_the_hash: known-pass the member's key, known-fail another key on the share and a job naming another key, refused with code vote_key before the hash), the open pool's sidechain::check_key (the claimed key, the header's key and the reveal are one key), the same-nonce-other-template wrong_hash test, the TLS binding test; the malicious-pool run and the leave-and-retain run on the devnet-4 pair are the UX-05 batch's other evidence", + "UX-04": "partial: PPLNS distribution tests (fee first, never overpays, late joiner), the payout key file round trip, the signed transfer decode; the live payout path on the devnet-4 pair is the UX-04 batch's evidence" }, - "at": "2026-10-08T18:51:08.658Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4532,14 +4531,17 @@ "manual_page": 58, "owner_lane": "pool design seat (a3832b1c3b274b310)", "run_status": "RUNNING", - "evidence_path": "docs/design/pool-vote-key-commitment.md", - "run_id": "team-2026-10-08", - "updated": "2026-10-08 18:3x UK", + "evidence_path": "build-2 suite 30 of 30 ok on 72cc306e8 (the vote-key known-pass and known-fail and the sidechain key check among them); the devnet-4 pair runs pending", + "run_id": "pool-2.0-20261008-01", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { - "what_was_run": "the pool vote-key commitment design", - "run_by": "pool design seat (a3832b1c3b274b310)", - "under_the_standard": "no: team-run before the standard's procedure; the status is RUNNING until the case is re-run under its steps with the profile's numbers and an independent run where the profile asks one", - "pass_or_fail_today": "not judged under the standard yet" + "cell": "suite:pool", + "manifest_sha": "72cc306e8", + "coverage": { + "UX-05": "partial: the vote-key commitment on the wire (verify::tests::a_share_under_another_key_is_refused_before_the_hash: known-pass the member's key, known-fail another key on the share and a job naming another key, refused with code vote_key before the hash), the open pool's sidechain::check_key (the claimed key, the header's key and the reveal are one key), the same-nonce-other-template wrong_hash test, the TLS binding test; the malicious-pool run and the leave-and-retain run on the devnet-4 pair are the UX-05 batch's other evidence", + "UX-04": "partial: PPLNS distribution tests (fee first, never overpays, late joiner), the payout key file round trip, the signed transfer decode; the live payout path on the devnet-4 pair is the UX-04 batch's evidence" + }, + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4721,10 +4723,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "commercial evidence, no automated harness", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4761,10 +4763,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "commercial evidence", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4801,10 +4803,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "commercial evidence", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4841,10 +4843,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "commercial evidence", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4881,10 +4883,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "commercial evidence", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -4921,10 +4923,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "commercial evidence", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -5084,10 +5086,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "leadership comparison, an observation window", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -5122,10 +5124,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "observation window", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -5160,10 +5162,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "observation window", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -5198,10 +5200,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "observation window", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -5236,10 +5238,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "observation window", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } }, { @@ -5308,10 +5310,10 @@ "run_status": "NOT RUN", "evidence_path": "", "run_id": "", - "updated": "2026-10-08T19:13:20.937Z", + "updated": "2026-10-08T19:15:13.113Z", "evidence_record": { "reason": "observation window", - "at": "2026-10-08T19:13:20.937Z" + "at": "2026-10-08T19:15:13.113Z" } } ] diff --git a/tools/ci/batches/pool-2.0-20261008-01.json b/tools/ci/batches/pool-2.0-20261008-01.json new file mode 100644 index 000000000..4ac537a70 --- /dev/null +++ b/tools/ci/batches/pool-2.0-20261008-01.json @@ -0,0 +1,12 @@ +{ + "run_id": "pool-2.0-20261008-01", + "manifest_sha": "72cc306e8", + "evidence_dir": "build-2:/srv/builds/igneum-wt-pool-2.0/pool (the suite log; 30 of 30 ok at 20:1x UK) and docs/analysis/binding-review-2026-10.md", + "cells": [ + { + "cell": "suite:pool", + "status": "RUNNING", + "evidence": "build-2 suite 30 of 30 ok on 72cc306e8 (the vote-key known-pass and known-fail and the sidechain key check among them); the devnet-4 pair runs pending" + } + ] +} \ No newline at end of file diff --git a/tools/ci/test-map.json b/tools/ci/test-map.json index db5eff88c..9ff8b6b7e 100644 --- a/tools/ci/test-map.json +++ b/tools/ci/test-map.json @@ -443,6 +443,22 @@ "VER-01": "fails today, disclosed: the light client authenticates the certificate's signatures and the header path but the voter table is a node-supplied trust anchor named on /light; a forged table signature and a wrong-network certificate are refused", "VER-02": "fails today, disclosed: the execution statement's proof is verified by the nodes and the browser verifies the aggregator signature and the post root under it; an in-browser verifier for the permitted proof and a table commitment close it" } + }, + "suite:pool": { + "command": "tools/build-remote.sh --box 2 -- test --release -p igneum-pool (from pool/, the pool-2.0 branch against the fork's successor-2.0.1)", + "box_class": "suite (bounded; box 2)", + "fixtures": [ + "F0", + "F1" + ], + "cases": [ + "UX-05", + "UX-04" + ], + "coverage": { + "UX-05": "partial: the vote-key commitment on the wire (verify::tests::a_share_under_another_key_is_refused_before_the_hash: known-pass the member's key, known-fail another key on the share and a job naming another key, refused with code vote_key before the hash), the open pool's sidechain::check_key (the claimed key, the header's key and the reveal are one key), the same-nonce-other-template wrong_hash test, the TLS binding test; the malicious-pool run and the leave-and-retain run on the devnet-4 pair are the UX-05 batch's other evidence", + "UX-04": "partial: PPLNS distribution tests (fee first, never overpays, late joiner), the payout key file round trip, the signed transfer decode; the live payout path on the devnet-4 pair is the UX-04 batch's evidence" + } } }, "not_run": {