Evaluation-first power forecast repair¶
Scope and release boundary¶
This change repairs evidence integrity, solar calibration, operating-state verification and candidate uncertainty. It does not enable CL61/PDU control, change the production deployment, or claim that a physical candidate has passed its promotion campaign. Original v10 code/products and immutable issues remain baseline evidence. Corrected legacy generation is a new semantic version, not new training observations for v10.
The public development product must not be relabelled as a validated physical forecast. Stage replay and recovery in an isolated candidate tree; promote only after the cumulative gates below pass.
Implemented contracts¶
- Archive writes clear inherited string widths/chunks, preserve nanosecond times, and verify a staged store before replacement. A failed validation leaves the previous archive intact. The recovery command creates a new archive solely from complete checksum-verified issue snapshots. Conflicting and unverifiable history is reported, never guessed or relabelled.
- Scalar PV calibration uses contemporaneous completed daylight intervals, not thousands of near-anchor records matched to one future value or a ratio of historical and future percentiles. Cached re-anchors cannot repeatedly learn the same errors. The ensemble uses the deterministic anchor and bound calibration snapshot, with its own source-cycle eligibility.
- Forecast and observation power share a total battery-side energy convention. AC plus inverter output is explicitly labelled an incomplete fallback, not training truth. SOC is an endpoint observation; solar/load are matched to their actual interval support, with coverage and gap checks. Available-PV verification requires all three MPPT-active flags; curtailed delivery is a separate quantity.
- Exact observed operating-state changes and unknown telemetry are separated from unchanged-state evidence. Residual fitting does not learn operator switches as a same-state bias. Retrospective observed-load/observed-solar/ both-input integrations are explicitly ineligible for predictive scoring.
- Candidate member grids can be aligned only with an identical SOC anchor and source cycle, complete source coverage and conserved interval energy. SOC is reintegrated, never interpolated. Missing tails/cycles still fail closed.
- Residual quantiles create reproducible, temporally coherent member errors. This is not a claim of calibrated coverage: held-out CRPS and interval coverage remain required. Solar hardware uncertainty is not invented from unverified specifications.
- Campaign semantic keys exclude per-issue member arrays, learned battery values and publication signatures. New candidates retain the complete code revision but also carry a scoped implementation-content digest. UI-only changes therefore need not erase a compatible campaign. Legacy evidence still uses its original full code identity.
- Reserve-event sufficiency counts distinct observed downcrossings, not many forecast rows during one low-battery period. Initial low states and crossings across long observation gaps are not counted as established events.
Safe recovery and replay¶
Run on the development host using its existing scientific Python runtime and a tested, checksum-recorded isolated checkout. Examples deliberately require new output paths and do not overwrite the live archives:
python repair_power_forecast_archive.py \
--issues-root /data/aurora/dev-products/power/forecast-issues \
--output-zarr /data/aurora/dev-products/power/candidates/integrity-repair-20260911/recovered.zarr \
--report /data/aurora/dev-products/power/candidates/integrity-repair-20260911/recovery-report.json
python evaluate_power_diagnostic_replays.py \
--issue-directory /path/to/verified/issue-directory \
--power-zarr /data/aurora/products/power/power.zarr \
--output-zarr /path/to/new/retrospective-diagnostic.zarr
The bounded replay queue accepts an explicit recovered archive and immutable
issue root. Its service example uses MemoryMax=1.5G, CPU limits and no public
model retrieval. It defers when the wider model evaluator is active; unknown
service state is not treated as permission to run. Deferral/failure never
marks an issue processed. Installing or activating the example timer is a
separate deployment action, not a side effect of running tests.
Before replacing any development artifact, preserve checksum-verified source, configuration, state, archives and score products. Verify the new archive and score outputs, stop only the named competing writer if a live swap is later approved, and retain a one-command path rollback. No production replacement is part of this repair.
Data-dependent work still gated¶
- Obtain surveyed per-array rated power, azimuth, tilt and controller limits. The existing configuration is explicitly provisional; do not convert curtailed observed peaks into claimed hardware ratings.
- Enable the already implemented upstream register-791 acquisition through a controlled logger release/restart. Existing daily CSV headers must remain unchanged; new fields start in the next daily file. Do not restart the acquisition system as an incidental forecast-library deployment.
- Carry optional exact-cycle direct radiation, temperature and wind through issue snapshots where actually delivered. Missing historical fields remain missing. Test ASFS nowcast/cloud corrections as distinct latency-safe ablations before enrolling them as predictors.
- Fit PV response on simultaneous irradiance and MPPT-active observations; assess UAS recharge/heating phases only where actual state/energy telemetry isolates them. Do not invent measured component values or widen controls.
- Run blocked rolling-origin replay and a short unpublished live campaign. Missing solar truth may allow SOC diagnostics but cannot pass the solar gate.
Promotion acceptance¶
- At least 30 paired independent cycles per lead bucket across 10 UTC days, including clear/cloudy conditions and multiple important operating states.
- Combined 0–24 h SOC MAE improves by at least 10%; neither short bucket worsens by more than 2%; both have positive persistence skill.
- Each longer bucket has non-negative persistence skill or at least 25% lower MAE than the frozen baseline, with no worse absolute bias.
- Solar MAE and absolute load bias improve by at least 10% on consistent truth.
- CRPS beats baseline and persistence; P10–P90 coverage is 75–90%.
- Reserve Brier skill passes when sufficient independent episodes exist;
otherwise report
insufficient_events, not success. - Provenance, reproducibility, missing-source, stale-input, bounds, quantile, API compatibility and resource-isolation checks pass.
Daily rolling diagnostics remain separate from cumulative promotion evidence. Neither an empty score nor a full battery establishes forecast skill.
Deployment evidence: 12 September 2026¶
Code revision 83f0622fe524d53a3894e30c5854635424048ab6 is staged on
data-ocean at /opt/aurora-power-integrity-83f0622. The transferred source
archive SHA-256 is
bcdb586b9bd179ec1e24550694e0d822368dd86cba73652d84e1b254e5b96149.
The live checkout remains clean at db6bc869cef05254569f8e3599883062f2fddce0;
no public forecast paths or instrument controls were changed.
- Frozen products:
/data/aurora/dev-products/power-baselines/v10-20260912. The completed manifest verifies all 18 allowlisted products (43,505,758 bytes) with source-before = source-after = copied content. Two earlier publication-race failures remain labelled failed, not accepted evidence. The completed tree is read-only and also contains the original code archivecode-db6bc869.tar.gz(SHA-256244c34320ab1adf04f0788318c6b822b18f8a266a42ce67df81556d5f15ba25c). This does not claim that external effective service configuration has yet been captured for a live replacement. - Recovery:
/data/aurora/dev-products/power/candidates/integrity-repair-20260912/recovered.zarr.recovery-report-verified.jsonrecords 53 checksum-verified issues and 25 distinct source cycles. The incoming directory and current-pointer files were excluded. Original issue directories and the live archive were not modified. Recovery completed with a 220.2 MiB recorded memory peak. - The recovery verifier now uses the deployed publisher's exact marker contract: SHA-256(filename + NUL + content + NUL). The initial bare-byte checksum incompatibility was fixed and regression-tested, not bypassed.
- The bounded replay smoke run at 06:36 UTC exited explicitly
deferred,model_evaluation_not_idle, with zero issues processed. Its append-only evidence is incandidates/replay-20260912/replay_history.jsonl. No recurring replay timer was enabled and no campaign result is claimed.
Next release steps remain: replay when the wider evaluator is idle; complete the blocked-origin and unpublished live evidence; obtain missing MPPT/hardware evidence; capture effective configuration and pass promotion gates before switching any public development forecast. Production remains out of scope.
SOC correction and first successful replay: 13 September 2026¶
The original validator input was captured without bypassing its failure at
candidates/physical-debug-20260913/failing-interval.json on data-ocean. In
the 7 September 06--09 UTC interval, mean terminal charge input was
111.8898056923 W and discharge output was 104.2834681598 W. The calibrated
efficiencies were 0.884466 and 0.947819: stored-energy flow was therefore
111.8898056923 * 0.884466 - 104.2834681598 / 0.947819 = -11.06193633 W.
The observed modelled SOC increment, -0.13188438 percentage points over three
hours with 25.163 kWh capacity, was physically correct. The former guard
incorrectly used terminal charge minus discharge, ignoring conversion losses.
Commit bbefa4375826a5e014cb11246608b743e51a8170 makes both direction checking
and bias attenuation use the integrator's efficiency-adjusted stored-energy
basis. Invalid efficiencies and deliberately unphysical SOC changes remain
rejected. The full captured 34-endpoint frame passes the corrected validator.
The model contract records the changed consistency basis; no old evidence is
relabelled. 293 tests passed, including the captured-interval regressions.
The isolated real replay completed at 08:54:14 UTC: one immutable issue
succeeded across B physical solar, C load residual, and D hybrid, with zero
failures; 52 issues remain queued. Memory peak was 860.5 MiB and CPU time
199.229 seconds. The code archive deployed to /opt/aurora-power-integrity-bbefa43
has SHA-256 30531fb36d483f76bf4af37b6d441c5a9dca3f927bda0de39b38f6cd8d1ce56d.
aurora-power-integrity-campaign-replay.timer is enabled hourly at :45 UTC
(up to one minute jitter), after a successful smoke issue and unit validation.
Each job processes at most one issue, has a 1.5 GiB memory cap and 24-minute
timeout, and defers when the wider evaluator is active or unknown. Its only
writable product tree is candidates/replay-20260912; it runs as aurora.
Disable collection with systemctl disable --now aurora-power-integrity-campaign-replay.timer.
This is historical deterministic replay, not a live candidate or an ensemble
acceptance lane. The frozen recovery archive contains 53 issues/25 distinct
source cycles; further issue-safe collection and ensemble comparators are
still needed. Candidate promotion remains not_eligible_requires_campaign_evidence.
Separately, Earthkit 1.2.2 and its dependencies were installed in the evaluator's
isolated runtime; service-account import and pip check pass. Evaluator release
db0706b adds a real backend import check before expensive work. Thirty focused
deployment/backend/GFS tests pass. The full daily evaluator was restarted after
power replay; terminal completion is still pending, not inferred from imports.
An hourly thread follow-up (verify-power-forecast-recovery-and-campaign) checks
terminal evaluation results, replay progress and evidence gaps. It cannot
promote forecasts or enable instrument controls. Public forecast paths remain
unchanged.