# HyperTwist Phase 4 gameplay generated-mode selector option-menu / detail surface packet

Created on `2026-05-08`

Status:

- first-party HyperTwist packet
- bounded Phase `4` gameplay-facing consumer slice

## Purpose

This packet closes the next thin gameplay-facing consumer seam above the panel-widget and session-actor generated-mode selector roster by exposing one parameterized selector option-menu / detail surface for a chosen selector id.

The open tasks were:

- stop forcing gameplay / Blueprint callers to read raw imported selector-option payloads just to render normalized option ids, labels, values, and chosen-selector option menus
- expose when a cached generated-mode selector choice still matches an imported option and when it has drifted out of the imported option list
- keep the surface derived from already-cached gameplay consumer selector/runtime state instead of widening into selector-application behavior or new runtime fetches

It is not:

- a new selector-application behavior packet
- a per-option actionability or case-coverage packet
- a generated-mode execution packet
- a broader gameplay UI composition pass

## Scope

Bounded lane:

- add first-party generated-mode selector option-entry and option-menu surfaces in shared training types
- add a coach-library helper that derives the chosen-selector option menu from the active deck imported runtime surface, cached imported selection state, requested selector id, and the already-landed selector roster surface
- expose that parameterized option-menu surface on `HyperTwistTrainingPanelWidget` and `HyperTwistTrainingSessionActor`
- keep the derivation presentation-only and rooted in already-cached gameplay consumer state

Out of scope:

- changing selector-choice persistence
- changing generated-mode launch-config derivation rules
- changing selector-option application behavior
- widening into per-option case coverage or actionability yet

## Why this was the right next packet

Before this slice:

- gameplay-facing panel/session consumers already exposed truthful generated-mode launch / execution context
- those same consumers already exposed truthful selector / application context
- those same consumers already exposed truthful selector roster / option-availability summary

But one thin consumer seam was still open:

- callers could list active selectors and see whether unresolved selectors still had imported options
- but they still had to read raw option payloads to render the option menu for a chosen selector and to explain whether the cached selection still matched a live imported option

That meant:

- selector roster posture was thin and reusable
- but chosen-selector option detail still leaked raw imported option payloads into callers

So the next bounded move was:

- keep the already-landed launch / execution, selector / application, and selector roster surfaces unchanged
- and expose one narrow parameterized option-menu / detail surface above that cached selector state

## What landed

Primary code changes:

- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h`
  - added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionEntrySurface`
  - added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingCoachLibrary.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp`
  - added `DeriveCoachGeneratedModeSelectorOptionMenuSurface(...)`
  - option detail is derived from the active imported runtime surface, cached imported selection state, requested selector id, and the already-landed selector roster surface
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp`
  - added `GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(const FString& SelectorId)`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp`
  - added `GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(const FString& SelectorId)`

Surface behavior:

- reports normalized option ids, labels, and option values for the chosen selector
- reports whether the cached selection still matches one of the current imported options
- reports unresolved-selection detail when cached selection state remains but no longer maps to the imported option list
- keeps the surface presentation-only and compatible with the already-landed generated-mode context and roster surfaces

## Validation

Validation target:

- full `Development Editor|Win64` build of `C:\HyperTwist\UnrealHyperTwist\UnrealHyperTwist.sln`

Result:

- passed with `0` warnings and `0` errors

## Follow-on

The next bounded packet on this same gameplay-facing consumer lane should stay thin and expose one generated-mode selector option actionability / case-coverage surface so callers can render which imported options still map to owned cases and which remain selection-only choices without reading raw option-case payloads or runtime probes directly.
