Known Issues & Limitations
Version 1 · Initial known-issues list from CLAUDE.md/PLAN.md dev-only warnings and data gaps
Historical versionRunner Form — Known Issues & Limitations
Open: hard-coded login credentials
Status: Open — dev-only, must fix before production.
Symptoms: Login accepts a single hard-coded username/password checked directly in
views.py, not Django's user system.
Cause: Custom session auth was written for local development speed; @custom_login_required
only checks request.session['is_authenticated'].
Workaround: Acceptable for local/dev use only.
Resolution: Replace with proper Django user accounts or OAuth before any production or
shared deployment.
Open: DB credentials stored in plain text
Status: Open.
Symptoms: MySQL connection details live directly in config/settings.py.
Cause: No .env/environment-variable layer was set up.
Workaround: None — treat the repository as sensitive.
Resolution: Move DB credentials to environment variables before production.
Open: single-process cache
Status: Open — functional, but won't scale.
Symptoms: Django's default in-memory cache is per-process; cached form/search/date data is
not shared across multiple IIS/wFastCGI workers.
Cause: No shared cache backend configured.
Workaround: Fine for a single-worker deployment.
Resolution: Switch CACHES['default'] to Redis for multi-worker deployment.
Limitation: trial data fields always null
Status: Data limitation, not a code bug.
Symptoms: trial_race.class_level, sot, and time_winner_sec render as — on every
row.
Cause: These columns are NULL for all rows in the current DB.
Resolution: Will resolve automatically once the source data is populated; no template/query
change needed.
Limitation: pre-2021 sectional data
Status: Data limitation, not a code bug.
Symptoms: run.vp_1200/800/600/400/200 sectional-position columns are NULL for races
before 2021.
Workaround: Code falls back to run.pos_1200, run.pos_800, run.pos_turn,
run.pos_settling for those older races.
Limitation: gear_change parsing is string-based
Status: Fragile by design, not currently broken.
Symptoms: gear_change parsing in queries.py relies on human-readable strings
(blinkers, winkers, tongue tie, etc.) mapped via GEAR_MAPPING.
Risk: If the live schema starts storing coded values instead of these strings,
GEAR_MAPPING needs updating. Verify with:
SELECT DISTINCT gear_change FROM run WHERE gear_change IS NOT NULL ORDER BY gear_change;
Not built: upcoming races
Status: Planned, not implemented.
Symptoms: The view currently returns [] for upcoming races even though the DB has
upcoming race data.