Seasonal-naive persistence benchmarks derived from the actual series.
The seasonal-naive forecast for a timestamp is the observation one season earlier, which makes it the cheapest non-trivial comparator a campaign can be measured against. The result is keyed and shaped to drop straight into the forecasts argument of score_forecasts_by_period, so a benchmark is scored by the same kernel as every real entry rather than by a parallel code path.
Each series is shifted by calendar offset rather than by row count, so gaps and daylight-saving transitions in the index cannot silently misalign a benchmark. Timestamps whose season-earlier counterpart falls outside actual are dropped, which means the benchmark needs max(seasons) of history before the first period it can score.
This is pure: no logging, no plotting, no mutation.