F1 DataStop Docs

Operations

Runbooks & operations

Cron quick reference

CronJobGate
*/6 * * * *reconcilereconcile_needed.py decides; ingest.py + data_export.py
*/30 12-21 * * 5,6,0reconcile (race ticks)same, 30-min cadence on race weekends
0 */2 * * 5,6,0chartscharts_todo.py; skip if todo empty; teammate pairs RUS,ANT / NOR,PIA / LEC,HAM
0 6,12,18 * * 5,6,0assetslatest completed round + next; all 8 session codes
17 7 * * *digestfree_tier_digest.py → Slack
*/5 * * * *queueprocess_chart_requests.py + process_telemetry_requests.py

On-demand runs

gh workflow run pr-ci.yml --ref main          # Actions tab → PR CI → Run workflow
python charts_todo.py --season "$(date -u +%Y)"   # inspect pending chart work
python index_export.py --season "$(date -u +%Y)"  # refresh CDN indexes after manual exports

Custom chart requests

Flow: user picks drivers in Deep Dive → row in f1_chart_requests → minute-cron runs generate.py --only <chart> --drivers <codes> → PNG in analysis_charts → app polls it in. Deduped by stable driver_key (upper · sorted · --joined). Customizable charts: driver_compare, season_scorecard, dominance_flat, track_dominance, parallax_stack, speed_trace, driver_radar (registry: web/src/services/chartRequestService.ts → CUSTOMIZABLE_CHARTS).

Secrets inventory

Never commit service-role keys. Browser code takes only the publishable/anon key (RLS-protected). Service-role lives in Actions secrets and local shells only.

Failure triage