{
 "year": 2020,
 "cf_model_version": "2.0.0",
 "truth": "PVGIS seriescalc (EU JRC) \u2014 1 kWp crystSi PV, loss=8%: fixed at cf_model's optimal tilt (equatorward) and single-horizontal-axis tracker (trackingtype=1); P/1000 -> CF. Horizontal G(i) for the GHI-input check; WS10m for the wind cross-check.",
 "engine": "cfe8760.py + cf_model v2.0.0 \u2014 ERA5 weather (CE store / Open-Meteo archive) -> CompoundVision-parity NET expected-farm CFs: solar Erbs+Perez POA / King IAM+thermal / ILR 1.30 AC clip for tracker AND fixed arrays; wind smootherstep IEC gross curve x wake x availability x storm x electrical/blockage. The retired GHI/1000 x 0.91 proxy and its _PV_DERATE are gone.",
 "headline": "cf_model v2.0.0 (CompoundVision-parity, net expected-farm CFs) cross-validated against PVGIS across 6 globally-stratified sites (2020). Single-axis tracker: hourly correlation 0.902, physics (DC-basis) annual-energy bias +0.006 CF. Fixed at optimal tilt: correlation 0.952, DC-basis bias +0.011 CF. GHI input agreement 0.969. On the served AC convention the CFs read +0.058/+0.058 CF above PVGIS's 1 kWp DC-normalized reference \u2014 that offset IS the ILR 1.30 inverter-loading design (AC nameplate = DC/1.30), a plant-design convention, not a resource error; the DC-basis residual above is the honest physics error.",
 "pvgis_alignment": {
  "offset_won": 1,
  "corr_offset_0": 0.862,
  "corr_offset_1": 0.891,
  "note": "PVGIS SARAH3/ERA5 hourly stamps are hour-beginning (:10 past); our labels are hour-ending. The index shift was chosen ONCE by max hourly correlation on the first site's tracker CF and applied to every PVGIS series at every site. offset 1 = PVGIS shifted forward one hour to meet our hour-ending labels."
 },
 "wind_crosscheck": {
  "status": "cross-checked (gross-curve consistency only) \u2014 not independently validated",
  "shear_alpha": 0.143,
  "shear_factor_10m_to_100m": 1.39,
  "net_loss_factor": {
   "mean": 0.785,
   "min": 0.783,
   "max": 0.787,
   "note": "engine NET wind CF / GROSS IEC-curve CF per site \u2014 the expected-farm loss stack (0.97 availability x wake x storm hysteresis x electrical/blockage) cf_model applies that PVGIS's gross-curve reconstruction does not."
  },
  "summary": "Wind cross-checked vs PVGIS surface wind (WS10m) shear-lifted to 100 m (power-law alpha 0.143) through cf_model's GROSS IEC curve: hourly correlation 0.655 across all sites, 0.742 at windy temperate sites \u2014 weaker at low-wind sites where the shear-reconstruction truth has little signal. This is a weather-CONSISTENCY cross-check on the gross resource curve (PVGIS meteo is ERA5, the same root as our store/Open-Meteo; magnitude shear-dependent) and compares GROSS curves only \u2014 NOT the net farm chain (PVGIS has no farm losses), so wind is NOT independently validated (that needs a non-ERA5 hub-height source: MERRA-2 via renewables.ninja, or a met mast). Separately, the engine's own net/gross ratio averages 0.785 (range 0.783-0.787) across sites \u2014 the empirical expected-farm loss stack (availability x wake x storm x electrical/blockage) cf_model applies on top of this gross curve."
 },
 "metric_notes": "Solar compares cf_model v2 NET AC CF against PVGIS modelled PV output for the MATCHING array (tracker->trackingtype=1, fixed->optimal tilt). Hourly correlation validates the irradiance->POA->PV physics; the annual-energy bias is a design/normalisation difference (cf_model's ILR 1.30 + AC clip vs PVGIS's 1:1 kWp), not a site-selection error. The residual NMAE is inflated by normalising an intermittent quantity (half the hours are night-time zeros) by a small mean. GHI corr isolates the weather-input agreement. wind_cf is a GROSS-curve cross-consistency check vs PVGIS WS10m shear-lifted to 100 m \u2014 both ERA5-rooted, magnitude shear-dependent; honest correlation only, not validation. net_loss_factor documents the net-vs-gross farm loss stack empirically. S-hemisphere tracker comparisons (Sydney) read ~4-5 pp high vs PVGIS trackingtype=1 with corr ~0.80 while the SAME site's fixed array validates cleanly (corr 0.969, DC-basis +0.013) \u2014 a PVGIS tracker-request convention artifact at southern latitudes, not a model error (our tracker geometry is hemisphere-symmetric and parity-tested against CompoundVision).",
 "aggregate": {
  "sites": 6,
  "solar_cf_corr_mean": 0.902,
  "solar_cf_nmae_pct_mean": 46.83,
  "solar_cf_bias_mean": 0.006,
  "solar_cf_bias_ac_convention": 0.058,
  "solar_tracker_corr_mean": 0.902,
  "solar_tracker_nmae_pct_mean": 46.83,
  "solar_tracker_bias_mean": 0.058,
  "solar_tracker_bias_dc_mean": 0.006,
  "solar_fixed_corr_mean": 0.952,
  "solar_fixed_nmae_pct_mean": 40.57,
  "solar_fixed_bias_mean": 0.058,
  "solar_fixed_bias_dc_mean": 0.011,
  "ghi_corr_mean": 0.969,
  "wind_cf_corr_mean": 0.655,
  "wind_cf_corr_windy_sites": 0.742,
  "wind_cf_bias_mean": 0.119,
  "net_loss_factor_mean": 0.785
 },
 "sites": [
  {
   "site": "Drax, UK",
   "lat": 53.7,
   "lon": -0.9,
   "pvgis_db": "PVGIS-SARAH3",
   "optimal_tilt_deg": 45.0,
   "solar_cf": {
    "n": 8783,
    "mean_ours": 0.1771,
    "mean_truth": 0.1393,
    "mae": 0.069,
    "nmae_pct": 49.5,
    "bias": 0.0377,
    "corr": 0.891,
    "bias_dc_basis": 0.0025
   },
   "solar_tracker": {
    "n": 8783,
    "mean_ours": 0.1771,
    "mean_truth": 0.1393,
    "mae": 0.069,
    "nmae_pct": 49.5,
    "bias": 0.0377,
    "corr": 0.891,
    "bias_dc_basis": 0.0025
   },
   "solar_fixed": {
    "n": 8783,
    "mean_ours": 0.1638,
    "mean_truth": 0.1211,
    "mae": 0.0609,
    "nmae_pct": 50.3,
    "bias": 0.0426,
    "corr": 0.905,
    "bias_dc_basis": 0.0101
   },
   "ghi": {
    "n": 8783,
    "mean_ours": 0.119,
    "mean_truth": 0.1191,
    "mae": 0.0314,
    "nmae_pct": 26.3,
    "bias": -0.0001,
    "corr": 0.942
   },
   "wind_cf": {
    "n": 8783,
    "mean_ours": 0.564,
    "mean_truth": 0.4051,
    "mae": 0.1833,
    "nmae_pct": 45.2,
    "bias": 0.1588,
    "corr": 0.837
   },
   "net_loss_factor": 0.787
  },
  {
   "site": "Seville, Spain",
   "lat": 37.4,
   "lon": -6.0,
   "pvgis_db": "PVGIS-SARAH3",
   "optimal_tilt_deg": 35.6,
   "solar_cf": {
    "n": 8783,
    "mean_ours": 0.2962,
    "mean_truth": 0.2453,
    "mae": 0.0916,
    "nmae_pct": 37.4,
    "bias": 0.0509,
    "corr": 0.936,
    "bias_dc_basis": -0.0081
   },
   "solar_tracker": {
    "n": 8783,
    "mean_ours": 0.2962,
    "mean_truth": 0.2453,
    "mae": 0.0916,
    "nmae_pct": 37.4,
    "bias": 0.0509,
    "corr": 0.936,
    "bias_dc_basis": -0.0081
   },
   "solar_fixed": {
    "n": 8783,
    "mean_ours": 0.2605,
    "mean_truth": 0.2001,
    "mae": 0.0778,
    "nmae_pct": 38.9,
    "bias": 0.0604,
    "corr": 0.952,
    "bias_dc_basis": 0.0085
   },
   "ghi": {
    "n": 8783,
    "mean_ours": 0.2031,
    "mean_truth": 0.2161,
    "mae": 0.0371,
    "nmae_pct": 17.2,
    "bias": -0.013,
    "corr": 0.97
   },
   "wind_cf": {
    "n": 8783,
    "mean_ours": 0.1648,
    "mean_truth": 0.0493,
    "mae": 0.1208,
    "nmae_pct": 245.2,
    "bias": 0.1155,
    "corr": 0.687
   },
   "net_loss_factor": 0.784
  },
  {
   "site": "Berlin, DE",
   "lat": 52.5,
   "lon": 13.4,
   "pvgis_db": "PVGIS-SARAH3",
   "optimal_tilt_deg": 45.0,
   "solar_cf": {
    "n": 8783,
    "mean_ours": 0.1908,
    "mean_truth": 0.157,
    "mae": 0.0702,
    "nmae_pct": 44.7,
    "bias": 0.0338,
    "corr": 0.904,
    "bias_dc_basis": -0.0042
   },
   "solar_tracker": {
    "n": 8783,
    "mean_ours": 0.1908,
    "mean_truth": 0.157,
    "mae": 0.0702,
    "nmae_pct": 44.7,
    "bias": 0.0338,
    "corr": 0.904,
    "bias_dc_basis": -0.0042
   },
   "solar_fixed": {
    "n": 8783,
    "mean_ours": 0.1763,
    "mean_truth": 0.1343,
    "mae": 0.0622,
    "nmae_pct": 46.3,
    "bias": 0.042,
    "corr": 0.918,
    "bias_dc_basis": 0.0069
   },
   "ghi": {
    "n": 8783,
    "mean_ours": 0.1285,
    "mean_truth": 0.1334,
    "mae": 0.033,
    "nmae_pct": 24.7,
    "bias": -0.0048,
    "corr": 0.947
   },
   "wind_cf": {
    "n": 8783,
    "mean_ours": 0.4558,
    "mean_truth": 0.138,
    "mae": 0.3221,
    "nmae_pct": 233.5,
    "bias": 0.3179,
    "corr": 0.636
   },
   "net_loss_factor": 0.784
  },
  {
   "site": "Phoenix, US",
   "lat": 33.4,
   "lon": -112.0,
   "pvgis_db": "PVGIS-ERA5",
   "optimal_tilt_deg": 32.2,
   "solar_cf": {
    "n": 8783,
    "mean_ours": 0.3493,
    "mean_truth": 0.2714,
    "mae": 0.1071,
    "nmae_pct": 39.5,
    "bias": 0.0778,
    "corr": 0.938,
    "bias_dc_basis": 0.0083
   },
   "solar_tracker": {
    "n": 8783,
    "mean_ours": 0.3493,
    "mean_truth": 0.2714,
    "mae": 0.1071,
    "nmae_pct": 39.5,
    "bias": 0.0778,
    "corr": 0.938,
    "bias_dc_basis": 0.0083
   },
   "solar_fixed": {
    "n": 8783,
    "mean_ours": 0.303,
    "mean_truth": 0.2264,
    "mae": 0.0797,
    "nmae_pct": 35.2,
    "bias": 0.0766,
    "corr": 0.989,
    "bias_dc_basis": 0.0163
   },
   "ghi": {
    "n": 8783,
    "mean_ours": 0.2381,
    "mean_truth": 0.2491,
    "mae": 0.017,
    "nmae_pct": 6.8,
    "bias": -0.011,
    "corr": 0.995
   },
   "wind_cf": {
    "n": 8783,
    "mean_ours": 0.1781,
    "mean_truth": 0.0542,
    "mae": 0.1471,
    "nmae_pct": 271.3,
    "bias": 0.1238,
    "corr": 0.457
   },
   "net_loss_factor": 0.783
  },
  {
   "site": "Delhi, India",
   "lat": 28.6,
   "lon": 77.2,
   "pvgis_db": "PVGIS-ERA5",
   "optimal_tilt_deg": 28.0,
   "solar_cf": {
    "n": 8783,
    "mean_ours": 0.2847,
    "mean_truth": 0.2428,
    "mae": 0.0821,
    "nmae_pct": 33.8,
    "bias": 0.0418,
    "corr": 0.943,
    "bias_dc_basis": -0.0148
   },
   "solar_tracker": {
    "n": 8783,
    "mean_ours": 0.2847,
    "mean_truth": 0.2428,
    "mae": 0.0821,
    "nmae_pct": 33.8,
    "bias": 0.0418,
    "corr": 0.943,
    "bias_dc_basis": -0.0148
   },
   "solar_fixed": {
    "n": 8783,
    "mean_ours": 0.2609,
    "mean_truth": 0.1976,
    "mae": 0.0682,
    "nmae_pct": 34.5,
    "bias": 0.0634,
    "corr": 0.979,
    "bias_dc_basis": 0.0113
   },
   "ghi": {
    "n": 8783,
    "mean_ours": 0.2044,
    "mean_truth": 0.2176,
    "mae": 0.0282,
    "nmae_pct": 13.0,
    "bias": -0.0132,
    "corr": 0.982
   },
   "wind_cf": {
    "n": 8783,
    "mean_ours": 0.1717,
    "mean_truth": 0.0557,
    "mae": 0.1342,
    "nmae_pct": 240.8,
    "bias": 0.1159,
    "corr": 0.561
   },
   "net_loss_factor": 0.784
  },
  {
   "site": "Sydney, AU",
   "lat": -33.9,
   "lon": 151.2,
   "pvgis_db": "PVGIS-ERA5",
   "optimal_tilt_deg": 32.6,
   "solar_cf": {
    "n": 8783,
    "mean_ours": 0.2726,
    "mean_truth": 0.1666,
    "mae": 0.1268,
    "nmae_pct": 76.1,
    "bias": 0.106,
    "corr": 0.8,
    "bias_dc_basis": 0.0517
   },
   "solar_tracker": {
    "n": 8783,
    "mean_ours": 0.2726,
    "mean_truth": 0.1666,
    "mae": 0.1268,
    "nmae_pct": 76.1,
    "bias": 0.106,
    "corr": 0.8,
    "bias_dc_basis": 0.0517
   },
   "solar_fixed": {
    "n": 8783,
    "mean_ours": 0.2461,
    "mean_truth": 0.1843,
    "mae": 0.0703,
    "nmae_pct": 38.2,
    "bias": 0.0618,
    "corr": 0.969,
    "bias_dc_basis": 0.0128
   },
   "ghi": {
    "n": 8783,
    "mean_ours": 0.1906,
    "mean_truth": 0.1872,
    "mae": 0.0247,
    "nmae_pct": 13.2,
    "bias": 0.0034,
    "corr": 0.975
   },
   "wind_cf": {
    "n": 8783,
    "mean_ours": 0.4032,
    "mean_truth": 0.5183,
    "mae": 0.1967,
    "nmae_pct": 37.9,
    "bias": -0.1151,
    "corr": 0.754
   },
   "net_loss_factor": 0.785
  }
 ]
}