ADR-001 DuckDB as the primary database engine
ADR-001 DuckDB as the primary database engine
ADR-002 React + DuckDB-Wasm for zero-compute client-side analytics
ADR-002 React + DuckDB-Wasm for zero-compute client-side analytics
ADR-003 CDN Parquet storage over active cloud warehouses
ADR-003 CDN Parquet storage over active cloud warehouses
gs://off-the-pace-cdn) rather than running an active cloud database server.Rationale: Dramatically reduces costs, simplifies infrastructure maintenance, and enables the zero-compute DuckDB-Wasm architecture.Tradeoff: Real-time write/update capabilities are not natively supported handled by compiling static database files via offline/CI batch builds.ADR-004 Local ML pipeline with ONNX client-side runtime
ADR-004 Local ML pipeline with ONNX client-side runtime
.onnx files for direct browser-side evaluation.Rationale: Avoids server-side ML hosting costs, preserves data privacy, and enables instantaneous in-browser stint-life and tyre cliff classification.Tradeoff: Target model complexity is bounded by browser memory XGBoost fits this constraint comfortably.ADR-005 Python replay simulator for eventstream testing
ADR-005 Python replay simulator for eventstream testing
replay_simulator.py to stream historical data to EventHub/Eventstream endpoints.Rationale: Allows 24/7 integration testing and simulation of live race streams outside actual race weekends.Tradeoff: Simulated lap interval (e.g. 90 s) is a flat approximation of real-world timing flow.ADR-006 OLS regression for causal isolation
ADR-006 OLS regression for causal isolation
dim_events.csv.Rationale: Interpretable and sufficient for the 22-race sample size.Tradeoff: Assumes linear degradation across the stint.ADR-007 XGBoost with TimeSeriesSplit
ADR-007 XGBoost with TimeSeriesSplit
TimeSeriesSplit for model validation.Rationale: Guarantees temporal integrity training always precedes validation in seasonal data.Tradeoff: Fewer validation folds than random cross-validation.ADR-008 React + Tailwind CSS for the public dashboard
ADR-008 React + Tailwind CSS for the public dashboard
ADR-009 Accept 2018 Rd1/Rd2 telemetry gap
ADR-009 Accept 2018 Rd1/Rd2 telemetry gap
verify_bronze.py reports the two races as known gaps (ingestion/src/bronze_checks.py, KNOWN_TELEMETRY_GAPS).Rationale: Preserves the full dataset for trend analysis; lap-time degradation signals are available as a fallback; clean to document and test.Tradeoff: Feature inconsistency for 2018 Rd1/Rd2 (laps-only vs. full telemetry). The ML layer handles this via conditional feature selection fct_lap_degradation includes both lap_time_delta and speed_delta where available. Since CO-04 (2026-10-15) the missing gap is recorded as unknown (NULL), not clear air, so both races are excluded from the field base and lose their residuals and training labels. The owner chose to keep them out rather than guess their air state.ADR-010 CDN publish pipeline with version-stamped cache-busting
ADR-010 CDN publish pipeline with version-stamped cache-busting
scripts/publish_cdn.sh), and cache-bust every parquet URL with the manifest version hash (?v=<version>).Rationale: The app reads all data from the CDN even in local dev, so make app-data alone never reaches the running app a publish step is mandatory. CDN parquet paths are not content-hashed, so a schema/data change reuses the same URL; the GCS public edge cache (Cache-Control: public, max-age=3600) would then serve stale data to all clients for up to an hour. Stamping URLs with the manifest version gives each data revision a unique key that always misses the stale cache.Tradeoff: A redundant ?v= query param on every data request, and a manual publish step. Models are exempt their filenames already carry a _vN version.