# HyperTwist Phase 4 template launch selection split analytics packet

Created on `2026-05-07`

Status:

- first-party HyperTwist packet
- bounded Phase `4` dashboard template analytics follow-through slice

## Purpose

This packet splits repo-backed template launch outcomes by dashboard selector reason class so operators can compare plain priority picks against analytics tie-break picks.

The open tasks were:

- stop treating persisted selector reason class as audit-only metadata
- derive per-template outcome aggregates separately for dashboard primary-priority launches and analytics tie-break launches
- surface that stored split back into the dashboard template launch detail, history, and recap lanes

It is not:

- a new dashboard selector rewrite packet
- a non-dashboard analytics packet
- a new repository history schema packet beyond template-scoped aggregates
- a broader coach weighting redesign packet

## Scope

Bounded lane:

- add a small selection-scoped aggregate struct alongside template launch scoped stats
- derive dashboard `PrimaryDashboardPriority` and `AnalyticsTieBreak` aggregates from persisted run provenance
- stamp primary dashboard launches with explicit selector provenance so both selector lanes are counted
- append selector split analytics to the existing per-template analytics detail fragment already used by dashboard launch, history, and recap surfaces

Out of scope:

- changing the primary launch priority rules
- changing analytics tie-break formulas
- adding a new dedicated selector analytics screen
- aggregating selector lanes for non-dashboard launch sources

## Why this was the right next packet

The previous packet persisted why the dashboard picked a template.

That closed the audit gap for individual runs, but it still left a product-level question unanswered:

- did analytics tie-break picks actually outperform plain dashboard priority picks for the same template lane
- or were they only explainable, not measurable

So the next honest move was:

- treat selector reason class as an analytics dimension, not only a history detail
- derive that split directly from repo-backed run records
- and surface the comparison where operators already inspect template launch outcomes

## What landed

Primary code changes:

- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h`
  - added `FHyperTwistTrainingTemplateLaunchSelectionScopedStats`
  - added per-template `DashboardPrimarySelectionStats` and `DashboardAnalyticsTieBreakStats`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp`
  - derives selector-scoped launch, completion, abort, success, and average-mistake aggregates from persisted template launch provenance
  - splits those aggregates specifically for dashboard primary-priority vs analytics tie-break launches
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp`
  - stamps primary dashboard template launches with explicit selector provenance
  - adds selector split formatting helpers
  - appends stored selector split analytics to the existing template analytics detail fragment used by the live launch row, template launch history, and run recap

## Product effect

Template launch analytics are now split by how the dashboard chose the template:

- plain dashboard priority launches and analytics tie-break launches accumulate separately per template id
- the dashboard can compare those two lanes using repo-backed success and mistake outcomes
- the live template launch section, template launch history, and template-backed run recap all inherit that selector split automatically through the shared analytics detail fragment
- templates with no stored selector split history remain explicit about that gap instead of implying a comparison exists

## Acceptance criteria

- repo-backed template launch analytics split dashboard primary-priority vs analytics tie-break launches
- primary dashboard launches record selector provenance so the primary lane is measurable
- dashboard template analytics detail surfaces show the selector split comparison when data exists
- full product build succeeds

## Validation checklist

1. build `UnrealHyperTwist.sln` / `UnrealHyperTwistEditor`
2. confirm template-scoped stats derive separate aggregates for dashboard primary and analytics tie-break selection reasons
3. confirm live template launch detail, template launch history, and template-backed recap all show the selector split analytics fragment
4. confirm templates without selector split history show the explicit empty-state message

That is the packet.
