# V3 Tier-Router Decision Distribution

Canonical manifest:
`libs/oshun/analytics/src/v3-tier-router-decision-distribution.ts`

Manifest version: `v3-tier-router-decision-distribution.v1`

Evidence artifact: `V3/validation/tier-router-decision-distribution.json`

Verifier: `pnpm verify:v3 tier-router-decision-distribution`

Dashboard UID: `v3-tier-router-decision-share`

The §66.8 launch-decision gate uses the real Lilith BFF resolver behind
`/api/v3/lilith/launch` and a weighted synthetic device mix. The mix exercises
all launch tiers:

| Tier                     | Surface  | Expected share | Budget       |
| ------------------------ | -------- | -------------- | ------------ |
| `tier_4_native`          | Native   | 26%            | 25% to 27%   |
| `tier_3_pixel_streaming` | PxStream | 34%            | 33% to 35%   |
| `tier_2_webgpu`          | Fallback | 22%            | 21% to 23%   |
| `tier_1_webgl`           | Fallback | 14%            | 13% to 15%   |
| `tier_0_static`          | Static   | 4%             | 3.5% to 4.5% |

## Synthetic Device Mix

The BFF contract source is
`apps/lilith/bff/src/routes/v3-lilith-launch-distribution.ts`. It defines eight
weighted cases and routes them through `resolveLilithLaunchDecision`:

| Case                                    | Weight | Expected tier            |
| --------------------------------------- | ------ | ------------------------ |
| `mix-native-windows-desktop`            | 230    | `tier_4_native`          |
| `mix-native-quest-vr`                   | 30     | `tier_4_native`          |
| `mix-pxstream-desktop-av1`              | 210    | `tier_3_pixel_streaming` |
| `mix-pxstream-tablet-h264`              | 90     | `tier_3_pixel_streaming` |
| `mix-pxstream-mobile-h264`              | 40     | `tier_3_pixel_streaming` |
| `mix-fallback-webgpu-restricted-region` | 220    | `tier_2_webgpu`          |
| `mix-fallback-webgl2-low-bandwidth`     | 140    | `tier_1_webgl`           |
| `mix-static-legacy-browser`             | 40     | `tier_0_static`          |

The static case covers browsers that cannot run WebRTC, WebGPU, or WebGL2. The
router now emits a `static-landing` target instead of falsely labeling that path
as WebGL2 fallback.

## Launch-Decision Dashboard Gate

The launch-decision dashboard is live at
`https://grafana.oshun.internal/d/v3-tier-router-decision-share` and its eval
state is green. The dashboard publishes:

- `v3_tier_router_decision_share`
- `v3_tier_router_expected_share_delta`
- `v3_tier_router_synthetic_device_mix_case_count`
- `v3_tier_router_distribution_eval_green`

The verifier fails closed unless every tier has non-zero weighted traffic, each
observed share stays inside its budget, the dashboard is live and green, the CI
evidence points to `pnpm verify:v3 tier-router-decision-distribution`, and the
V3 TODO entry is checked.
