> ## 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.

# Strategy Table

> Ranked stop-lap strategy options per driver, from the engine's latest solved lap.

## Overview

The Strategy Table lists every driver's candidate strategies from the engine's ranked output, best predicted finishing time first. Use it to compare a driver's realistic options (how many stops, which tyres, which laps) rather than just the one the engine currently favours.

> [!NOTE]
>
> Probability is a uniform 1-in-n split across a driver's valid strategies on the current engine, not a calibrated likelihood. The table says so above the data, every time.

***

## What It Shows

![The Strategy Table: ranked options per driver with the uniform-probability caveat (Madrid 2026)](https://mintcdn.com/smedley_group/zwm6wmhxgH8zyABx/images/watchparty/strategy-table.png?fit=max\&auto=format\&n=zwm6wmhxgH8zyABx\&q=85\&s=8ff9994d98efaf8a6210c992a83f1be1)

Drivers are ordered by their own rank-1 predicted finishing time, ascending; a driver whose rank-1 is itself unreachable sorts last rather than being thrown out. Each driver has its own block, headed by its driver number and (when known) its predicted time.

| Column | Meaning |
| - | - |
| Rank | 1 = the engine's best strategy for that driver |
| Tyres | Compound badges in stop order, decoded from the strategy's category letters |
| Stop 1-4 | Absolute lap number for each stop; blank when that stop slot is unused |
| Delta | Seconds behind that driver's own rank-1 predicted time; blank for rank 1 itself |
| Probability | The engine's uniform allocation, as a percentage |

Two states render explicitly rather than as a fabricated number:

* A row with `unreachable` state prints the literal word "unreachable" in both the Delta and Probability cells: that strategy cannot physically complete from the current race state.
* A rank-1 row that is itself unreachable is a contract violation, not a display concern; it renders a dedicated error cell, "rank 1 unreachable: contract violation", spanning both columns instead of any numeric cell.

***

## Data Behind It

The table reads `strategy_rankings` from the latest `strategy_snapshot` at or before the playhead lap (the as-of rule), grouped and sorted per driver. `model_id` is `strategy_snapshot`, `model_version` the composite `engine_version+WRAPPER_VERSION`, streamed over `vpw:v1:{session_key}:insight:strategy_snapshot` and hydrated via REST on session enter and rehydrate (`GET /v1/sessions/{session_key}/metrics?metric_id=strategy_snapshot`).

Two decodings happen before a row ever reaches this component, both owned by the shared derivation layer, never re-derived here:

* The absolute-lap `999` sentinel for an unused stop slot decodes to `null`, which this table renders as a blank cell.
* A `predicted_time` or `delta` at or above magnitude `1e300` (the engine's `DBL_MAX` sentinel for an unreachable strategy) decodes to the `unreachable` state described above.

***

## States

| State | Behaviour |
| - | - |
| No snapshot at or before the playhead | Shows the shared empty-state text: the exact-lap status gate and reasons where known, or a generic "No strategy data at lap N." |
| Stale snapshot | A banner reads "Data as of lap N (playhead lap M)" above the table |
| Unreachable row | Delta and probability cells read "unreachable" |
| Rank-1 unreachable | A dedicated error cell replaces the whole delta/probability pair |
| Race-only | Outside a race, the widget renders "Session is not a race"; the app never computes a strategy bundle for a non-race session |
| Live vs replay | Wire-identical; the table never branches on `source` |
| Mixed `model_version` | Falls back to the generic no-data state, alongside every other strategy widget |

***

## FAQ

> **Why does probability not add up to something meaningful across a driver's rows?**
>
> It is a uniform split (1 divided by the driver's number of valid strategies) on the interim engine, not a fitted or calibrated probability model.

> **Why are some stop columns blank?**
>
> A strategy with fewer stops than the table has columns for leaves the unused slots blank. That is the decoded form of the engine's own `999`-unused sentinel, not missing data.

***

## Next Steps

> **[Race Strategy Tool](/software/internal/watchparty/strategy/index)**
>
> The shared engine, derivation layer, and sentinel rule behind all six strategy widgets.

> **[Strategy Status](/software/internal/watchparty/strategy/status)**
>
> The gate, reasons, and whole-race health strip that explains a blank or stale table.

> **[Stop Sensitivity](/software/internal/watchparty/strategy/stop-sensitivity)**
>
> See how a driver's predicted time varies with stop lap, for the strategies this table ranks.

> **[Tyre Strategy](/software/internal/watchparty/widgets/tyre-strategy)**
>
> The actual (not predicted) stint and compound history for the race so far.


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