Drain recognition shell header validators

This commit is contained in:
axiomlogicnexus 2026-06-25 02:41:20 +00:00
parent 7350650204
commit 71c7393350
3 changed files with 188 additions and 298 deletions

View file

@ -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()

View file

@ -819,48 +819,7 @@ struct FHyperTwistVisionBrowserShellProfile
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FHyperTwistVisionShellActionBinding> 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<FHyperTwistSpeechShellActionBinding> 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<FHyperTwistSpeechShellActionBinding> 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<FHyperTwistSpeechShellActionBinding> 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<FHyperTwistSpeechShellActionBinding> 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<FHyperTwistSpeechShellActionBinding> 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)

View file

@ -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