Skip to main content
Part of the Strategy family.
Safety-Car / Virtual-Safety-Car base rate per circuit (venue slug) as a hazard per racing lap, POINT-IN-TIME AS OF THE START OF EACH SEASON. Grain is one row per (circuit_slug, season); the rate on a row is estimated from races at that circuit in seasons STRICTLY BEFORE it, so a 2019 row never sees 2019 or later. Estimated from SC/VSC deployment onsets in stg_track_status with racing-lap exposure from stg_laps. Raw and empirical-Bayes-shrunk rates are provided; the EB prior is itself season-lagged (pooled over all circuits, seasons < S), because shrinking toward an all-time pooled rate would leak the future through the prior. REBUILT 2026-09-11 (work item 02d). The previous version pooled every season into ONE row per circuit, so a 2018 consumer read a hazard partly estimated from 2024 races. Any consumer must now join on (circuit_slug, season), not circuit_slug alone — a circuit-only join silently fans out 5-7x and reinstates the leak. int_pit_strategy_cost_curve is the one dbt consumer and was updated with it. TRACK-STATUS COVERAGE, measured against data/dev.duckdb on 2026-09-11. The old header warned ingestion was “incomplete for some seasons”; that caveat was stale. Every race with laps has a track_status timeline: 2018 21/21, 2019 21/21, 2020 17/17, 2021 22/22, 2022 22/22, 2023 22/22, 2024 24/24 — 148/148, 100% in every season. Timelines are thin on incident-free races (19 races carry <= 3 messages, the minimum being a single AllClear), which is an absence of events rather than an absence of ingestion, and the hazard numerator counts onsets so it reads those correctly as zero. MISSINGNESS, deterministic and declarable. The raw rates are NULL where a circuit has no prior exposure — its debut season — because “unknowable” and “measured, no onsets” are different statements: 36 rows of 149, one per circuit. The shrunk rates survive a circuit debut (zero prior exposure shrinks fully to the pooled prior, the correct EB answer) and are NULL only where the pooled prior is itself unknowable: all 21 rows of season 2018, the earliest season in the warehouse. Both NULL sets are deterministic on (circuit_slug, season) and readable off the companion prior_seasons_n / prior_racing_laps columns, which are never NULL. ENTERED THE FEATURE LINEAGE 2026-09-20 (02d). Five columns are read by fct_cliff_prediction_features on the (circuit_key, race_year) join. That moves this model out of features.py’s report-only survey and into audit_aggregation_scope’s enforced scope, which is why the four exemptions below now exist: they were the advance notice the survey was written to give, and this is the ruling arriving. The columns are mart-only and are NOT in ml/src/schema.py’s FEATURE_COLUMNS pending 02d’s arms.

Lineage

Overview

19 tests guard this model - 17 generic, 2 singular.

Columns