# HyperTwist Phase 4 gameplay generated-mode selector option actionability / case-coverage 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 option detail surface by exposing one parameterized option actionability / case-coverage surface for a chosen selector id.

The open tasks were:

- stop forcing gameplay / Blueprint callers to read raw option-case payloads or run their own option-to-case probes just to tell which imported options still map to owned cases
- expose which imported options remain selection-only choices even though they still exist in the selector option menu
- keep the surface derived from already-cached gameplay consumer selector/runtime state and the existing owned deck rather than widening into new backend behavior

It is not:

- a new selector-application behavior packet
- a generated-mode execution packet
- a selector option dispatch / interaction packet
- a broader gameplay UI composition pass

## Scope

Bounded lane:

- add first-party generated-mode selector option actionability surfaces in shared training types
- add a coach-library helper that derives case coverage from the active deck, requested selector id, and the already-landed selector option-menu surface
- expose that parameterized actionability surface on `HyperTwistTrainingPanelWidget` and `HyperTwistTrainingSessionActor`
- keep the derivation presentation-only and rooted in already-owned deck cases plus cached gameplay consumer selector state

Out of scope:

- changing selector-choice persistence
- changing generated-mode launch-config derivation rules
- changing direct option-launch or generated-choice apply behavior
- widening into per-option dispatch posture 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
- those same consumers already exposed truthful chosen-selector option detail

But one thin consumer seam was still open:

- callers could render the option menu for a chosen selector
- but they still had to inspect raw option-case behavior to explain which options still mapped to owned cases and which were now selection-only choices

That meant:

- option detail was thin and reusable
- but case coverage still leaked low-level option matching work into callers

So the next bounded move was:

- keep the already-landed generated-mode context, roster, and option-detail surfaces unchanged
- and expose one narrow option actionability / case-coverage surface above the owned deck case set

## What landed

Primary code changes:

- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h`
  - added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionActionabilityEntrySurface`
  - added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionActionabilitySurface`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingCoachLibrary.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp`
  - added `DeriveCoachGeneratedModeSelectorOptionActionabilitySurface(...)`
  - case coverage is derived from the active owned deck, requested selector id, and the already-landed selector option-menu surface
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp`
  - added `GetDisplayedCoachGeneratedModeSelectorOptionActionabilitySurface(const FString& SelectorId)`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp`
  - added `GetDisplayedCoachGeneratedModeSelectorOptionActionabilitySurface(const FString& SelectorId)`

Surface behavior:

- reports which imported options for the chosen selector still map to owned deck cases
- reports which imported options remain selection-only choices
- reports whether the current cached selection is case-covered, selection-only, or no longer present in the imported option list
- keeps the surface presentation-only and compatible with the already-landed generated-mode option-detail surface

## 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 interaction / dispatch surface so callers can render whether choosing an option should launch a direct owned case, apply a generated-mode selector choice, or stay unavailable without reaching into raw runtime action-path rules directly.
