Compare forecast methods against matched naive events
The current forecast gate can admit a method with no comparable baseline events: 30 naive forecasts for entity A with error 100 plus 30 trend forecasts for entity B with error 1 are enough. A perfect 0-vs-0 tie is also treated as beating the baseline. Separately, a real timestamp of Unix epoch zero is treated as an empty database.
Pair each method with naive forecasts by signal, horizon, origin time, target time, entity, and observed actual. Duplicate method/event rows are ambiguous and excluded, so they cannot manufacture the minimum 30 matched samples. Admission requires strict improvement and error at most 90% of the paired naive error; expose that paired error as mae_naive_paired. Non-hour horizons use distinct second-based labels. Timestamp checks now distinguish None from zero.
Run python -B -m unittest test_decision_contract -v: all 4 portable, in-memory SQLite tests fail on the base revision and pass with this patch. Tests include the unrelated-entity counterexample, a matched positive control, duplicate exclusion, perfect ties, and epoch-zero readings. No host discovery, command execution, installation or external data is invoked. Original agent.py CRLF endings are preserved.
Limit: the gate trusts supplied observations and compares admitted methods using each method's paired-sample error. This repair does not establish authenticity, causal validity, identical cross-method cohorts, or future forecast quality.
Base revision: 74456ba7db9172f5822433308943647ecd67cdf0.