{
  "meta": {
    "version": "0.2.0",
    "created_utc": "2026-11-11",
    "supersedes": "0.1.0",
    "project": "Keg-1 SOL Digital Twin",
    "change_basis": "CAD rev E review, 2026-11-10. Four inputs changed from v0.1: thermal.c_plate_j_k, thermal.r_plate_wall_k_w, thermal.r_node_plate_k_w, solar.clear_peak_w_m2 (with scenario g_peak). pv.tilt_deg and pv.azimuth are new descriptive entries. Every other value is carried from v0.1 unchanged.",
    "grades": {
      "SOURCE": "Directly stated in a source document (design docs, read 2026-11-11; CAD rev E geometry, 2026-11-10)",
      "ESTIMATE": "Planning value or engineering approximation (not a verified measurement)",
      "ASSUMPTION": "Introduced for this simulation; not present in any source document",
      "SIMULATED": "Produced by the model",
      "MEASURED": "Observed from real hardware (NONE in v0.2: the build log contains zero recorded measurements as of 2026-11-11)"
    },
    "sources": {
      "core_thesis": "Thelvanor Core Thesis: 100 W panel + 12 V 20 Ah LiFePO4 (256 Wh); nothing VERIFIED as of 2026-10-15; BOM $830 + $170 contingency.",
      "concept_note": "TXST EMGT PhD Concept Note: 256 Wh carries three idle Pi 5 nodes through a 14-h winter night with ~26 Wh to spare; paired static-quota vs SoC-price scheduler trials; admission invariant 'stored energy never crosses the reserve'.",
      "blueprint_pdf": "Keg-1 Solar Cluster Blueprint: 5-gal 304 SS ball-lock keg; thermal path chip->pad->plate->pad->wall->outside air, no fans; bucks 12->5.1 V 5 A; 'PLANNING ESTIMATES - NOT MEASUREMENTS: 12.8 W idle | 26.1 W full | 256 Wh nominal'; power plant OUTSIDE keg.",
      "assembly_pdf": "Keg-1 Assembly Instructions: RPi 5 throttles ~80 C, harder at 85 C (Raspberry Pi documentation); main fuse <=7 in from battery+.",
      "build_log": "Keg-1 Build Log: ZERO recorded measurements as of 2026-11-11. Claims c01-c10 open.",
      "cad_rev_e": "Keg-1 Solar Cluster CAD rev E (engineering review only, not released for fabrication): rolled 3 mm aluminium strip R102/R105, 66 mm developed x 375 mm; strip mass 0.200 kg; wall-side pad area 25,348 mm^2 (0.534 of rev D); solid aluminium SoC spacer 13.262 mm; second pad 0.5-1.638 mm; PV fixed at 30 deg tilt facing south. Purchased-part dimensions unverified."
    },
    "internal_units": "SI: watts (W), joules (J), seconds (s), Celsius for temperatures (identical to K for deltas). Telemetry exports Wh and degC."
  },
  "parameters": {
    "pv.rated_power_w":        { "value": 100.0, "unit": "W",  "grade": "SOURCE", "uncertainty": [80, 110], "basis": "Core Thesis + Blueprint + BOM: 100 W 12 V mono PV panel. Real harvest derate 0.6-0.8 per build-log claim c10 (open expectation)." },
    "pv.stc_irradiance_w_m2":  { "value": 1000.0, "unit": "W/m^2", "grade": "ASSUMPTION", "basis": "Standard test condition definition." },
    "pv.tilt_deg":             { "value": 30.0, "unit": "deg", "grade": "SOURCE", "basis": "NEW in v0.2. CAD rev E owner default: fixed 30 deg tilt. Descriptive; its effect enters through solar.clear_peak_w_m2." },
    "pv.azimuth":              { "value": "south", "unit": "-", "grade": "SOURCE", "basis": "NEW in v0.2. CAD rev E owner default: panel faces south." },
    "mppt.efficiency":         { "value": 0.95, "unit": "-", "grade": "ASSUMPTION", "uncertainty": [0.90, 0.98], "basis": "MPPT 10-20 A LiFePO4-profile class (Blueprint). Efficiency not stated in sources." },
    "battery.capacity_wh":     { "value": 256.0, "unit": "Wh", "grade": "SOURCE", "uncertainty": [230, 256], "basis": "Core Thesis / Blueprint / BOM: 12.8 V 20 Ah LiFePO4 = 256 Wh nominal. Blueprint labels it a planning estimate, not a measurement." },
    "battery.nominal_v":       { "value": 12.8, "unit": "V", "grade": "SOURCE", "basis": "12.8 V 20 Ah LiFePO4 with BMS (Blueprint); resting 13.0-13.4 V (Assembly)." },
    "battery.eta_charge":      { "value": 0.95, "unit": "-", "grade": "ASSUMPTION", "uncertainty": [0.90, 0.98], "basis": "LiFePO4 charge efficiency class; not in sources." },
    "battery.eta_discharge":   { "value": 0.98, "unit": "-", "grade": "ASSUMPTION", "uncertainty": [0.95, 0.995], "basis": "LiFePO4 discharge efficiency class; not in sources." },
    "battery.soc_min_bms":     { "value": 0.05, "unit": "-", "grade": "ASSUMPTION", "basis": "Typical BMS low-voltage cutoff floor for LiFePO4; cutoff value not stated in sources." },
    "reserve.fraction":        { "value": 0.20, "unit": "-", "grade": "ASSUMPTION", "basis": "Protected energy reserve policy; Concept Note requires the invariant 'stored energy never crosses the reserve' but does not fix the fraction. 20% of nominal chosen as default." },
    "buck.efficiency":         { "value": 0.90, "unit": "-", "grade": "ASSUMPTION", "uncertainty": [0.85, 0.95], "basis": "Bucks 12->5.1 V 5 A per Blueprint (SOURCE topology); efficiency not stated." },
    "bus.topology":            { "value": "PV -> MPPT -> LiFePO4 battery -> protected fused DC bus -> buck converters -> 3x Raspberry Pi 5 + 5-port GbE switch", "unit": "-", "grade": "SOURCE", "basis": "Blueprint power chain; power plant mounted OUTSIDE the keg." },
    "node.count":              { "value": 3, "unit": "-", "grade": "SOURCE", "basis": "3x Raspberry Pi 5 1 GB (Blueprint, BOM, Core Thesis)." },
    "node.p_idle_w":           { "value": 3.333, "unit": "W", "grade": "ESTIMATE", "uncertainty": [2.5, 3.5], "basis": "Partition of 12.8 W system idle planning value (3 x 3.333 + switch 2.0 + sensors 0.8). Build-log claim c04 expects 2.5-3.5 W idle per node (open, unmeasured)." },
    "node.p_full_w":           { "value": 7.767, "unit": "W", "grade": "ESTIMATE", "uncertainty": [6.0, 8.0], "basis": "Partition of 26.1 W system full-load planning value. Claim c04 expects 6-8 W full per node; c05 expects ~26 W +/-20% at bus (open, unmeasured)." },
    "system.p_idle_w":         { "value": 12.8, "unit": "W", "grade": "ESTIMATE", "basis": "Blueprint: 'PLANNING ESTIMATES - NOT MEASUREMENTS: 12.8 W idle'." },
    "system.p_full_w":         { "value": 26.1, "unit": "W", "grade": "ESTIMATE", "basis": "Blueprint: 'PLANNING ESTIMATES - NOT MEASUREMENTS: 26.1 W full'." },
    "switch.p_w":              { "value": 2.0, "unit": "W", "grade": "ESTIMATE", "basis": "5-port GbE switch (SOURCE topology); power draw is a small-switch class estimate." },
    "sensors.p_w":             { "value": 0.8, "unit": "W", "grade": "ASSUMPTION", "uncertainty": [0.3, 1.5], "basis": "Sensor suite is SOURCE (2x INA226, 4x DS18B20, 1x BME280 + MCU); power draw allowance is assumed." },
    "thermal.c_node_j_k":      { "value": 25.0, "unit": "J/K", "grade": "ASSUMPTION", "uncertainty": [15, 45], "basis": "RPi5 PCB + SoC effective heat capacity. Needs identification from heating/cooling tests (claim c08 procedure)." },
    "thermal.r_node_plate_k_w":{ "value": 2.6, "unit": "K/W", "grade": "ASSUMPTION", "uncertainty": [1.4, 4.5], "previous": 2.5, "basis": "CHANGED in v0.2 (was 2.5). Rev E stack over a 20 x 20 mm footprint, 1-D conduction R = t/(k A): 1.5 mm SoC pad (1.25 K/W) + 13.262 mm aluminium spacer at 167 W/mK (0.20 K/W) + curved second pad, mean 1.34 mm (1.12 K/W) = 2.57 K/W. Pad conductivity 3 W/mK is assumed (the v0.1 value implied the same). Contact and spreading resistance are not included, so the real value is likely higher." },
    "thermal.c_plate_j_k":     { "value": 220.0, "unit": "J/K", "grade": "ESTIMATE", "uncertainty": [160, 300], "previous": 340.0, "basis": "CHANGED in v0.2 (was 340). Rev E narrow strip 3 x 66 x 375 mm = 74,250 mm^3 = 0.200 kg, plus three solid spacers 20 x 20 x 13.262 mm = 0.043 kg; 0.243 kg x 900 J/kgK = 219 J/K. Alloy assumed." },
    "thermal.r_plate_wall_k_w":{ "value": 0.56, "unit": "K/W", "grade": "ASSUMPTION", "uncertainty": [0.19, 1.5], "previous": 0.3, "basis": "CHANGED in v0.2 (was 0.3). The v0.1 value was assumed for the wide plate. Interface resistance scales inversely with contact area; rev E wall-side pad area is 0.534 of rev D, so 0.3 / 0.534 = 0.56 K/W. Still an assumed base value." },
    "thermal.c_wall_j_k":      { "value": 2000.0, "unit": "J/K", "grade": "ASSUMPTION", "uncertainty": [1200, 3500], "basis": "~4 kg class empty 5-gal 304 SS keg, cp~500 J/kgK. Unchanged. CAD rev E computes 7.0 kg for a 2 mm wall, which is itself unverified; weigh the keg." },
    "thermal.r_wall_amb_k_w":  { "value": 0.5, "unit": "K/W", "grade": "ASSUMPTION", "uncertainty": [0.3, 0.9], "basis": "Natural convection + radiation from ~0.5 m^2 keg outer area, h~4-7 W/m^2K. Unchanged. Treats the whole wall as one temperature; with the narrower rev E strip the heat enters a smaller patch, so this is optimistic by an unknown amount." },
    "thermal.throttle_c":      { "value": 80.0, "unit": "°C", "grade": "SOURCE", "basis": "Assembly doc: RPi 5 throttles ~80 C (Raspberry Pi documentation). Sim uses 80 C as the protection policy limit." },
    "thermal.throttle_ref_c":  { "value": 85.0, "unit": "°C", "grade": "SOURCE", "basis": "Assembly doc: harder throttling at 85 C. Reference only; sim policy uses 80 C." },
    "thermal.resume_c":        { "value": 75.0, "unit": "°C", "grade": "ASSUMPTION", "basis": "Throttling hysteresis; not in sources." },
    "site.lat_deg":            { "value": 29.88, "unit": "deg", "grade": "ASSUMPTION", "basis": "San Marcos, TX inferred from Concept Note context; deployment site not confirmed in sources." },
    "site.tz_offset_h":        { "value": -6.0, "unit": "h", "grade": "ASSUMPTION", "basis": "US Central Standard Time for winter scenarios." },
    "solar.clear_peak_w_m2":   { "value": 830.0, "unit": "W/m^2", "grade": "ASSUMPTION", "uncertainty": [700, 920], "previous": 620.0, "basis": "CHANGED in v0.2 (was 620, a horizontal-panel value). Clear-sky plane-of-array peak for a south-facing 30 deg tilt at 29.88 N on the winter solstice: noon sun elevation 36.7 deg; direct beam from an air-mass model (1353 x 0.7^(AM^0.678)) plus 10% isotropic diffuse gives 833 W/m^2 on the tilted panel against 569 W/m^2 horizontal. No site irradiance data in sources. The scenarios read this value as G_PEAK_WINTER_W_M2." },
    "solar.harvest_wh_per_psh":{ "value": 70.0, "unit": "Wh/PSH", "grade": "ESTIMATE", "uncertainty": [56, 84], "basis": "Build-log claim c10 expectation '~70 Wh per PSH; derate 0.6-0.8' (open, unmeasured). Cross-check for the weather model, not a forcing input." },
    "expectation.night_margin_wh": { "value": 26.0, "unit": "Wh", "grade": "ESTIMATE", "basis": "Concept Note / claim c06: 256 Wh should carry three idle nodes through a 14-h winter night with ~26 Wh to spare (planning estimate, unmeasured). The twin must reproduce or refute this from the model; it is never hard-coded." },
    "scheduler.static.quota_wh_per_day": { "value": 60.0, "unit": "Wh/day", "grade": "ASSUMPTION", "basis": "Fixed daily compute-energy quota for the static scheduler." },
    "scheduler.static.util_cap": { "value": 0.75, "unit": "-", "grade": "ASSUMPTION", "basis": "Fixed utilization cap for static quota scheduler." },
    "scheduler.socaware.safety_factor": { "value": 1.15, "unit": "-", "grade": "ASSUMPTION", "basis": "Admission safety multiplier on predicted overnight need." },
    "control.period_s":        { "value": 60.0, "unit": "s", "grade": "ASSUMPTION", "basis": "Scheduler control period." },
    "integration.dt_s":        { "value": 10.0, "unit": "s", "grade": "ASSUMPTION", "basis": "Default integration step; equals telemetry interval." },
    "work.job_class":          { "value": "batch inference jobs, 300-3600 node-seconds at u=1", "unit": "-", "grade": "ASSUMPTION", "basis": "Synthetic workload; replaceable by measured job profiles." }
  }
}
