cascade-heat11-var4-tsar-stationary-sd
Heat11 is Heat10 plus exactly one mathematical correction: the AR(1)
innovations in trend_seasonal_ar are scaled so that the configured sigma is
the stationary residual standard deviation. This is explicitly distinct from
the keyupdate.md / Heat9 empirical-Bayes integrated-SV correction. Heat10's
family and curriculum weights, Heat9 correction, Numba kernels, batching,
throughput optimizations, requirements, and all unrelated code are preserved.
Mathematical correction
For
x_t = phi*x_{t-1} + eps_t,
Var(x) = sigma_eps^2 / (1 - phi^2).
Set
sigma_eps = sigma_target*sqrt(1 - phi^2),
so Var(x) = sigma_target^2. The family samples phi ~ U(0, 0.85). Previously,
the maximum stationary-SD inflation was
1/sqrt(1 - .85^2) = 1.898; its average over the uniform distribution was
asin(.85)/.85 ~= 1.20. The correction preserves autocorrelation
rho(k) = phi^k; it only removes the unintended coupling between persistence
and residual scale.
The directly affected family mass is 10% at final weights and 12% at curriculum start. Expected throughput impact is negligible.
Evaluation rationale and limits
Heat8 all-snapshot absolute MASE remains high on daily (2.0646) and sales
(2.8579), and the 07-25 remaining issue is MASE (0.9971) more than MWSQL
(0.08485). Trend + seasonal + AR structure is semantically relevant to daily
and sales series, but these observations do not prove causal improvement.
The Berkeley AR notes give the stationary-variance result. ForecastPFN provides evidence that synthetic noise design and scale materially affect learnability. ForecastPFN uses a different model and noise-removal setup, so it supports the importance of noise calibration, not this exact correction.
Input arcsinh causal standardization may reduce the effect. A paired Heat10 / Heat11 A/B with identical training and evaluation conditions is required; no improvement is guaranteed.
Validate
From the repository root:
python3 - <<'PY'
import json
from pathlib import Path
root = Path("generators/07-26")
a = json.loads((root / "cascade-heat10/config.json").read_text())
b = json.loads((root / "cascade-heat11/config.json").read_text())
for key in ("name", "description"):
a.pop(key)
b.pop(key)
assert a == b
print("config metadata-only diff: OK")
PY
diff -u generators/07-26/cascade-heat10/generator.py \
generators/07-26/cascade-heat11/generator.py
cmp generators/07-26/cascade-heat10/requirements.txt \
generators/07-26/cascade-heat11/requirements.txt
python3 -m py_compile generators/07-26/cascade-heat11/generator.py
uv run ruff check generators/07-26/cascade-heat11
docker run --rm \
--entrypoint /root/cascade/.venv/bin/cascade \
-v "$PWD/chain.toml:/workspace/chain.toml:ro" \
-v "$PWD/generators/07-26/cascade-heat11:/workspace/candidate:ro" \
ghcr.io/tensorlink-ai/cascade-worker@sha256:f73c77276b80942c61e7c5570bbbafbd69c8fd15e79cffbbcf75c8855715c9a0 \
verify /workspace/candidate --chain-toml /workspace/chain.toml
The generator diff must contain only the innovation scaling block and its comment. Validation must not start training.