Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,43 @@
- Classify imported laps as Mine or Others, filter sessions and owned statistics by ownership, preserve cross-tab selections, and label Compare/Analyse laps with ownership
- Persisted cross-game race results with qualifying, podium, fastest-lap, pit, strategy, and position-timeline summaries, plus idempotent historical backfill
- Configure driver-profile AI output tokens with provider-advertised limits
- Classify flying, out, in, pit, and grid-start phases independently from caution, slow-zone, and formation conditions so overlapping lap states stay visible and out of pace analysis
- Use simulator-independent semantic telemetry for live dashboards while keeping native packet inspection in the development panel and recording bytes unchanged
- Show telemetry quality, evidence limits, and analysis suitability per lap, with safe rebuild actions when source recordings remain available

- Detect imported file contents before accepting ZIP/BIN session data and reject unrelated archives
### Fixes
- Detect F1 race-start laps even when the first telemetry sample is stationary, keeping standing-start Lap 1 out of normal pace comparisons
- Refresh lap quality, eligibility, metrics, and AI analysis when telemetry sources, pit classification, reprocessing, or policy versions change so stale results are never shown as current
- Mark analysis unsuitable when an imported recording omits required controls or a continuous tire channel contains only isolated samples instead of treating filled zeroes as real telemetry
- Refresh quality badges and analysis controls after quality changes, keep unsuitable AI panels closed, and let users re-include excluded laps to rebuild a usable analysis pool
- Record reconnect and timeout quality warnings only for accepted telemetry from the same game and session, preventing stale UDP traffic from degrading another recording
- Validate RaceIQ's canonical recording and every archive manifest/member separately from imported-source provenance so a valid source cannot hide corrupt local evidence
- Reject RaceIQ archives that omit session captures declared by their v2 manifest
- Preserve native-live provenance when migrating legacy sessions while retaining explicit imported-source labels
- Link persisted race events to telemetry-quality facts using compatible clock domains or exact lap identity
- Measure telemetry coverage and cadence from each native source packet family so cached values cannot hide missed channel updates
- Count isolated missing telemetry samples inside requested track ranges so strict analyses reject unreliable evidence without excluding unaffected ranges
- Carry imported channel fidelity into eligibility reasons and confidence so strict analyses reject held, resampled, reconstructed, or assumed evidence
- Measure lap coverage from native progress or track length without penalizing later laps whose distance counter is cumulative
- Keep valid timed laps in lap-time experiment metrics when unrelated steering or input trace channels are unavailable
- Reprocess recorded telemetry when quality measurement settings change instead of relabeling old measurements as current
- Block raw-recording cleanup when even one session lap lacks rebuilt eligibility, preserving evidence needed for later reprocessing
- Reject stale eligibility snapshots in policy consumers, AI cache reads, and raw-recording cleanup decisions
- Show an explicit Track Detail empty state when recorded laps do not qualify for pace statistics
- Clear displayed comparison analysis and conversations when either lap's quality generation changes
- Show complete evidence source, generation, and rebuild state in Track Detail quality badges
- Refresh Track Detail, session recap, and experiment views after lap quality rebuilds or reprocessing
- Replace provisional live lap evidence with finalized quality in current and newly connected clients
- Regenerate cached driver profiles when underlying lap quality or eligibility changes
- Keep lap quality, session quality, and analysis caches on one generation if quality persistence fails
- Keep every recorded experiment lap available for inspection in Tune Review while limiting aggregate setup evaluation to its curated evidence pool
- Preserve telemetry warning reasons in setup-analysis decisions and Setup Engineer lap summaries
- Collect recent fuel and tire history independently so several fuel-only laps cannot prevent older tire data from seeding strategy estimates, and vice versa
- Raise Windows timer resolution during ACC and AC Evo capture so shared-memory polling no longer collapses to the default ~64 Hz tick
- Keep live and replay telemetry gap measurements aligned across native packet IDs and timestamp-only sources
- Clear stale degraded lap-quality states after a clean recording rebuild
- Keep packet ordering faults confined to affected laps and telemetry ranges instead of limiting unrelated analysis
- Make stale-session reprocessing recoverable with retry and dismissal actions, accessible progress states, and clear failure feedback
- Open RaceIQ faster by skipping unnecessary historical race-result work during startup
- Show actionable, neutral guidance when AI provider, credentials, or model configuration is incomplete
Expand Down
105 changes: 104 additions & 1 deletion client/messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,7 @@
"f1setup_view_source": "Quelle ansehen",
"track_detail_no_laps_recorded": "Noch keine Runden aufgezeichnet",
"track_detail_no_laps_match_filters": "Keine Runden entsprechen den gewählten Filtern",
"track_detail_no_eligible_laps": "Keine Runden sind für Pace-Statistiken geeignet",
"overlay_follow": "Folgen",
"overlay_fixed": "Fest",
"overlay_overlay": "Overlay",
Expand Down Expand Up @@ -1491,5 +1492,107 @@
"trackdetailroute_not_found": "Strecke nicht gefunden",
"trackinfo_guide": "Experten-Leitfaden",
"trackinfo_priority": "Priorität",
"trackinfo_trap": "Falle:"
"trackinfo_trap": "Falle:",
"quality_badge_good": "Telemetrie gut",
"quality_badge_degraded": "Telemetrie eingeschränkt",
"quality_badge_unsuitable": "Telemetrie ungeeignet",
"quality_badge_unknown": "Telemetrie unbekannt",
"quality_title": "Telemetriequalität",
"quality_summary_good": "Aufzeichnung und benötigte Kanäle unterstützen diese Analyse.",
"quality_summary_degraded": "Analyse bleibt verfügbar, aber Telemetrie hat angezeigte Einschränkungen.",
"quality_summary_unsuitable": "Benötigte Daten sind für diese Analyse nicht zuverlässig genug.",
"quality_summary_unknown": "Eignung der Telemetrie konnte nicht bestimmt werden.",
"quality_recording": "Aufzeichnung",
"quality_source": "Quelle",
"quality_generation": "Qualitätsgeneration",
"quality_policies": "Analyseeignung",
"quality_reasons": "Einschränkungen",
"quality_no_limits": "Keine bekannten Einschränkungen",
"quality_rebuild": "Qualität neu erstellen",
"quality_rebuilding": "Wird neu erstellt…",
"quality_rebuilt": "Qualität neu erstellt",
"quality_rebuild_failed": "Qualität konnte nicht neu erstellt werden",
"quality_rebuild_unavailable": "Quellaufzeichnung nicht verfügbar; Qualität kann nicht neu erstellt werden.",
"quality_status_load_failed": "Sitzungsqualitätsstatus konnte nicht geladen werden.",
"quality_lifecycle_exact": "Gut",
"quality_lifecycle_minor_gaps": "Kleine Lücken",
"quality_lifecycle_degraded": "Eingeschränkt",
"quality_lifecycle_incomplete": "Unvollständig",
"quality_lifecycle_unknown": "Unbekannt",
"quality_lifecycle_unavailable": "Nicht verfügbar",
"quality_status_eligible": "Geeignet",
"quality_status_eligible_with_warning": "Mit Einschränkungen geeignet",
"quality_status_ineligible": "Ungeeignet",
"quality_status_unknown": "Unbekannt",
"quality_policy_official_timing": "Offizielle Zeitnahme",
"quality_policy_normal_pace": "Normales Renntempo",
"quality_policy_lap_comparison": "Rundenvergleich",
"quality_policy_corner_trace": "Kurvenverlauf",
"quality_policy_transient_event": "Kurzzeitereignisse",
"quality_policy_fuel_burn": "Kraftstoffverbrauch",
"quality_policy_tire_analysis": "Reifenanalyse",
"quality_policy_stint_falloff": "Stint-Abbau",
"quality_policy_setup_analysis": "Setup-Analyse",
"quality_policy_driver_profile": "Fahrerprofil",
"quality_policy_ml_training": "Modelltraining",
"quality_reason_quality_not_rebuilt": "Qualität wurde nicht aus Quelldaten neu erstellt.",
"quality_reason_recording_unavailable": "Quellaufzeichnung ist nicht verfügbar.",
"quality_reason_recording_incompatible": "Quellaufzeichnung ist mit dieser RaceIQ-Version nicht kompatibel.",
"quality_reason_recording_corrupt": "Integritätsprüfung der Quellaufzeichnung ist fehlgeschlagen.",
"quality_reason_recording_incomplete": "Aufzeichnung endete vor vollständiger Erfassung.",
"quality_reason_telemetry_gap_minor": "Telemetrie enthält eine kurze Lücke.",
"quality_reason_telemetry_gap_major": "Telemetrie enthält eine große Lücke.",
"quality_reason_duplicate_observations": "Telemetrie enthält doppelte Messungen.",
"quality_reason_out_of_order_observations": "Telemetriemessungen kamen in falscher Reihenfolge an.",
"quality_reason_timeline_discontinuity": "Telemetrie-Zeitachse ist unterbrochen.",
"quality_reason_source_reconnect": "Telemetriequelle wurde während der Aufzeichnung neu verbunden.",
"quality_reason_writer_drop": "Recorder konnte Teile der Telemetrie nicht speichern.",
"quality_reason_lap_time_fallback": "Rundenzeit nutzt Telemetrie statt Simulatorhistorie.",
"quality_reason_lap_time_unconfirmed": "Offizielle Rundenzeit konnte nicht bestätigt werden.",
"quality_reason_partial_track_coverage": "Telemetrie deckt nicht die ganze Runde ab.",
"quality_reason_position_unavailable": "Streckenposition ist nicht verfügbar.",
"quality_reason_channel_unavailable": "Benötigter Telemetriekanal ist nicht verfügbar.",
"quality_reason_channel_missing": "Benötigter Telemetriekanal fehlt.",
"quality_reason_channel_stale": "Benötigter Telemetriekanal ist veraltet.",
"quality_reason_channel_invalid": "Benötigter Telemetriekanal ist ungültig.",
"quality_reason_channel_simplified": "Telemetriekanal nutzt eine vereinfachte Quelle.",
"quality_reason_channel_derived": "Telemetriekanal wurde berechnet statt gemessen.",
"quality_reason_pit_only_updates": "Telemetriekanal aktualisiert sich nur in der Box.",
"quality_reason_interpolated_channel": "Telemetriekanal enthält interpolierte Werte.",
"quality_reason_fallback_channel": "Telemetriekanal nutzt Ersatzwerte.",
"quality_reason_incident_lap": "Runde enthält einen Zwischenfall.",
"quality_reason_caution_context": "Runde wurde unter Gelb aufgezeichnet.",
"quality_reason_traffic_context": "Verkehr beeinflusste diese Runde.",
"quality_reason_partial_lap": "Nur ein Teil der Runde wurde aufgezeichnet.",
"quality_reason_non_pace_classification": "Runde ist nicht als normale schnelle Runde klassifiziert.",
"quality_reason_structurally_invalid": "Runde ist strukturell ungültig.",
"quality_reason_imported_source": "Telemetrie stammt aus einer importierten Quelle.",
"quality_reason_remote_packet_loss": "Telemetriepakete gingen bei Übertragung verloren.",
"quality_reason_opponent_channel_unavailable": "Gegnertelemetrie enthält benötigte Kanäle nicht.",
"quality_reason_pace_segment_missing": "Kein stabiles Renntempo-Segment wurde angegeben.",
"quality_reason_insufficient_sample_pool": "Nicht genug vergleichbare Runden verfügbar.",
"quality_reason_driver_inconsistent": "Fahrerkonstanz ist für ein sicheres Ergebnis zu niedrig.",
"quality_reason_provenance_missing": "Datenherkunft ist unvollständig.",
"quality_reason_identity_unstable": "Teilnehmeridentität änderte sich während der Aufzeichnung.",
"quality_reason_raw_redecode_required": "Rohtelemetrie muss für erneute Analyse erhalten bleiben.",
"quality_diagnostics": "Technische Diagnose",
"quality_channels": "Kanäle",
"quality_event_ids": "Ereignis-IDs",
"quality_range_lap": "Rundenbereich",
"quality_range_time": "Zeitbereich",
"quality_not_available": "Nicht verfügbar",
"quality_schema_version": "Schemaversion",
"quality_policy_version": "Richtlinienversion",
"quality_configuration_version": "Konfigurationsversion",
"quality_catalog_version": "Katalogversion",
"quality_parser_version": "Parser-Version",
"quality_resolver_version": "Resolver-Version",
"quality_derivation_version": "Ableitungsversion",
"quality_frames_observed": "Beobachtete Frames",
"quality_frames_expected": "Erwartete Frames",
"quality_frames_missing": "Fehlende Frames",
"quality_largest_gap": "Größte Lücke",
"quality_source_generation": "Quellgeneration",
"quality_freshness": "Frisch / veraltet / unbekannt",
"quality_limitations": "Einschränkungen"
}
105 changes: 104 additions & 1 deletion client/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,7 @@
"f1setup_view_source": "View Source",
"track_detail_no_laps_recorded": "No laps recorded yet",
"track_detail_no_laps_match_filters": "No laps match the selected filters",
"track_detail_no_eligible_laps": "No laps are eligible for pace statistics",
"overlay_follow": "Follow",
"overlay_fixed": "Fixed",
"overlay_overlay": "Overlay",
Expand Down Expand Up @@ -1491,5 +1492,107 @@
"trackdetailroute_not_found": "Track not found",
"trackinfo_guide": "Expert guide",
"trackinfo_priority": "priority",
"trackinfo_trap": "Trap:"
"trackinfo_trap": "Trap:",
"quality_badge_good": "Telemetry good",
"quality_badge_degraded": "Telemetry limited",
"quality_badge_unsuitable": "Telemetry unsuitable",
"quality_badge_unknown": "Telemetry unknown",
"quality_title": "Telemetry quality",
"quality_summary_good": "Recording and required channels support this analysis.",
"quality_summary_degraded": "Analysis remains available, but telemetry has disclosed limits.",
"quality_summary_unsuitable": "Required evidence is not reliable enough for this analysis.",
"quality_summary_unknown": "Telemetry suitability could not be established.",
"quality_recording": "Recording",
"quality_source": "Source",
"quality_generation": "Quality generation",
"quality_policies": "Analysis suitability",
"quality_reasons": "Limits",
"quality_no_limits": "No known limits",
"quality_rebuild": "Rebuild quality",
"quality_rebuilding": "Rebuilding…",
"quality_rebuilt": "Quality rebuilt",
"quality_rebuild_failed": "Quality rebuild failed",
"quality_rebuild_unavailable": "Source recording unavailable; quality cannot be rebuilt.",
"quality_status_load_failed": "Could not load session quality status.",
"quality_lifecycle_exact": "Good",
"quality_lifecycle_minor_gaps": "Minor gaps",
"quality_lifecycle_degraded": "Limited",
"quality_lifecycle_incomplete": "Incomplete",
"quality_lifecycle_unknown": "Unknown",
"quality_lifecycle_unavailable": "Unavailable",
"quality_status_eligible": "Suitable",
"quality_status_eligible_with_warning": "Suitable with limits",
"quality_status_ineligible": "Not suitable",
"quality_status_unknown": "Unknown",
"quality_policy_official_timing": "Official timing",
"quality_policy_normal_pace": "Normal pace",
"quality_policy_lap_comparison": "Lap comparison",
"quality_policy_corner_trace": "Corner trace",
"quality_policy_transient_event": "Transient events",
"quality_policy_fuel_burn": "Fuel use",
"quality_policy_tire_analysis": "Tire analysis",
"quality_policy_stint_falloff": "Stint falloff",
"quality_policy_setup_analysis": "Setup analysis",
"quality_policy_driver_profile": "Driver profile",
"quality_policy_ml_training": "Model training",
"quality_reason_quality_not_rebuilt": "Quality has not been rebuilt from source evidence.",
"quality_reason_recording_unavailable": "Source recording is unavailable.",
"quality_reason_recording_incompatible": "Source recording is incompatible with this RaceIQ version.",
"quality_reason_recording_corrupt": "Source recording failed integrity checks.",
"quality_reason_recording_incomplete": "Recording ended before a complete capture was available.",
"quality_reason_telemetry_gap_minor": "Telemetry contains a short gap.",
"quality_reason_telemetry_gap_major": "Telemetry contains a significant gap.",
"quality_reason_duplicate_observations": "Telemetry contains duplicate observations.",
"quality_reason_out_of_order_observations": "Telemetry observations arrived out of order.",
"quality_reason_timeline_discontinuity": "Telemetry timeline is discontinuous.",
"quality_reason_source_reconnect": "Telemetry source reconnected during recording.",
"quality_reason_writer_drop": "Recorder could not persist some telemetry.",
"quality_reason_lap_time_fallback": "Lap time uses telemetry elapsed time instead of simulator history.",
"quality_reason_lap_time_unconfirmed": "Official lap time could not be confirmed.",
"quality_reason_partial_track_coverage": "Telemetry does not cover the whole lap.",
"quality_reason_position_unavailable": "Track position is unavailable.",
"quality_reason_channel_unavailable": "Required telemetry channel is unavailable.",
"quality_reason_channel_missing": "Required telemetry channel is missing.",
"quality_reason_channel_stale": "Required telemetry channel is stale.",
"quality_reason_channel_invalid": "Required telemetry channel is invalid.",
"quality_reason_channel_simplified": "Telemetry channel uses a simplified source.",
"quality_reason_channel_derived": "Telemetry channel is derived rather than measured.",
"quality_reason_pit_only_updates": "Telemetry channel updates only in the pits.",
"quality_reason_interpolated_channel": "Telemetry channel contains interpolated values.",
"quality_reason_fallback_channel": "Telemetry channel uses fallback values.",
"quality_reason_incident_lap": "Lap includes an incident.",
"quality_reason_caution_context": "Lap was recorded under caution.",
"quality_reason_traffic_context": "Traffic affected this lap.",
"quality_reason_partial_lap": "Only part of the lap was recorded.",
"quality_reason_non_pace_classification": "Lap is classified as non-pace.",
"quality_reason_structurally_invalid": "Lap is structurally invalid.",
"quality_reason_imported_source": "Telemetry came from an imported source.",
"quality_reason_remote_packet_loss": "Remote telemetry packets were lost.",
"quality_reason_opponent_channel_unavailable": "Opponent telemetry lacks required channels.",
"quality_reason_pace_segment_missing": "No stable pace segment was supplied.",
"quality_reason_insufficient_sample_pool": "Not enough comparable laps are available.",
"quality_reason_driver_inconsistent": "Driver consistency is too low for a confident result.",
"quality_reason_provenance_missing": "Evidence provenance is incomplete.",
"quality_reason_identity_unstable": "Participant identity changed during recording.",
"quality_reason_raw_redecode_required": "Raw telemetry must be retained to rebuild this analysis.",
"quality_diagnostics": "Technical diagnostics",
"quality_channels": "Channels",
"quality_event_ids": "Event IDs",
"quality_range_lap": "Lap range",
"quality_range_time": "Time range",
"quality_not_available": "Unavailable",
"quality_schema_version": "Schema version",
"quality_policy_version": "Policy version",
"quality_configuration_version": "Configuration version",
"quality_catalog_version": "Catalog version",
"quality_parser_version": "Parser version",
"quality_resolver_version": "Resolver version",
"quality_derivation_version": "Derivation version",
"quality_frames_observed": "Frames observed",
"quality_frames_expected": "Frames expected",
"quality_frames_missing": "Frames missing",
"quality_largest_gap": "Largest gap",
"quality_source_generation": "Source generation",
"quality_freshness": "Fresh / stale / unknown",
"quality_limitations": "Limitations"
}
Loading