# HyperTwist Phase 4 gameplay generated-mode selector option owned execution puzzle-id / subset-id / difficulty preview 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 owned execution delivery-mode / reveal-posture / time-target preview surface by exposing one parameterized owned execution puzzle-id / subset-id / difficulty preview surface for a chosen selector id.

The open tasks were:

- stop forcing gameplay / Blueprint callers to rebuild generated deck scope rules just to explain what owned execution domain a chosen imported option would actually run in
- expose exact direct covered-case puzzle, subset, and difficulty posture plus exact generated owned execution puzzle, subset, and difficulty posture whenever the generated-mode payload is previewable
- keep the surface derived from already-cached gameplay consumer run, selector, and launch-request preview state instead of widening into backend logic

It is not:

- a selector-dispatch behavior change
- a generated-mode launch-request persistence behavior change
- a generated-mode execution deck synthesis change
- a broader gameplay UI composition pass

## Scope

Bounded lane:

- add first-party owned execution puzzle/subset/difficulty preview surfaces in shared training types
- add a coach-library helper that projects puzzle id, subset id, and difficulty over the already-landed launch-request preview surface
- expose that parameterized scope preview surface on `HyperTwistTrainingPanelWidget` and `HyperTwistTrainingSessionActor`
- keep the derivation presentation-only and rooted in the already-owned selector/runtime/request surfaces

Out of scope:

- changing selector-choice apply behavior
- changing stored launch-request creation, refresh, or execute behavior
- changing generated-mode execution deck synthesis
- widening into dashboard-only or broader gameplay composition work

## Why this was the right next packet

Before this slice:

- gameplay-facing panel/session consumers already exposed truthful owned case identity, prompt presentation, delivery mode, reveal posture, and target-time preview for imported selector options
- callers could tell how the resulting owned execution would launch

But one thin consumer seam was still open:

- callers still had to reconstruct puzzle id, subset id, and difficulty posture from direct covered-case fields, active deck state, and generated owned-execution synthesis rules if they wanted to explain the resulting owned execution scope

That meant:

- launch posture was already thin and reusable
- but concrete execution scope still leaked generated deck composition and direct launch rules into callers

So the next bounded move was:

- keep the already-landed owned execution delivery preview surface unchanged in behavior
- reuse the already-cached launch-request preview surface to expose one narrow owned execution puzzle/subset/difficulty preview surface above it

## What landed

Primary code changes:

- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h`
  - added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionPuzzleSubsetDifficultyPreviewEntrySurface`
  - added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionPuzzleSubsetDifficultyPreviewSurface`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingCoachLibrary.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp`
  - added `DeriveCoachGeneratedModeSelectorOptionOwnedExecutionPuzzleSubsetDifficultyPreviewSurface(...)`
  - scope preview is derived from cached run state plus the already-landed launch-request preview surface
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp`
  - added `GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionPuzzleSubsetDifficultyPreviewSurface(const FString& SelectorId)`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h`
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp`
  - added `GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionPuzzleSubsetDifficultyPreviewSurface(const FString& SelectorId)`

Surface behavior:

- reports exact direct covered-case puzzle id, subset id, and difficulty posture for selector options that dispatch straight to owned cases
- reports exact generated owned execution puzzle id from the hypothetical launch config, exact subset posture from the active deck, and exact difficulty posture from the seed case whenever the chosen option yields a previewable generated-mode payload
- keeps unresolved or payload-invalid choices inspectable as blocked scope-preview states instead of collapsing them into a generic unavailable branch
- keeps the surface presentation-only and compatible with the already-landed launch / execution, request-alignment, stored-request delta, launch-request payload / refresh-preview, launch-request metadata / origin-notes preview, launch-request envelope / request-source preview, owned execution case / canonical-state preview, owned execution prompt preview, and owned execution delivery preview 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 owned execution source-attribution / tag provenance preview surface so callers can render the resulting owned execution provenance and tag posture for a chosen option without rebuilding generated deck composition rules directly.
