{
  "schema_version": 1,
  "evidence_type": "synthetic/theoretical",
  "command": "python virtual_bench.py",
  "passed": true,
  "checks": [
    {
      "id": "resistance_pipe",
      "description": "Constant-radius reduction",
      "expected": "matches 8 mu L/(pi r^4) to 1e-12",
      "observed": 38.19718634205488,
      "passed": true,
      "method": "Independent closed-form benchmark"
    },
    {
      "id": "fem_minimum_resistance",
      "description": "Reduced resistance checked at minimum_resistance",
      "expected": "relative pressure error < 0.01",
      "observed": 0.002226925416094816,
      "passed": true,
      "method": "New axisymmetric P2/P1 Stokes solve at 120x24 mesh"
    },
    {
      "id": "fem_nominal",
      "description": "Reduced resistance checked at nominal",
      "expected": "relative pressure error < 0.01",
      "observed": 0.0021924982968709594,
      "passed": true,
      "method": "New axisymmetric P2/P1 Stokes solve at 120x24 mesh"
    },
    {
      "id": "fem_maximum_resistance",
      "description": "Reduced resistance checked at maximum_resistance",
      "expected": "relative pressure error < 0.01",
      "observed": 0.002160894272901892,
      "passed": true,
      "method": "New axisymmetric P2/P1 Stokes solve at 120x24 mesh"
    },
    {
      "id": "adverse_pressure_detected",
      "description": "Upper range including tolerances, feed and meniscus",
      "expected": "at least one 30 mm3/s case exceeds unchanged 6500 Pa budget",
      "observed": 7323.080924347813,
      "passed": true,
      "method": "Full factorial reduced-order tolerance study; checked FEM correction"
    },
    {
      "id": "guardband",
      "description": "Conservative flow bound from the same model",
      "expected": "pressure <= 6500 Pa for every enumerated case",
      "observed": 6478.59692771179,
      "passed": true,
      "method": "Worst permissible flow rounded down to 0.1 mm3/s; original target retained"
    },
    {
      "id": "creeping_regime",
      "description": "Flow regime over tolerance envelope",
      "expected": "max Re < 0.1",
      "observed": 0.07795344151439773,
      "passed": true,
      "method": "Outlet diameter and mean velocity"
    },
    {
      "id": "synthetic_fit",
      "description": "Recover a declared resistance despite pressure offset/noise",
      "expected": "relative slope error < 1% in both cases",
      "observed": 0.0031243688050183183,
      "passed": true,
      "method": "Least squares with intercept on 3 flows x 5 repeats; seed recorded"
    },
    {
      "id": "obstruction",
      "description": "Detect synthetic added restriction",
      "expected": "fitted resistance increase > 20%",
      "observed": 0.24611992667555804,
      "passed": true,
      "method": "25% resistance challenge compared with clean run"
    },
    {
      "id": "volume_balance",
      "description": "Compliant dosing volume balance",
      "expected": "absolute residual < 1e-10 mm3",
      "observed": 9.654169824679926e-15,
      "passed": true,
      "method": "Closed-form inlet = pulse + tail + stored remainder"
    },
    {
      "id": "zero_compliance",
      "description": "Zero-compliance limiting case",
      "expected": "100 mm3 delivered during pulse and zero tail",
      "observed": 100.0,
      "passed": true,
      "method": "Analytical steady resistance network"
    },
    {
      "id": "adverse_air",
      "description": "Large trapped air affects shutoff",
      "expected": "250 mm3 air case exceeds 1 mm3 tail criterion",
      "observed": 7.5399634371012025,
      "passed": true,
      "method": "Linear isothermal gas-compliance sensitivity; no bubble transport claim"
    },
    {
      "id": "adverse_viscosity",
      "description": "Fixed pulse is not a volume controller",
      "expected": "1 Pa s case misses 100 +/- 1 mm3 target",
      "observed": 74.99996278200437,
      "passed": true,
      "method": "Same regulator setting and pulse length; changed viscosity"
    },
    {
      "id": "input_rejection",
      "description": "Invalid resistance inputs",
      "expected": "3 invalid cases rejected",
      "observed": 3,
      "passed": true,
      "method": "Zero bore, duplicate station and nonfinite viscosity"
    }
  ],
  "source_sha256": {
    "virtual_bench.py": "654f0cdd4483d6c936ffd420e3e6e06cfe5b3c1b54f87a274472359a78ba210f",
    "virtual-bench-inputs.json": "f14331d723e08c26633c6d54b6aaa698d1a3316bd2aace791ae933b2d48b1c04",
    "inputs.json": "7e648c5d05c2829f637a7073516f4b685bc5ea1fdd269fc25f1dfcaf29a24ca9",
    "flow.py": "bd54356eff3b3e1aae475e8125db712bbb6a5ebefc823a2f2066435ebfa5e0ea",
    "run.py": "d72cf12c6db3fa1c1152ce2aa98628f02a4bb97af702f3b9778dc2c1c0c5639e"
  },
  "report": "outputs/virtual-bench/report.html",
  "limitations": [
    "Synthetic measurements exercise analysis and fault detection; no physical liquid or pump was tested.",
    "Tolerance correction is checked at three declared geometry corners, not a proof for arbitrary tapers.",
    "Compliance is a lumped linear model; no droplet breakup, moving bubbles, non-Newtonian fluid or surface chemistry is resolved."
  ],
  "summary": "14 verification checks; 243 tolerance/operating cases; 30 synthetic observations; four dosing cases. Original maximum-flow condition fails added system effects; computed bound 26.4 mm3/s."
}
