{
  "schema_version": 1,
  "evidence_type": "synthetic/theoretical",
  "command": "python run.py",
  "passed": true,
  "checks": [
    {
      "id": "thermal-count",
      "description": "All declared thermal/load/direction corners executed",
      "expected": 24,
      "observed": 24,
      "passed": true,
      "method": "4 masses x 3 temperatures x 2 loading directions"
    },
    {
      "id": "thermal-failures",
      "description": "Aligned thermal/systematic error can exceed 5 g",
      "expected": "At least one adverse corner",
      "observed": 3,
      "passed": true,
      "method": "Declared +/-5 g screening criterion on 95th absolute error; failures retained"
    },
    {
      "id": "selected-envelope",
      "description": "Selected temperature/time envelope meets the error screen",
      "expected": "All 16 corners <= 5 g",
      "observed": 4.701848058270707,
      "passed": true,
      "method": "Independent seed; +/-2 C since calibration and <=30 s drift; both hysteresis directions"
    },
    {
      "id": "continuous-envelope",
      "description": "Selected mass range satisfies a continuous theoretical bound",
      "expected": "Conservative 95% absolute-error bound <= 5 g",
      "observed": {
        "worst_systematic": {
          "mass_g": 4788.088588382688,
          "temperature_change_c": 2.0,
          "direction": 1,
          "mean_error_g": 4.027639087022941
        },
        "filtered_noise_std_g": 0.39981535588755024,
        "conservative_95pct_absolute_error_g": 4.811262785028603
      },
      "passed": true,
      "method": "Solve exact extrema of the declared sinusoidal error curve; add 1.96 filtered-noise standard deviations"
    },
    {
      "id": "calibration-valid",
      "description": "Uncontaminated batch passes residual gate",
      "expected": true,
      "observed": true,
      "passed": true,
      "method": "2 g maximum mean residual at each calibration mass"
    },
    {
      "id": "calibration-corrupt",
      "description": "Biased mass group is rejected",
      "expected": "Both 10 g and 50 g injected biases rejected",
      "observed": [
        false,
        false
      ],
      "passed": true,
      "method": "Inject group-wide offset into 30 readings at 8 kg; fit with original OLS implementation"
    },
    {
      "id": "covariance",
      "description": "Shared temperature source increases variance",
      "expected": "Correlated budget greater than independent",
      "observed": {
        "independent_g": 1.777736266947072,
        "correlated_g": 1.9132031347504401
      },
      "passed": true,
      "method": "Add 2*u_zero*u_span for the shared rectangular temperature variable"
    },
    {
      "id": "monte-carlo",
      "description": "Synthetic correlated uncertainty agrees with analytic variance",
      "expected": "Standard deviation difference < 2%",
      "observed": 5.582826424710419e-06,
      "passed": true,
      "method": "50000 seeded draws; all bounds and correlation explicit"
    },
    {
      "id": "alias-frequency",
      "description": "Sampled 93 Hz tone aliases to 7 Hz",
      "expected": "Dominant discrete frequency 7 Hz",
      "observed": 7.0,
      "passed": true,
      "method": "100 Hz acquisition, frequency folding f_alias = abs(93 - 100)"
    },
    {
      "id": "analog-suppression",
      "description": "Declared analog filter reduces the aliased amplitude",
      "expected": "RMS ratio agrees with transfer magnitude within 1e-8",
      "observed": 0.011429877700308608,
      "passed": true,
      "method": "H(f)=(1+j*f/10)^-2; two identical 10 Hz RC poles"
    },
    {
      "id": "zero-confirmation",
      "description": "Correct empty-pan gate preserves a real 2 g load",
      "expected": 0.0,
      "observed": 0.0,
      "passed": true,
      "method": "300 updates with empty confirmation false"
    },
    {
      "id": "wrong-confirmation",
      "description": "False empty confirmation absorbs a real load",
      "expected": "Offset exceeds 1.9 g",
      "observed": 1.9953349886640968,
      "passed": true,
      "method": "Same updates with deliberately incorrect external empty indication; adverse result"
    }
  ],
  "source_sha256": {
    "completion_support.py": "7dd51b9e18187a82625b26144655e80aeac3b6a66a3e68e71a632d01d1844ec8",
    "inputs.json": "2203a9afac47dace813c6a49141b0c430df0f945e9c3a6f0bcaee8c9d926686b",
    "measurement.py": "bee1659818636655402f94f5b8b93217f5d39e121d3f22cb2c686ac8afa3a377",
    "run.py": "5f397b53a79b5e2a8086954a85c042c72b98247e3d247159ba103a1a72b72243",
    "support.py": "4641df314624a5baedfb535ef20f7e0f5e0e47332de3d35e413241e5eabb01f8",
    "test_measurement.py": "f83fe5f960254649abe79a4ce9dd634e410d8c4a30aafbd68503b84aaf9067b4",
    "test_virtual_commissioning.py": "d7ca70a4a3d89566e867f05c965f2cf310f220bd34f4d1c346be133d298f5ed5",
    "virtual_commissioning.py": "c9d588b47e280430aee02bdccfb8dd111295a0644673ccece495c3777a3751ac"
  },
  "report": "virtual-validation.html",
  "limitations": [
    "This completes the theoretical and synthetic qualification run-through. No real bridge, ADC, temperature chamber, weights or calibration certificate was used.",
    "The analog filter is an ideal transfer function, not a released circuit. ADC common-mode limits, reference tracking, component tolerances, EMI and physical overload survival are not established by this model.",
    "Systematic effects can align rather than cancel. The failed thermal corners remain visible; a small white-noise standard deviation does not guarantee a small total error.",
    "Zero tracking still depends on a trustworthy external empty-pan indication. The simulation shows why a false confirmation can remove a genuine small load."
  ]
}
