diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistSkills/HyperTwistSkillTypes.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistSkills/HyperTwistSkillTypes.cpp index e1a9f37..accb70b 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistSkills/HyperTwistSkillTypes.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistSkills/HyperTwistSkillTypes.cpp @@ -717,6 +717,36 @@ bool FHyperTwistSkillAuditLedgerState::IsStructurallyValid() const && bCommandServiceProvenanceVisible == bComputedCommandProvenanceVisible; } +bool FHyperTwistSkillValidationContractCase::IsStructurallyValid() const +{ + if (CaseId.IsEmpty() + || SkillId.IsEmpty() + || Kind == EHyperTwistSkillValidationContractKind::None + || ExecutionMode == EHyperTwistSkillValidationExecutionMode::None + || ExpectedCommandSurfaceId.IsEmpty() + || ExpectedServiceBindingId.IsEmpty() + || RequiredTemplateSectionIds.Num() == 0 + || ExpectedArtifactKinds.Num() == 0) + { + return false; + } + + if (!HyperTwistSkillTypesInternal::AreAllStringsPopulated(RequiredTemplateSectionIds) + || !HyperTwistSkillTypesInternal::AreAllStringsPopulated(ExpectedArtifactKinds)) + { + return false; + } + + const bool bLiveMode = + ExecutionMode == EHyperTwistSkillValidationExecutionMode::LiveContract; + if (bLiveMode && !bUsesAuditLedgerEvidence) + { + return false; + } + + return true; +} + bool FHyperTwistSkillAuthoringHarnessState::IsStructurallyValid() const { if (RegistryId.IsEmpty() diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistSkills/HyperTwistSkillTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistSkills/HyperTwistSkillTypes.h index aa8f9e2..f86088a 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistSkills/HyperTwistSkillTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistSkills/HyperTwistSkillTypes.h @@ -1090,45 +1090,7 @@ struct FHyperTwistSkillValidationContractCase UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString Summary; - bool IsStructurallyValid() const - { - if (CaseId.IsEmpty() - || SkillId.IsEmpty() - || Kind == EHyperTwistSkillValidationContractKind::None - || ExecutionMode == EHyperTwistSkillValidationExecutionMode::None - || ExpectedCommandSurfaceId.IsEmpty() - || ExpectedServiceBindingId.IsEmpty() - || RequiredTemplateSectionIds.Num() == 0 - || ExpectedArtifactKinds.Num() == 0) - { - return false; - } - - for (const FString& SectionId : RequiredTemplateSectionIds) - { - if (SectionId.IsEmpty()) - { - return false; - } - } - - for (const FString& ArtifactKind : ExpectedArtifactKinds) - { - if (ArtifactKind.IsEmpty()) - { - return false; - } - } - - const bool bLiveMode = - ExecutionMode == EHyperTwistSkillValidationExecutionMode::LiveContract; - if (bLiveMode && !bUsesAuditLedgerEvidence) - { - return false; - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md index 72bd4fa..20e0bde 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -293,6 +293,24 @@ Latest GitNexus wrapper hardening follow-up still on `2026-06-24`: - `Quality: 6139` - all `7` rules passing +Latest later vanilla-refactor follow-up still on `2026-06-24`: + +- the next bounded structural seam then moved + `FHyperTwistSkillValidationContractCase::IsStructurallyValid()` out of the + public skill header and into + `Private/HyperTwistSkills/HyperTwistSkillTypes.cpp` +- that kept the change fully behavior-preserving while reducing another small + piece of inline validator weight inside the public skill-type header +- `scripts/run-hypertwist-sentrux-source-only.sh` then improved again to: + - `Quality: 6145` + - all `7` rules passing +- current truthful “vanilla refactor” reading tightens one step further: + - the larger website/manual truth lane is already drained + - GitNexus and Sentrux ownership hardening is now landed + - remaining structural work is now smaller still and should be chosen only + when it materially improves maintenance rather than because a large obvious + hotspot remains + 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