diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.cpp index 103a782..8b67d8f 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.cpp @@ -493,6 +493,43 @@ UHyperTwistTrainingMediaExportLibrary::BuildBundledMediaExportReferenceBundle() return Bundle; } +bool FHyperTwistTrainingClassicCubeMediaExportPlan::IsStructurallyValid() const +{ + return !PlanVersion.IsEmpty() + && !ReplayId.IsEmpty() + && !PuzzleId.IsEmpty() + && !MapPath.IsEmpty() + && !LevelSequencePath.IsEmpty() + && !VideoRoute.IsEmpty() + && !StillRoute.IsEmpty() + && !ShareImageRoute.IsEmpty() + && !OutputDirectory.IsEmpty() + && !OutputBaseName.IsEmpty() + && !VideoOutputDirectory.IsEmpty() + && !StillOutputDirectory.IsEmpty() + && !ValidationDirectory.IsEmpty() + && !ExpectedVideoPath.IsEmpty() + && !ExpectedStillFramePath.IsEmpty() + && !ExpectedShareCardPath.IsEmpty() + && !ExpectedReportPath.IsEmpty() + && !ExpectedVideoReportPath.IsEmpty() + && !ExpectedStillReportPath.IsEmpty() + && OutputWidth > 0 + && OutputHeight > 0 + && OutputFrameRate > 0 + && ReplayDurationMs >= 0 + && TailDurationMs >= 0 + && RenderStartFrame >= 0 + && RenderEndFrame > RenderStartFrame + && StillFrame >= RenderStartFrame + && StillFrame < RenderEndFrame + && MoveCount >= 0 + && InspectionTimeMs >= 0 + && FinalTimeMs >= 0 + && ReviewAnchorCount >= 0; +} + + bool UHyperTwistTrainingMediaExportLibrary::TryGetPackageReferenceById( const FHyperTwistTrainingMediaExportReferenceBundle& Bundle, const FString& PackageId, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.h index 81519d0..5488f56 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.h @@ -426,41 +426,7 @@ struct FHyperTwistTrainingClassicCubeMediaExportPlan UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bCanExportShareImage = false; - bool IsStructurallyValid() const - { - return !PlanVersion.IsEmpty() - && !ReplayId.IsEmpty() - && !PuzzleId.IsEmpty() - && !MapPath.IsEmpty() - && !LevelSequencePath.IsEmpty() - && !VideoRoute.IsEmpty() - && !StillRoute.IsEmpty() - && !ShareImageRoute.IsEmpty() - && !OutputDirectory.IsEmpty() - && !OutputBaseName.IsEmpty() - && !VideoOutputDirectory.IsEmpty() - && !StillOutputDirectory.IsEmpty() - && !ValidationDirectory.IsEmpty() - && !ExpectedVideoPath.IsEmpty() - && !ExpectedStillFramePath.IsEmpty() - && !ExpectedShareCardPath.IsEmpty() - && !ExpectedReportPath.IsEmpty() - && !ExpectedVideoReportPath.IsEmpty() - && !ExpectedStillReportPath.IsEmpty() - && OutputWidth > 0 - && OutputHeight > 0 - && OutputFrameRate > 0 - && ReplayDurationMs >= 0 - && TailDurationMs >= 0 - && RenderStartFrame >= 0 - && RenderEndFrame > RenderStartFrame - && StillFrame >= RenderStartFrame - && StillFrame < RenderEndFrame - && MoveCount >= 0 - && InspectionTimeMs >= 0 - && FinalTimeMs >= 0 - && ReviewAnchorCount >= 0; - } + bool IsStructurallyValid() const; }; UCLASS() diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md index e49eb70..96e041e 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -535,6 +535,34 @@ Latest same-day core header cleanup follow-up still on `2026-06-25`: - if we continue this structural hardening lane, the next honest family is now viewer/training or a return to the remaining smaller memory seams +Latest same-day training media-export header cleanup follow-up still on +`2026-06-25`: + +- the next bounded training-family packet then moved + `FHyperTwistTrainingClassicCubeMediaExportPlan::IsStructurallyValid()` out of + `Public/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.h` and into + `Private/HyperTwistTraining/HyperTwistTrainingMediaExportLibrary.cpp` +- that keeps the heavier classic-cube export-plan validation beside the live + media-export reference bundle and plan-construction routines already owned by + the training media-export library instead of leaving the public training + export header to carry the lead validator inline +- `scripts/run-hypertwist-sentrux-source-only.sh` then improved again to: + - `Quality: 6197` + - all `7` rules passing +- the overall public-header inline-validator hotspots now shift again toward + viewer plus the remaining smaller recognition and memory seams: + - `36` lines for the current `HyperTwistViewerTypes.h` lead seam + - `30` lines for `FHyperTwistVisionCommittedFaceState` + - `30` lines for `FHyperTwistMemoryCognitiveFact` + - `28` lines for `FHyperTwistMemoryDigestView` + - `27` lines for the remaining memory-state cluster +- current truthful “vanilla refactor” reading tightens again: + - the training media-export header is no longer a meaningful large + inline-validator hotspot + - the next honest structural continuation is now either the viewer family or + a return to the remaining smaller memory seams, not more training + media-export cleanup + Latest same-day browser/distribution continuity follow-up still on `2026-06-24`: - auth-entry, protected-route loading, dashboard auth health, and release-authority fallback states now share a more deliberate operator-facing recovery shape instead of scattering single-line warnings across public and protected surfaces