# generator_v17 — boundary-aligned forecast-task ablation This candidate forks `generator_v12` and preserves its deterministic single-stream prefetch path, fixed 4096-point rows, and established stochastic families. Its decisive change is a new `forecast_tasks` family occupying 45% of the final corpus and 60% of the clean early curriculum. ## Forecast-task compiler Each forecast-task row is a continuous composition of: - deterministic quota-sampled periods from 7, 15, 24, 48, 60, 96, 144, 240, and 288; - slowly varying seasonal amplitude and phase templates; - smooth global trends and predictable local slope corrections; - persistent AR residuals with slowly varying, context-visible volatility; - sparse precursor → 64-step event → recovery episodes whose boundaries are exact multiples of 32. The 32-point alignment matches Toto2's patch size, while the 64-step episodes match Cascade's two-patch evaluation horizon. Event sign, approximate magnitude, and volatility are visible during the preceding context; this teaches conditional forecasts rather than independent surprise corruption. Period quotas use a 70% revealed-pool-frequency and 30% uniform blend. Counts are allocated exactly inside each generated family block and then shuffled by the generator's seeded RNG. ## Curriculum and corruption The forecast-task family starts at 60% with `forecast_task_hardness = 0.15`, then blends to a 45% share at full difficulty. Existing families retain the remaining 55% as a regression guardrail. Compared with v12, final independent corruption is materially reduced: - shock-row rate: 0.40 → 0.08; - irregular-hold row rate: 0.25 → 0.08; - irregular hold probability: 0.01–0.10 → 0.005–0.04; - censor rate: 0.08 → 0.04; - regular-hold rate: 0.08 → 0.04; - TSMixup: 0.03 → 0.01. Positive and count observation links remain, at slightly lower rates, because they model domains rather than independent corruption. ## Determinism and throughput `generation_workers` remains 1. The new family consumes only the existing `numpy.random.Generator` stream, uses vectorized NumPy operations plus the existing SciPy AR filter, and introduces no new dependencies or unseeded state. ## Verification ```bash cd /root/cascade cascade verify /root/generator_v17 ``` For a direct generation benchmark, instantiate both generators with the same seed, drain the same row count, and compare points per second. This benchmark tests generation only; it does not launch a heat evaluation.