{
  "schema_version": 1,
  "evidence_type": "synthetic/theoretical",
  "command": "python complete_validation.py",
  "passed": true,
  "checks": [
    {
      "id": "energy-normal",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.8802928225287818e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-heater_open",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.8816395754174122e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-poor_contact",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 2.8638594141652686e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-relay_stuck_unprotected",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.7876513044176946e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-relay_stuck_protected",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 2.3258788991190883e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-sensor_frozen_unprotected",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.7888418780398984e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-sensor_frozen_protected",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 2.3438763828681837e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-sensor_open",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 2.340426342986043e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-sensor_bias_minus5",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.885565852572555e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-hot_ambient",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.9056306358116664e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-high_losses",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.1169533694369635e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-normal_grid_22_5",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.4801145254117406e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-normal_grid_22_20",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 5.213723042158174e-14,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-normal_grid_35_5",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 1.5291926002990023e-13,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "energy-normal_grid_35_20",
      "description": "Heat input equals stored plus lost energy",
      "expected": "relative error < 1e-8",
      "observed": 5.1833003833249124e-14,
      "passed": true,
      "method": "Implicit Euler FE balance including actual failed-heater power"
    },
    {
      "id": "normal-readiness",
      "description": "Full modeled working area stays in band for 300 s",
      "expected": "ready at end; no cutoff",
      "observed": {
        "ready": true,
        "cutoff": null
      },
      "passed": true,
      "method": "Full surface node criterion, not center sensor alone"
    },
    {
      "id": "relay_stuck-protection",
      "description": "Independent cutoff limits the modeled fault excursion",
      "expected": "cutoff operates; heater <=135 C and surface <=110 C",
      "observed": {
        "cutoff_s": 936,
        "heater_C": 116.92538513571891,
        "surface_C": 105.22620672019617
      },
      "passed": true,
      "method": "A separate modeled contactor removes power even with the control output stuck"
    },
    {
      "id": "relay_stuck-unsafe",
      "description": "The same fault without cutoff exceeds the screened temperature",
      "expected": "surface >110 C",
      "observed": 193.49575079760731,
      "passed": true,
      "method": "Counterfactual fault run; expected rejected condition"
    },
    {
      "id": "sensor_frozen-protection",
      "description": "Independent cutoff limits the modeled fault excursion",
      "expected": "cutoff operates; heater <=135 C and surface <=110 C",
      "observed": {
        "cutoff_s": 990,
        "heater_C": 116.95685593955196,
        "surface_C": 105.2584733958202
      },
      "passed": true,
      "method": "A separate modeled contactor removes power even with the control output stuck"
    },
    {
      "id": "sensor_frozen-unsafe",
      "description": "The same fault without cutoff exceeds the screened temperature",
      "expected": "surface >110 C",
      "observed": 193.34601172352424,
      "passed": true,
      "method": "Counterfactual fault run; expected rejected condition"
    },
    {
      "id": "poor-contact-cutoff",
      "description": "Poor contact is caught at the heater even if surface stays cooler",
      "expected": "cutoff before 135 C heater",
      "observed": {
        "cutoff_s": 70,
        "heater_C": 127.0924441238627
      },
      "passed": true,
      "method": "Individual heater temperature monitoring in the model"
    },
    {
      "id": "open-sensor-failoff",
      "description": "An invalid controller sensor latches power off",
      "expected": "all power = 0 after fault",
      "observed": 0.0,
      "passed": true,
      "method": "NaN sensor injection with explicit nonfinite guard"
    },
    {
      "id": "bias-quality-gate",
      "description": "A 5 C low-reading controller cannot falsely satisfy the full-surface criterion",
      "expected": "not ready at end",
      "observed": false,
      "passed": true,
      "method": "Separate modeled surface grid checks the target band"
    },
    {
      "id": "selected-envelope",
      "description": "Six ambient/loss corner cases meet the selected operating conditions",
      "expected": "all six ready at end with no cutoff",
      "observed": [
        {
          "case": "normal",
          "ready": true,
          "cutoff": null
        },
        {
          "case": "hot_ambient",
          "ready": true,
          "cutoff": null
        },
        {
          "case": "normal_grid_22_5",
          "ready": true,
          "cutoff": null
        },
        {
          "case": "normal_grid_22_20",
          "ready": true,
          "cutoff": null
        },
        {
          "case": "normal_grid_35_5",
          "ready": true,
          "cutoff": null
        },
        {
          "case": "normal_grid_35_20",
          "ready": true,
          "cutoff": null
        }
      ],
      "passed": true,
      "method": "22/35 C ambient x 5/10/20 W/m2K top convection; bottom U2, contact1000, 60 W limit"
    },
    {
      "id": "heater-open-rejection",
      "description": "Loss of one heater cannot release an out-of-band process",
      "expected": "not ready",
      "observed": false,
      "passed": true,
      "method": "Full-surface readiness interlock under an open heater"
    },
    {
      "id": "insulation-loss-rejection",
      "description": "Combined high top/bottom losses outside the selected envelope are rejected",
      "expected": "not ready at end",
      "observed": false,
      "passed": true,
      "method": "Changed bottom U12 and top h20; the original temperature target is retained"
    },
    {
      "id": "cutoff-step-refinement",
      "description": "Halving dt preserves protected-fault peak and cutoff time",
      "expected": "peak difference < 1 C; trip difference <= 4 s",
      "observed": {
        "peak_difference_C": 0.06924999552458644,
        "trip_difference_s": 1.0
      },
      "passed": true,
      "method": "2 s versus 1 s integration and sampled cutoff"
    }
  ],
  "source_sha256": {
    "complete_validation.py": "09ce30671b5ba392ad1018e8608093a91beac8a9938ad95c494ad838a6ffa1bc",
    "completion_util.py": "13ea3f7914cacfa378a684a234a33778ac10ed3b4473dbff5f0e4194419ff47d",
    "completion-inputs.json": "4c64481834879f07d4d96ac30081030d10e24be39213cbc6535ef6975f6d4298",
    "inputs.json": "b05e8fb94952a687ae2318b89865cd63abf23274df584ede3b9be89cc48fb7bc",
    "solver.py": "5930bfc5a98586b171724901083ab558ff86a67933b3ede0e41ccf2d6ef8dae9",
    "test_completion.py": "ec28cbd88d7e7ffbdd7689d0cdf41c26d729133fc032f856f8c4397499418491",
    "completion-description.json": "d9bc184be09c15413515c0fd96af3bbf8a63ac38789403d1e1a280bb78e13b25",
    "run.py": "db8548a04428450c9e096cdf64e89fda1e61fccf49c62be1d59d6fd245c4bed0",
    "engineering_util.py": "70ad113d477e969fdbca2e85fd6acb629ab8dd5c650f51ca6a33be1eacf353fc"
  },
  "report": "completion/report.html",
  "limitations": [
    "The same 2D thin-plate FE model underlies normal and fault cases. Through-thickness gradients, radiation separated from effective losses, adhesive behavior and actual wiring are outside this model.",
    "Cutoff sensors, a separate contactor, threshold accuracy and a 2 s response are assumed. This is a completed theoretical protection study, not certified safety hardware or firmware.",
    "The independent surface readiness check uses modeled surface temperatures. Real sensor placement, attachment errors, drift and calibration need measured data before a process qualification.",
    "Faults are single modeled failures except the explicit unprotected counterfactual. Common-cause loss of all sensing/power interruption is not protected by a numerical assumption.",
    "No physical heating, insulation fire assessment, electrical safety test, curing trial or measured warm-up result is claimed."
  ],
  "results": {
    "thermal_and_fault_cases": 15,
    "selected_operating_cases": 6,
    "energy_checks": 15,
    "half_step_peak_change_C": 0.06924999552458644,
    "normal_ready_s": 2318
  }
}
