> ## Documentation Index
> Fetch the complete documentation index at: https://playbook.smedleygroup.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Track Evolution

> How much grip the track surface is gaining over the race, as an expanding chart plus the stint comparisons behind it.

## Overview

Track Evolution estimates how much lap time the track surface itself is giving back as the race goes on (rubber going down, the surface cleaning up), separated out from tyre degradation and fuel load. Two widgets share this one insight: the **Track Evolution** panel plots the running estimate as a chart, and the **Evolution Comparisons** table lists every individual stint-pair comparison the estimate is built from. Reach for the panel to read the trend, and the table when you need to check a specific pair of stints behind it.

> [!NOTE]
>
> Both widgets run on race and practice sessions, and both read the same as-of snapshot: the table is the working behind the panel's curve.

***

## What It Shows

![The Track Evolution panel: expanding median and IQR band (Bahrain 2025)](https://mintcdn.com/smedley_group/Tjan_fF50tdTQI7z/images/watchparty/track-evolution-panel.png?fit=max\&auto=format\&n=Tjan_fF50tdTQI7z\&q=85\&s=46f8e262e3b59895ba4466b57f4a3d4b)

![The Evolution Comparisons table behind the panel's curve (Bahrain 2025)](https://mintcdn.com/smedley_group/Tjan_fF50tdTQI7z/images/watchparty/track-evolution-table.png?fit=max\&auto=format\&n=Tjan_fF50tdTQI7z\&q=85\&s=b95bd06c45dbf996c3810979d9299e3b)

### Track Evolution panel

A header line above the chart reads the comparison count and IQR range, for example "14 comparisons · IQR 0.012 to 0.031". The chart itself:

| Element | Meaning |
| - | - |
| X axis | Lap number, fixed to the race's total lap count (so the axis does not rescale as you scrub) |
| Y axis | Seconds per lap (s/lap), the evolution rate |
| Median s/lap line | The expanding robust median of every comparison seen so far, one point per lap where the comparison set grew |
| IQR band | Shaded area spanning the first to third quartile of the same comparisons, at 18% opacity |

The panel zooms like the other charts: right-drag across the plot to draw a box and zoom both axes to it (the drag carries on past the plot edge and zooms at the last point inside the plot on release), and right-click without moving to open a small menu with **Reset zoom**. There are no zoom sliders.

### Evolution Comparisons table

One row per same-compound stint-pair comparison, each pair of values rendered as "first → later" so both stints under comparison stay readable side by side.

| Column | Meaning |
| - | - |
| Driver | Team-coloured surname, or the bare car number when the driver is unknown |
| Compound | Tyre badge |
| Stints | The two stint numbers being compared |
| Laps | Each stint's reference lap number |
| Life | Effective tyre life at each reference lap |
| Fuel-corr (s) | Fuel-corrected lap time at each reference (3dp) |
| Slope (s/lap) | Each stint's own fuel-only degradation slope (4dp) |
| Deg-corr (s) | Fuel-corrected time projected back to tyre life 1 using that slope (3dp) |
| Δ (s) | The difference between the two deg-corrected references (3dp) |
| s/lap | That comparison's own evolution rate: Δ divided by the lap separation between the two references (4dp) |

Neither widget has clickable rows or hover detail beyond the table's own values; the table's precision is the drill-down surface for the chart.

***

## Data Behind It

Both widgets read one insight: `track_evolution`, `model_id: "track_evolution"`, `model_version: "2.3.0"`, triggered on every `new_lap`. It emits for **race and practice** sessions; in qualifying it produces nothing.

**Method**: each driver's eligible dry-compound stints (those with a fit over enough valid laps, excluding wet/intermediate/unknown compounds) are chained against the immediately preceding same-compound stint - stint 1 vs 2, then 2 vs 3, never 1 vs 3. Each side's reference is that stint's first flying lap to pass a strict validity standard (free of dirty air, traffic, overtakes, blocked-then-cleared laps, safety-car/VSC/red-flag interruption, and out/in-lap status). Each reference is then deg-projected back to effective tyre life 1 using its own stint's fuel-only fit slope, so a worn-tyre reference and a fresh-tyre reference land on a common basis before they are subtracted; because the fit's evolution term is pinned to zero, the degradation component cancels between the pair and the remaining delta is attributed to track evolution.

**Aggregation**: the panel's line and IQR band are an expanding robust median with Tukey-hinge quartiles over every comparison whose later reference lap is at or before that point on the axis, deterministic and traceable straight back to the comparison table's own rows.

**Wire and hydration**: delivered live on `vpw:v1:{session_key}:insight:track_evolution`, and REST-hydrated via `GET /v1/sessions/{session_key}/metrics?metric_id=track_evolution&limit=5000` on session enter, seek and reconnect - both paths route through the same reducer, so a REST-hydrated snapshot is wire-identical to a streamed one. Neither widget has a client-side fallback derivation of its own; "no snapshot yet" is an honest wait state, not a placeholder for missing maths.

***

## States

> **No snapshot yet**
>
> Both widgets show "No track evolution insight yet." until the first snapshot arrives - there is no equivalent client-side maths to fall back to.

> **Thin data / no comparisons yet**
>
> Once a snapshot exists but has no usable comparisons, series or estimate, both widgets show "No same-compound stint comparisons yet." A driver needs at least two qualifying same-compound stints, each with a valid reference lap, before their first comparison exists - so this is the expected state through most of a one-stop race's opening stint, and for any driver who never runs a same-compound pair.

> **Degraded: missing fuel parameters**
>
> If the circuit has no fuel parameters configured, the insight emits an explicit degraded status rather than guessing at corrections; both widgets show "No fuel parameters for this circuit."

> **Session gating: race and practice, never qualifying**
>
> Both widgets run on race and practice sessions. In qualifying they show a not-applicable notice, and the insight itself emits nothing there: a qualifying session has no same-compound stint pairs to compare.

> **Live vs replay**
>
> Wire-identical: both widgets read the same snapshot shape regardless of source and never branch on it.

***

## FAQ

> **Why is there no estimate yet, even well into the race?**
>
> Each driver needs two same-compound stints, each with a valid reference lap, before a single comparison can be built. A driver who has only run one compound so far, or whose reference laps keep landing on a disqualifying condition (traffic, an interruption, an out/in lap), contributes nothing until that changes.

> **Why do the panel and the table show different precision for the same numbers?**
>
> The table shows every individual comparison's own values, to their native precision (down to 4dp for the per-comparison s/lap). The panel's line and band are the aggregated median and quartiles across all comparisons at a given lap, not any single comparison's figure.

***

## Next Steps

> **[Stints](/software/internal/watchparty/widgets/stints)**
>
> The raw stint data track evolution's comparisons are built from.

> **[Tyre Strategy](/software/internal/watchparty/widgets/tyre-strategy)**
>
> The whole field's stint sequence on one lap axis.

> **[Tyre Deg Table](/software/internal/watchparty/widgets/tyre-deg-table)**
>
> Per-stint degradation fits, the same fits track evolution's references are drawn from.

> **[Insights and Versioning](/software/internal/watchparty/concepts/insights-and-versioning)**
>
> How model IDs, versions and degradation rules work across Watchparty.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.