The shared closure macro
Most of these tests share one shape: a total column must equal the sum of named components plus a residual, within a tolerance. Rather than writing that comparison fourteen times,assert_additive_identity takes the model, the total column, the component list, and the residual column, and returns whichever rows violate the sum:
assert_lap_7term_identity, the “Lap residual identity” test below that enforces the additive identity itself. The file name predates the move from seven terms to five. Three more of the fourteen tests below restate the same kind of sum-equals-total check by hand, at sector and qualifying grain, where the column lists differ enough that a direct SELECT reads more clearly than a macro call.
Residual decomposition identity
Residual decomposition identity
driver_skill_residual_s must equal pace_delta_s − total_explained_s, within 0.0001 s. This is the identity’s original two-term form total explained vs. residual that the lap identity test below further decomposes into four named physics components. track_unexplained_s is explicitly excluded from both sides: it’s the track-evolution model’s own internal residual, informational, not part of the closure. Guards int_lap_residual_decomposed. Active.Lap residual identity (five terms)
Lap residual identity (five terms)
The headline test. After
dirty_air_tax_s is extracted as its own term, the closure is:Rubber and ambient are not terms: they are already inside the field baseline that pace_delta_s is measured against.enforced via assert_additive_identity at 0.0001 s tolerance. Full derivation and the meaning of each term: the Additive Identity. The model this closes: families/residual. Guards int_lap_residual_decomposed. Active.Qualifying 7-term identity
Qualifying 7-term identity
The same identity, re-fit at qualifying grain rather than mirrored from the race-grain coefficients qualifying laps have their own fuel, compound, rubber, ambient, constructor, and dirty-air terms because a single push lap has a fundamentally different fuel and tyre-temperature profile than a race stint:Same 0.0001 s tolerance as the race-grain test proof that the qualifying-specific coefficients are mathematically sound, not just plausible. Guards
int_qualifying_decomposed. Active.Sector residual identity
Sector residual identity
Each of a lap’s three sectors closes its own copy of the identity
sector_pace_delta_s equals the sum of six sector-grain components plus sector_driver_skill_residual_s, at the same 0.0001 s tolerance the lap grain uses (the linear time-share allocation that produces sector components from lap components introduces no meaningful error). Guards int_sector_residual_decomposed. Active.Sector-to-lap re-aggregation
Sector-to-lap re-aggregation
Checks whether
SUM(sector_driver_skill_residual_s) over a lap’s three sectors equals that lap’s own driver_skill_residual_s from the lap-grain model. It doesn’t, today, by more than the 0.001 s tolerance and the gap is structural, not a bug: the sector-grain baseline (field_sector_pace_smoothed_s, a per-sector median) and the lap-grain baseline (base_track_pace_s, a trimmed-mean smoothed value) are fit independently, and the median of a sum isn’t the sum of medians. Closing this exactly would mean fitting a joint sector-grain baseline via panel regression instead of three independent sector medians a larger change than this test’s scope. Tagged placeholder; returns no rows by construction until that joint baseline exists. Placeholder.Corner closure
Corner closure
braking_loss_s + mid_corner_residual_s + exit_residual_s must equal corner_residual_total_s within 0.001 s, checked only where all three phase residuals are non-NULL. Unlike the sector split, this isn’t a proportional time-share allocation of a known total each phase residual is measured independently against a field median so the sum equaling the total is a real, checked property rather than true by construction. Guards int_corner_skill_residuals. Active.Ghost-car self-consistency
Ghost-car self-consistency
A degenerate-case identity rather than an additive one: when the ghost car’s ego driver and host constructor are the same (i.e. the counterfactual recombination is asking “what if this driver drove their own car”),
predicted_lap_time_s must equal the driver’s own actual_lap_time_s exactly, within 0.0001 s. If recombination is mathematically correct, the self-case has to be a no-op; any drift here means the recombination formula itself is wrong, not just imprecise for genuine swaps. Guards fct_ghost_car_pace. Active.Example identity closure
Example identity closure
The same macro call as the lap identity test above, byte-for-byte kept as a standalone, readable usage example of
assert_additive_identity rather than removed once the canonical test existed. It doesn’t add coverage beyond what the lap identity test already enforces; its job is documentation-by-example for anyone adding a new closure test, not an independent guarantee. Guards int_lap_residual_decomposed. Active.Deg-slope centering
Deg-slope centering
An internal-consistency check on the field-mean itself, not on any one constructor’s slope: the precision-weighted mean of
(deg_slope_raw_s_per_lap − field_mean_slope_s_per_lap) must be exactly 0 within every (race_year, compound) cell, at 1e-9 s/lap tolerance (low-sample cells excluded they don’t enter the field mean). If this drifts, “deviation from the field-average compound curve” stops meaning what every downstream consumer of the centred slope assumes it means. Guards int_constructor_deg_sensitivity. Active.Cliff-hinge centering
Cliff-hinge centering
The same centring property, applied to the post-cliff-onset hinge coefficient instead of the pre-cliff slope: the precision-weighted mean of
(cliff_hinge_coef_s_per_lap − cliff_hinge_field_mean_s_per_lap) must be 0 within every (race_year, compound) cell, same 1e-9 s/lap tolerance, low-sample cliff cells excluded. Guards int_constructor_deg_sensitivity. Active.Affinity shrinkage bounds
Affinity shrinkage bounds
Three tests below share one statistical property: Bayesian shrinkage toward a proper prior is convex, so the posterior (shrunk) mean is mathematically guaranteed to land between the raw observed value and the prior mean never outside either:This one checks it for per-circuit driver affinity, at floating-point epsilon (1e-9 s). A violation isn’t a borderline statistical judgment it means the shrinkage formula itself is wrong, or the prior and observed values were mismatched (e.g. computed over different row sets). Guards
int_driver_circuit_affinity. Active.Era-affinity shrinkage bounds
Era-affinity shrinkage bounds
The same convexity bound, checked within each era cell instead of pooled across eras. Guards
int_driver_circuit_era_affinity. Active.Era-rating shrinkage bounds
Era-rating shrinkage bounds
The same convexity bound again, applied to era-normalized driver ratings:
shrunk_residual_s must land between the driver’s raw residual mean and the season mean. Guards int_driver_season_ratings. Active.Affinity CI brackets mean
Affinity CI brackets mean
A 95% credible interval built symmetrically around a posterior mean (
mean ± 1.96·se) has to bracket that mean by construction ci_low ≤ mean ≤ ci_high. This test checks that property across both circuit-affinity models at once (era and non-era), wherever the standard error is estimable; degenerate single-observation cells carry NULL bounds by design and are excluded rather than flagged. A violation means the mean and the CI bounds were computed from mismatched intermediates a stale standard error, or low/high swapped. Guards int_driver_circuit_affinity and int_driver_circuit_era_affinity. Active.