diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistRecognition/HyperTwistRecognitionTypes.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistRecognition/HyperTwistRecognitionTypes.cpp index 6405864..ef198b3 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistRecognition/HyperTwistRecognitionTypes.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistRecognition/HyperTwistRecognitionTypes.cpp @@ -30,6 +30,149 @@ namespace HyperTwistRecognitionTypesInternal } } +bool FHyperTwistVisionBrowserShellProfile::IsStructurallyValid() const +{ + return !BrowserShellProfileId.IsEmpty() + && !TransportKind.IsEmpty() + && !TransportEndpoint.IsEmpty() + && CaptureIntervalMs > 0 + && !BrowserAssetReviewProfileId.IsEmpty() + && BrowserAssetReviewProfileDefinition.IsStructurallyValid() + && !DefaultBrowserAssetReviewDescriptorId.IsEmpty() + && SupportedBrowserAssetReviews.Num() > 0 + && OrderedStageIds.Num() > 0 + && ActionBindings.Num() > 0 + && HyperTwistRecognitionTypesInternal::AreAllStringsPopulated(OrderedStageIds) + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(SupportedBrowserAssetReviews) + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(ActionBindings); +} + +bool FHyperTwistSpeechMicrophoneShellProfile::IsStructurallyValid() const +{ + return !MicrophoneShellProfileId.IsEmpty() + && !ShellKind.IsEmpty() + && !CaptureMode.IsEmpty() + && StepWindowMs > 0 + && CaptureWindowMs >= StepWindowMs + && KeepWindowMs >= 0 + && KeepWindowMs <= CaptureWindowMs + && AudioContextTokens >= 0 + && VadThreshold > 0.0f + && HighPassFrequencyHz >= 0.0f + && !PermissionContractId.IsEmpty() + && !CaptureRouteContractId.IsEmpty() + && !PermissionRequestActionId.IsEmpty() + && !CaptureRouteRetryActionId.IsEmpty() + && Panels.Num() > 0 + && ActionBindings.Num() > 0 + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(Panels) + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(ActionBindings); +} + +bool FHyperTwistSpeechProviderProfile::IsStructurallyValid() const +{ + return !ProviderProfileId.IsEmpty() + && !DisplayLabel.IsEmpty() + && !ProviderClass.IsEmpty() + && !EndpointClass.IsEmpty() + && !EndpointReferenceId.IsEmpty() + && !AuthMaterialSource.IsEmpty() + && !ModelSelectionMode.IsEmpty() + && SupportedModelIds.Num() > 0 + && CapabilityFlags.Num() > 0 + && (AuthMaterialSource.Equals(TEXT("not-required"), ESearchCase::CaseSensitive) + || !AuthReferenceId.IsEmpty()) + && HyperTwistRecognitionTypesInternal::AreAllStringsPopulated(SupportedModelIds) + && HyperTwistRecognitionTypesInternal::AreAllStringsPopulated(CapabilityFlags); +} + +bool FHyperTwistSpeechUsageCostAccountingProfile::IsStructurallyValid() const +{ + return !UsageCostAccountingProfileId.IsEmpty() + && !AccountingKind.IsEmpty() + && !UsageAggregationMode.IsEmpty() + && !CostAggregationMode.IsEmpty() + && !QuotaVisibilityMode.IsEmpty() + && !EscalationMode.IsEmpty() + && !UserOverridePosture.IsEmpty() + && NormalizedMeterKinds.Num() > 0 + && NormalizedCurrencyCodes.Num() > 0 + && HyperTwistRecognitionTypesInternal::AreAllStringsPopulated(NormalizedMeterKinds) + && HyperTwistRecognitionTypesInternal::AreAllStringsPopulated(NormalizedCurrencyCodes); +} + +bool FHyperTwistSpeechUsageCostHistoryExportShellProfile::IsStructurallyValid() const +{ + return !HistoryExportShellProfileId.IsEmpty() + && !ShellKind.IsEmpty() + && !HistorySurfaceMode.IsEmpty() + && !ExportSurfaceMode.IsEmpty() + && !RefreshActionId.IsEmpty() + && !ExportPreviewActionId.IsEmpty() + && !CopySummaryActionId.IsEmpty() + && !RouteInspectActionId.IsEmpty() + && !BudgetInspectActionId.IsEmpty() + && RetainedHistoryEntryLimit > 0 + && Panels.Num() > 0 + && ActionBindings.Num() > 0 + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(Panels) + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(ActionBindings); +} + +bool FHyperTwistSpeechProviderReceiptReviewShellProfile::IsStructurallyValid() const +{ + return !ReceiptReviewShellProfileId.IsEmpty() + && !ShellKind.IsEmpty() + && !ReceiptSurfaceMode.IsEmpty() + && !VarianceSurfaceMode.IsEmpty() + && !RefreshActionId.IsEmpty() + && !PostedChargeInspectActionId.IsEmpty() + && !VarianceReviewActionId.IsEmpty() + && !RouteInspectActionId.IsEmpty() + && !BudgetInspectActionId.IsEmpty() + && RetainedReceiptEntryLimit > 0 + && Panels.Num() > 0 + && ActionBindings.Num() > 0 + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(Panels) + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(ActionBindings); +} + +bool FHyperTwistSpeechProviderBillingSettlementShellProfile::IsStructurallyValid() const +{ + return !BillingSettlementShellProfileId.IsEmpty() + && !ShellKind.IsEmpty() + && !SettlementSurfaceMode.IsEmpty() + && !InvoiceReconciliationMode.IsEmpty() + && !RefreshActionId.IsEmpty() + && !InvoiceReconciliationActionId.IsEmpty() + && !SettlementReadinessActionId.IsEmpty() + && !RouteInspectActionId.IsEmpty() + && !BudgetInspectActionId.IsEmpty() + && RetainedSettlementEntryLimit > 0 + && Panels.Num() > 0 + && ActionBindings.Num() > 0 + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(Panels) + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(ActionBindings); +} + +bool FHyperTwistSpeechProviderSettlementExceptionShellProfile::IsStructurallyValid() const +{ + return !SettlementExceptionShellProfileId.IsEmpty() + && !ShellKind.IsEmpty() + && !ExceptionSurfaceMode.IsEmpty() + && !ExternalPortalHandoffMode.IsEmpty() + && !RefreshActionId.IsEmpty() + && !ExceptionInspectActionId.IsEmpty() + && !ExternalPortalHandoffActionId.IsEmpty() + && !RouteInspectActionId.IsEmpty() + && !BudgetInspectActionId.IsEmpty() + && RetainedExceptionEntryLimit > 0 + && Panels.Num() > 0 + && ActionBindings.Num() > 0 + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(Panels) + && HyperTwistRecognitionTypesInternal::AreAllItemsStructurallyValid(ActionBindings); +} + bool FHyperTwistSpeechNativeCaptureRouteShellProfile::IsStructurallyValid() const { return !NativeCaptureRouteShellProfileId.IsEmpty() diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistRecognition/HyperTwistRecognitionTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistRecognition/HyperTwistRecognitionTypes.h index ccc0253..5dc140f 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistRecognition/HyperTwistRecognitionTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistRecognition/HyperTwistRecognitionTypes.h @@ -819,48 +819,7 @@ struct FHyperTwistVisionBrowserShellProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray ActionBindings; - bool IsStructurallyValid() const - { - if (BrowserShellProfileId.IsEmpty() - || TransportKind.IsEmpty() - || TransportEndpoint.IsEmpty() - || CaptureIntervalMs <= 0 - || BrowserAssetReviewProfileId.IsEmpty() - || !BrowserAssetReviewProfileDefinition.IsStructurallyValid() - || DefaultBrowserAssetReviewDescriptorId.IsEmpty() - || SupportedBrowserAssetReviews.Num() <= 0 - || OrderedStageIds.Num() <= 0 - || ActionBindings.Num() <= 0) - { - return false; - } - - for (const FString& StageId : OrderedStageIds) - { - if (StageId.IsEmpty()) - { - return false; - } - } - - for (const FHyperTwistVisionBrowserAssetReviewDescriptor& AssetReview : SupportedBrowserAssetReviews) - { - if (!AssetReview.IsStructurallyValid()) - { - return false; - } - } - - for (const FHyperTwistVisionShellActionBinding& ActionBinding : ActionBindings) - { - if (!ActionBinding.IsStructurallyValid()) - { - return false; - } - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) @@ -1837,46 +1796,7 @@ struct FHyperTwistSpeechMicrophoneShellProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray ActionBindings; - bool IsStructurallyValid() const - { - if (MicrophoneShellProfileId.IsEmpty() - || ShellKind.IsEmpty() - || CaptureMode.IsEmpty() - || StepWindowMs <= 0 - || CaptureWindowMs < StepWindowMs - || KeepWindowMs < 0 - || KeepWindowMs > CaptureWindowMs - || AudioContextTokens < 0 - || VadThreshold <= 0.0f - || HighPassFrequencyHz < 0.0f - || PermissionContractId.IsEmpty() - || CaptureRouteContractId.IsEmpty() - || PermissionRequestActionId.IsEmpty() - || CaptureRouteRetryActionId.IsEmpty() - || Panels.Num() <= 0 - || ActionBindings.Num() <= 0) - { - return false; - } - - for (const FHyperTwistSpeechShellPanelLayout& Panel : Panels) - { - if (!Panel.IsStructurallyValid()) - { - return false; - } - } - - for (const FHyperTwistSpeechShellActionBinding& ActionBinding : ActionBindings) - { - if (!ActionBinding.IsStructurallyValid()) - { - return false; - } - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) @@ -2612,45 +2532,7 @@ struct FHyperTwistSpeechProviderProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bPreservesFirstPartyCustody = true; - bool IsStructurallyValid() const - { - if (ProviderProfileId.IsEmpty() - || DisplayLabel.IsEmpty() - || ProviderClass.IsEmpty() - || EndpointClass.IsEmpty() - || EndpointReferenceId.IsEmpty() - || AuthMaterialSource.IsEmpty() - || ModelSelectionMode.IsEmpty() - || SupportedModelIds.Num() <= 0 - || CapabilityFlags.Num() <= 0) - { - return false; - } - - if (!AuthMaterialSource.Equals(TEXT("not-required"), ESearchCase::CaseSensitive) - && AuthReferenceId.IsEmpty()) - { - return false; - } - - for (const FString& ModelId : SupportedModelIds) - { - if (ModelId.IsEmpty()) - { - return false; - } - } - - for (const FString& CapabilityFlag : CapabilityFlags) - { - if (CapabilityFlag.IsEmpty()) - { - return false; - } - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) @@ -2943,39 +2825,7 @@ struct FHyperTwistSpeechUsageCostAccountingProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bAllowsDonorOwnedCostGovernance = false; - bool IsStructurallyValid() const - { - if (UsageCostAccountingProfileId.IsEmpty() - || AccountingKind.IsEmpty() - || UsageAggregationMode.IsEmpty() - || CostAggregationMode.IsEmpty() - || QuotaVisibilityMode.IsEmpty() - || EscalationMode.IsEmpty() - || UserOverridePosture.IsEmpty() - || NormalizedMeterKinds.Num() <= 0 - || NormalizedCurrencyCodes.Num() <= 0) - { - return false; - } - - for (const FString& MeterKind : NormalizedMeterKinds) - { - if (MeterKind.IsEmpty()) - { - return false; - } - } - - for (const FString& CurrencyCode : NormalizedCurrencyCodes) - { - if (CurrencyCode.IsEmpty()) - { - return false; - } - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) @@ -3573,42 +3423,7 @@ struct FHyperTwistSpeechUsageCostHistoryExportShellProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray ActionBindings; - bool IsStructurallyValid() const - { - if (HistoryExportShellProfileId.IsEmpty() - || ShellKind.IsEmpty() - || HistorySurfaceMode.IsEmpty() - || ExportSurfaceMode.IsEmpty() - || RefreshActionId.IsEmpty() - || ExportPreviewActionId.IsEmpty() - || CopySummaryActionId.IsEmpty() - || RouteInspectActionId.IsEmpty() - || BudgetInspectActionId.IsEmpty() - || RetainedHistoryEntryLimit <= 0 - || Panels.Num() <= 0 - || ActionBindings.Num() <= 0) - { - return false; - } - - for (const FHyperTwistSpeechShellPanelLayout& Panel : Panels) - { - if (!Panel.IsStructurallyValid()) - { - return false; - } - } - - for (const FHyperTwistSpeechShellActionBinding& ActionBinding : ActionBindings) - { - if (!ActionBinding.IsStructurallyValid()) - { - return false; - } - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) @@ -3886,42 +3701,7 @@ struct FHyperTwistSpeechProviderReceiptReviewShellProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray ActionBindings; - bool IsStructurallyValid() const - { - if (ReceiptReviewShellProfileId.IsEmpty() - || ShellKind.IsEmpty() - || ReceiptSurfaceMode.IsEmpty() - || VarianceSurfaceMode.IsEmpty() - || RefreshActionId.IsEmpty() - || PostedChargeInspectActionId.IsEmpty() - || VarianceReviewActionId.IsEmpty() - || RouteInspectActionId.IsEmpty() - || BudgetInspectActionId.IsEmpty() - || RetainedReceiptEntryLimit <= 0 - || Panels.Num() <= 0 - || ActionBindings.Num() <= 0) - { - return false; - } - - for (const FHyperTwistSpeechShellPanelLayout& Panel : Panels) - { - if (!Panel.IsStructurallyValid()) - { - return false; - } - } - - for (const FHyperTwistSpeechShellActionBinding& ActionBinding : ActionBindings) - { - if (!ActionBinding.IsStructurallyValid()) - { - return false; - } - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) @@ -4189,42 +3969,7 @@ struct FHyperTwistSpeechProviderBillingSettlementShellProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray ActionBindings; - bool IsStructurallyValid() const - { - if (BillingSettlementShellProfileId.IsEmpty() - || ShellKind.IsEmpty() - || SettlementSurfaceMode.IsEmpty() - || InvoiceReconciliationMode.IsEmpty() - || RefreshActionId.IsEmpty() - || InvoiceReconciliationActionId.IsEmpty() - || SettlementReadinessActionId.IsEmpty() - || RouteInspectActionId.IsEmpty() - || BudgetInspectActionId.IsEmpty() - || RetainedSettlementEntryLimit <= 0 - || Panels.Num() <= 0 - || ActionBindings.Num() <= 0) - { - return false; - } - - for (const FHyperTwistSpeechShellPanelLayout& Panel : Panels) - { - if (!Panel.IsStructurallyValid()) - { - return false; - } - } - - for (const FHyperTwistSpeechShellActionBinding& ActionBinding : ActionBindings) - { - if (!ActionBinding.IsStructurallyValid()) - { - return false; - } - } - - return true; - } + bool IsStructurallyValid() const; }; USTRUCT(BlueprintType) @@ -4507,42 +4252,7 @@ struct FHyperTwistSpeechProviderSettlementExceptionShellProfile UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray ActionBindings; - bool IsStructurallyValid() const - { - if (SettlementExceptionShellProfileId.IsEmpty() - || ShellKind.IsEmpty() - || ExceptionSurfaceMode.IsEmpty() - || ExternalPortalHandoffMode.IsEmpty() - || RefreshActionId.IsEmpty() - || ExceptionInspectActionId.IsEmpty() - || ExternalPortalHandoffActionId.IsEmpty() - || RouteInspectActionId.IsEmpty() - || BudgetInspectActionId.IsEmpty() - || RetainedExceptionEntryLimit <= 0 - || Panels.Num() <= 0 - || ActionBindings.Num() <= 0) - { - return false; - } - - for (const FHyperTwistSpeechShellPanelLayout& Panel : Panels) - { - if (!Panel.IsStructurallyValid()) - { - return false; - } - } - - for (const FHyperTwistSpeechShellActionBinding& ActionBinding : ActionBindings) - { - if (!ActionBinding.IsStructurallyValid()) - { - 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 ebea7a1..23c034b 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -466,6 +466,43 @@ Latest same-day simulation projection header cleanup follow-up still on - if we continue the same structural hardening lane, the next honest family is recognition/core ownership rather than more simulation projection cleanup +Latest same-day recognition header cleanup follow-up still on `2026-06-25`: + +- the next bounded recognition-family packet then moved the larger shell/profile + validators out of + `Public/HyperTwistRecognition/HyperTwistRecognitionTypes.h` and into + `Private/HyperTwistRecognition/HyperTwistRecognitionTypes.cpp` +- the moved family covered: + - `FHyperTwistVisionBrowserShellProfile::IsStructurallyValid()` + - `FHyperTwistSpeechMicrophoneShellProfile::IsStructurallyValid()` + - `FHyperTwistSpeechProviderProfile::IsStructurallyValid()` + - `FHyperTwistSpeechUsageCostAccountingProfile::IsStructurallyValid()` + - `FHyperTwistSpeechUsageCostHistoryExportShellProfile::IsStructurallyValid()` + - `FHyperTwistSpeechProviderReceiptReviewShellProfile::IsStructurallyValid()` + - `FHyperTwistSpeechProviderBillingSettlementShellProfile::IsStructurallyValid()` + - `FHyperTwistSpeechProviderSettlementExceptionShellProfile::IsStructurallyValid()` +- the private recognition owner now reuses its existing + `AreAllStringsPopulated(...)` and `AreAllItemsStructurallyValid(...)` helpers + for these checks, so the moved implementations read like the rest of the + recognition type family instead of repeating hand-written loops in the public + header +- `scripts/run-hypertwist-sentrux-source-only.sh` then improved again to: + - `Quality: 6188` + - all `7` rules passing +- the overall public-header inline-validator hotspots now shift again toward + core/viewer/training plus smaller residual recognition and memory seams: + - `42` lines for `FHyperTwistMelinda2x2x2x2ScramblePacket` + - `36` lines for the current `HyperTwistViewerTypes.h` lead seam + - `35` lines for `FHyperTwistTrainingClassicCubeMediaExportPlan` + - `30` lines for `FHyperTwistVisionCommittedFaceState` + - `30` lines for `FHyperTwistMemoryCognitiveFact` +- current truthful “vanilla refactor” reading tightens again: + - the recognition type header is no longer a meaningful large inline-validator + hotspot + - if we continue this exact structural hardening lane, the next honest family + is now core/viewer/training or a return to the remaining smaller memory + seams rather than more recognition shell-profile 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