[CmdletBinding()] param( [ValidateRange(60, 900)][int]$TimeoutSeconds = 900, [string]$WorldAssemblyManifestPath = '', [ValidateSet('MarchingCubesV1', 'WorldAssemblerHybridV1', 'WorldAssemblerHybridV2')][string]$CoreMesherRecipe = 'MarchingCubesV1', [switch]$EnableHybridFixturePlacement, [switch]$HybridCliffOnly, [switch]$HybridFixturesOnly, [switch]$FloatingIslandsOnly ) # Exercise AVoxelWorld Core streaming, collision, anchor movement, and carving in BuildHost only. Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $PluginRoot = [IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..')) $HostRoot = Join-Path $PluginRoot 'Saved\BuildHost\HostProject' $StagePlugin = Join-Path $HostRoot 'Plugins\VoxelForge' $HostProject = Join-Path $HostRoot 'HostProject.uproject' $OutputRoot = Join-Path $StagePlugin 'Saved\CoreWorldValidation' $OutputDirectory = Join-Path $OutputRoot 'Output' $InputDirectory = Join-Path $OutputRoot 'Input' $StagedWorldAssembly = Join-Path $InputDirectory 'world_assembly.json' $LogDirectory = Join-Path $OutputRoot 'Logs' $LocalAppData = Join-Path $OutputRoot 'LocalAppData' $UserDirectory = Join-Path $OutputRoot 'User' $DerivedDataCache = Join-Path $PluginRoot 'Saved\BuildHost\VFCoreWorldDDC' $ZenData = Join-Path $OutputRoot 'ZenData' $EditorCmd = 'E:\Program Files\Epic Games\UE_5.7\Engine\Binaries\Win64\UnrealEditor-Cmd.exe' $MemoryLimitBytes = 8GB $CrashRoots = @((Join-Path $HostRoot 'Saved\Crashes'), (Join-Path $StagePlugin 'Saved\Crashes')) function Assert-UnderPath([string]$Candidate, [string]$Root) { $candidateFull = [IO.Path]::GetFullPath($Candidate).TrimEnd('\', '/') $rootFull = [IO.Path]::GetFullPath($Root).TrimEnd('\', '/') if (-not ($candidateFull.Equals($rootFull, [StringComparison]::OrdinalIgnoreCase) -or $candidateFull.StartsWith($rootFull + '\', [StringComparison]::OrdinalIgnoreCase))) { throw "Refusing a BuildHost path outside its root: $candidateFull" } } Assert-UnderPath $HostRoot (Join-Path $PluginRoot 'Saved\BuildHost') Assert-UnderPath $OutputRoot (Join-Path $StagePlugin 'Saved') if ([string]::IsNullOrWhiteSpace($WorldAssemblyManifestPath)) { $WorldAssemblyManifestPath = if ($FloatingIslandsOnly) { Join-Path $PluginRoot 'Standalone\Research\WorldAssemblerM3\Round3\results\world_assembly_floating_islands.json' } else { Join-Path $PluginRoot 'Standalone\Research\WorldAssemblerM1\round4\world_assembly.json' } } $WorldAssemblyManifestPath = [IO.Path]::GetFullPath($WorldAssemblyManifestPath) Assert-UnderPath $WorldAssemblyManifestPath $PluginRoot foreach ($required in @($HostProject, $EditorCmd)) { if (-not (Test-Path -LiteralPath $required -PathType Leaf)) { throw "Required BuildHost commandlet input is missing: $required" } } if (-not (Test-Path -LiteralPath $WorldAssemblyManifestPath -PathType Leaf)) { throw "Reviewed world assembly manifest is missing: $WorldAssemblyManifestPath" } $foreignEditors = @(Get-Process -ErrorAction SilentlyContinue | Where-Object { $_.ProcessName -like 'UnrealEditor*' }) if ($foreignEditors.Count -gt 0) { $ids = ($foreignEditors | ForEach-Object { "$($_.ProcessName):$($_.Id)" }) -join ', ' throw "An UnrealEditor process is already running; leaving it untouched: $ids" } $ExpectedAssetHashes = @{ 'DA_Settings' = '5D2977F57E75A63B6B73499CD6E0AA7FBBF3718CE7F70318107BF922F0819AB7' 'DA_Strate1' = 'CDA1F985E589F28CA6E93A068FECC3CA92487E4AD5700F2C301C4B563E40E5F9' 'DA_Strate2' = '02F56A18CED991BAF93DFB2F69438152275E8353B5E279C1CB7DD6E079E352E2' 'DA_Strate3' = 'F47437F8D156C608AA06E40C5B76716ED4A19FA0F057688E7FECC04DC976428C' 'DA_Strate4' = '279570AE3CBA7B3507269C8209A7C931EEB7A15CC3241CE07B50120996B1C656' } foreach ($assetName in $ExpectedAssetHashes.Keys) { $stagedAsset = Join-Path $HostRoot "Content\VoxelForge\$assetName.uasset" if (-not (Test-Path -LiteralPath $stagedAsset -PathType Leaf)) { throw "Verified BuildHost asset copy is missing: $assetName" } if ((Get-FileHash -LiteralPath $stagedAsset -Algorithm SHA256).Hash -ne $ExpectedAssetHashes[$assetName]) { throw "BuildHost asset copy differs from the recorded round-2 hash: $assetName" } } foreach ($directory in @($OutputDirectory, $InputDirectory, $LogDirectory, $LocalAppData, $UserDirectory, $DerivedDataCache, $ZenData)) { [IO.Directory]::CreateDirectory($directory) | Out-Null } Copy-Item -LiteralPath $WorldAssemblyManifestPath -Destination $StagedWorldAssembly -Force $ManifestData = Get-Content -LiteralPath $StagedWorldAssembly -Raw | ConvertFrom-Json if ($FloatingIslandsOnly) { if ($ManifestData.content_hash -ne '94b563f1ce622def' -or @($ManifestData.floating_islands).Count -ne 1 -or @($ManifestData.plan.strates).Count -ne 0) { throw "BuildHost world assembly input is not the reviewed round-3 island manifest: $($ManifestData.content_hash)" } } elseif ($ManifestData.content_hash -ne '8933693d9560ba9f') { throw "BuildHost world assembly input is not the reviewed round-4 manifest: $($ManifestData.content_hash)" } if ($EnableHybridFixturePlacement -and $CoreMesherRecipe -eq 'MarchingCubesV1') { throw 'Hybrid fixture placement requires a WorldAssemblerHybrid recipe.' } if ($HybridCliffOnly -and $CoreMesherRecipe -eq 'MarchingCubesV1') { throw '-HybridCliffOnly requires a WorldAssemblerHybrid recipe.' } if ($HybridCliffOnly -and $EnableHybridFixturePlacement) { throw '-HybridCliffOnly uses the reviewed native cliff manifest and cannot add the surface fixtures.' } if ($HybridFixturesOnly -and $CoreMesherRecipe -eq 'MarchingCubesV1') { throw '-HybridFixturesOnly requires a WorldAssemblerHybrid recipe.' } if ($HybridFixturesOnly -and ($HybridCliffOnly -or $EnableHybridFixturePlacement)) { throw '-HybridFixturesOnly cannot be combined with the other focused hybrid modes.' } if ($FloatingIslandsOnly -and ($CoreMesherRecipe -ne 'MarchingCubesV1' -or $EnableHybridFixturePlacement -or $HybridCliffOnly -or $HybridFixturesOnly)) { throw '-FloatingIslandsOnly uses the reviewed MC island manifest and cannot be combined with hybrid modes.' } $CrashBefore = @{} foreach ($CrashRoot in $CrashRoots) { if (Test-Path -LiteralPath $CrashRoot -PathType Container) { foreach ($Crash in @(Get-ChildItem -LiteralPath $CrashRoot -Directory -Filter 'UECC-*' -Recurse -Force)) { $CrashBefore[$Crash.FullName.ToLowerInvariant()] = $Crash.LastWriteTimeUtc.Ticks } } } function Get-NewCrashFolders { $Found = [Collections.Generic.List[string]]::new() foreach ($CrashRoot in $CrashRoots) { if (Test-Path -LiteralPath $CrashRoot -PathType Container) { foreach ($Crash in @(Get-ChildItem -LiteralPath $CrashRoot -Directory -Filter 'UECC-*' -Recurse -Force)) { if (-not $CrashBefore.ContainsKey($Crash.FullName.ToLowerInvariant())) { [void]$Found.Add($Crash.FullName) } } } } return @($Found.ToArray()) } $HybridMesherFlag = switch ($CoreMesherRecipe) { 'WorldAssemblerHybridV1' { 1; break } 'WorldAssemblerHybridV2' { 2; break } default { 0 } } $HybridFixturePlacementFlag = if ($EnableHybridFixturePlacement) { 1 } else { 0 } $HybridCliffOnlyFlag = if ($HybridCliffOnly) { 1 } else { 0 } $HybridFixturesOnlyFlag = if ($HybridFixturesOnly) { 1 } else { 0 } $FloatingIslandsOnlyFlag = if ($FloatingIslandsOnly) { 1 } else { 0 } $BaseArguments = @( ('-project="{0}"' -f $HostProject), '-nullrhi', '-unattended', '-nop4', '-nosplash', '-NoSound', '-stdout', '-FullStdOutLogOutput', '-forcelogflush', '-NoZenAutoLaunch', '-notraceserver', '-nocrashreports', '-ddc=NoZenLocalFallback', ('-userdir="{0}"' -f $UserDirectory), ('-ZenDataPath="{0}"' -f $ZenData), ('-LocalDataCachePath="{0}"' -f $DerivedDataCache), '-run=VoxelForgeExplore', '-seed=0', '-archetype=TunnelNetwork', '-slot=0', '-modes=export', '-gameconfig=1', '-coreworldtest=1', ("-coreislandtest=$FloatingIslandsOnlyFlag"), '-settingsref=/Game/VoxelForge/DA_Settings.DA_Settings', ('-coreworldassembly="{0}"' -f $StagedWorldAssembly), ("-corehybridmesher=$HybridMesherFlag"), ("-corehybridfixtureplacement=$HybridFixturePlacementFlag"), ("-corehybridcliffonly=$HybridCliffOnlyFlag"), ("-corehybridfixturesonly=$HybridFixturesOnlyFlag"), ('-out="{0}"' -f $OutputDirectory) ) if ($FloatingIslandsOnly) { # Keep this stationary route fixture out of the movement gate; island/span cooked contacts are probed directly. # Garder ce fixture immobile hors du gate de mouvement ; les contacts cuisines ile/pont sont verifies directement. $BaseArguments += '-voxel.CollisionGate=0' } $OldLocalAppData = $env:LOCALAPPDATA $env:LOCALAPPDATA = $LocalAppData try { $Succeeded = $false for ($Attempt = 1; $Attempt -le 2 -and -not $Succeeded; ++$Attempt) { if ($Attempt -eq 1) { $LogFileName = 'CoreWorldValidation.log' $StdoutFileName = 'CoreWorldValidation.stdout.log' $StderrFileName = 'CoreWorldValidation.stderr.log' } else { $LogFileName = 'CoreWorldValidation.retry.log' $StdoutFileName = 'CoreWorldValidation.retry.stdout.log' $StderrFileName = 'CoreWorldValidation.retry.stderr.log' } $LogPath = Join-Path $LogDirectory $LogFileName $StdoutPath = Join-Path $LogDirectory $StdoutFileName $StderrPath = Join-Path $LogDirectory $StderrFileName $Arguments = @($BaseArguments) + ('-abslog="{0}"' -f $LogPath) Write-Host "BuildHost Core actor commandlet attempt $Attempt of 2; BelowNormal priority." $Process = Start-Process -FilePath $EditorCmd -ArgumentList $Arguments -WorkingDirectory $HostRoot ` -RedirectStandardOutput $StdoutPath -RedirectStandardError $StderrPath ` -WindowStyle Hidden -PassThru $Process.PriorityClass = [Diagnostics.ProcessPriorityClass]::BelowNormal $StartedUtc = [datetime]::UtcNow $PeakPrivateBytes = [int64]0 while (-not $Process.HasExited) { Start-Sleep -Seconds 2 $Process.Refresh() if (-not $Process.HasExited) { $PeakPrivateBytes = [Math]::Max($PeakPrivateBytes, [int64]$Process.PrivateMemorySize64) } if (([datetime]::UtcNow - $StartedUtc).TotalSeconds -gt $TimeoutSeconds) { Stop-Process -Id $Process.Id -Force -ErrorAction SilentlyContinue throw "BuildHost Core actor commandlet exceeded the $TimeoutSeconds-second time box." } if (-not $Process.HasExited -and $Process.PrivateMemorySize64 -gt $MemoryLimitBytes) { Stop-Process -Id $Process.Id -Force -ErrorAction SilentlyContinue throw 'BuildHost Core actor commandlet exceeded the 8 GiB private-memory limit.' } } $Process.WaitForExit() $Process.Refresh() $ExitCode = $Process.ExitCode if ([string]::IsNullOrEmpty([string]$ExitCode) -and (Test-Path -LiteralPath $LogPath -PathType Leaf)) { $CompletedLog = Get-Content -LiteralPath $LogPath -Raw if (($CompletedLog -match '\[VoxelForgeCoreWorldTest\] pass complete=1' -or $CompletedLog -match '\[VoxelForgeCoreIslandTest\] pass complete=1') -and $CompletedLog -match 'Commandlet VoxelForgeExploreCommandlet_\d+ finished execution \(result 0\)') { $ExitCode = 0 } elseif ($CompletedLog -match 'Commandlet VoxelForgeExploreCommandlet_\d+ finished execution \(result (-?\d+)\)') { $ExitCode = [int]$Matches[1] } } if ($ExitCode -eq -1073741502 -and $Attempt -eq 1) { Write-Warning 'BuildHost Core actor commandlet exited with 0xC0000142; retrying once.' continue } if ($ExitCode -ne 0) { $NewCrashes = @(Get-NewCrashFolders) $CrashDetail = if ($NewCrashes.Count -gt 0) { " New UECC folders: $($NewCrashes -join '; ')." } else { '' } throw "BuildHost Core actor commandlet attempt $Attempt failed with exit code '$ExitCode'.$CrashDetail See $LogPath." } $Succeeded = $true } if (-not $Succeeded) { throw 'BuildHost Core actor commandlet did not complete successfully.' } } finally { if ($null -eq $OldLocalAppData) { Remove-Item Env:LOCALAPPDATA -ErrorAction SilentlyContinue } else { $env:LOCALAPPDATA = $OldLocalAppData } } $FinalLog = Join-Path $LogDirectory 'CoreWorldValidation.log' if (-not (Test-Path -LiteralPath $FinalLog -PathType Leaf)) { $FinalLog = Join-Path $LogDirectory 'CoreWorldValidation.retry.log' } $Text = Get-Content -LiteralPath $FinalLog -Raw if ($FloatingIslandsOnly) { foreach ($Marker in @( '[VoxelForgeCoreIslandTest] manifest_import=PASS', '[VoxelForgeCoreIslandTest] standalone_reference=PASS', '[VoxelForgeCoreIslandTest] worker_hash_matrix=1/8/16 stable=1', '[VoxelForgeCoreIslandTest] pass phase=initial', '[VoxelForgeCoreIslandTest] height_anchor_agreement=PASS', '[VoxelForgeCoreIslandTest] content_anchor=PASS', '[VoxelForgeCoreIslandTest] blueprint_edit=PASS', '[VoxelForgeCoreIslandTest] switch_off_legacy=PASS', '[VoxelForgeCoreIslandTest] pass complete=1', '[VoxelForgePawnSpeedFixture] source=staged_blueprints walk_cm_s=600.000 sprint_cm_s=6000.000' )) { if ($Text.IndexOf($Marker, [StringComparison]::Ordinal) -lt 0) { throw "BuildHost floating-island log is missing '$Marker'. See $FinalLog." } } foreach ($Surface in @('island_top', 'span')) { if ($Text -notmatch ('\[VoxelForgeCoreIslandTest\] capsule_contact=PASS surface=' + [regex]::Escape($Surface) + ' .*collision_ready=1')) { throw "BuildHost island log is missing cooked capsule contact for '$Surface'. See $FinalLog." } } foreach ($Lod in @(0, 1)) { if ($Text -notmatch ('\[VoxelForgeIslandStreaming\] timing lod=' + $Lod + ' kind=.*air .*core_p95_ms=') -or $Text -notmatch ('\[VoxelForgeIslandStreaming\] timing lod=' + $Lod + ' kind=.*(island|mixed|span) .*legacy_p95_ms=')) { throw "BuildHost island log is missing matched air and surface timing at LOD$Lod. See $FinalLog." } } $NewCrashes = @(Get-NewCrashFolders) if ($NewCrashes.Count -gt 0) { throw "New UECC crash folders appeared during the island actor test: $($NewCrashes -join '; ')" } Write-Host "VOXELFORGE_CORE_FLOATING_ISLANDS_PASS manifest=$($ManifestData.content_hash) hashes=standalone water_fixed=1 lod=0,1 workers=1,8,16" Write-Host "Core actor log: $FinalLog" Write-Host "Peak commandlet private bytes sampled: $PeakPrivateBytes" return } if ($HybridFixturesOnly) { foreach ($Fixture in @('corner90', 'doorway', 'riser1m', 'cliff_ledge', 'organic_cave_chamber')) { $FixtureMarker = '\[WorldAssemblerHybridPluginFixture\] name=' + [regex]::Escape($Fixture) + ' lod=0 .*exact_repeat=1' if ($Text -notmatch $FixtureMarker) { throw "BuildHost fixture log is missing '$Fixture'. See $FinalLog." } } if ($Text -notmatch '\[WorldAssemblerHybridPluginBorder\] same_lod=PASS independent=1' -or $Text -notmatch '\[WorldAssemblerHybridPluginBorder\] lod0_lod1_doorway=1 cases=125 over_50cm_cases=0') { throw "BuildHost fixture log is missing passing border probes. See $FinalLog." } if ($CoreMesherRecipe -eq 'WorldAssemblerHybridV2') { foreach ($Fixture in @('corner90', 'doorway', 'riser1m', 'cliff_ledge', 'organic_cave_chamber')) { $FixtureMarker = '\[WorldAssemblerHybridPluginFixtureV2\] name=' + [regex]::Escape($Fixture) + ' lod=0 .*exact_repeat=1' if ($Text -notmatch $FixtureMarker) { throw "BuildHost V2 fixture log is missing '$Fixture'. See $FinalLog." } } if ($Text -notmatch '\[WorldAssemblerHybridPluginBorderV2\] same_lod=PASS independent=1 mc_identity=1') { throw "BuildHost fixture log is missing the V2 border identity proof. See $FinalLog." } } $NewCrashes = @(Get-NewCrashFolders) if ($NewCrashes.Count -gt 0) { throw "New UECC crash folders appeared during plugin fixture checks: $($NewCrashes -join '; ')" } Write-Host "VOXELFORGE_CORE_HYBRID_FIXTURES_PASS recipe=$CoreMesherRecipe analytic=5 borders=1" Write-Host "Core actor log: $FinalLog" Write-Host "Peak commandlet private bytes sampled: $PeakPrivateBytes" return } if ($HybridCliffOnly) { if ($Text -notmatch '\[WorldAssemblerHybridNativeCliff\] key=\(-22,13,-58\) lod=0 .*bit_identical=1 type4_only=1') { throw "BuildHost log is missing the sampled native SurfaceWorld cliff identity proof. See $FinalLog." } $NewCrashes = @(Get-NewCrashFolders) if ($NewCrashes.Count -gt 0) { throw "New UECC crash folders appeared during the native cliff check: $($NewCrashes -join '; ')" } Write-Host "VOXELFORGE_CORE_HYBRID_CLIFF_PASS recipe=$CoreMesherRecipe bit_identical=1" Write-Host "Core actor log: $FinalLog" Write-Host "Peak commandlet private bytes sampled: $PeakPrivateBytes" return } foreach ($Phase in @('initial', 'anchor', 'edit', 'surface_travel', 'surface_strate_travel')) { if ($Text -notmatch "\[VoxelForgeCoreWorldTest\] pass phase=$Phase") { throw "BuildHost Core actor log is missing the '$Phase' validation marker. See $FinalLog." } } if ($Text -notmatch '\[VoxelForgeCoreWorldTest\] worker_hash_matrix=1/8/16 stable=1') { throw "BuildHost Core actor log is missing the W1/W8/W16 determinism marker. See $FinalLog." } $ExpectedRuntimeAssemblyHash = $ManifestData.content_hash if ($EnableHybridFixturePlacement) { $FixtureHashMatch = [regex]::Match($Text, '\[VoxelForgeCoreWorldTest\] hybrid_fixture_placement=1 boxes=9 contacts=5 manifest_hash=([0-9a-f]{16})') if (-not $FixtureHashMatch.Success) { throw "BuildHost actor log is missing the generated hybrid fixture manifest hash. See $FinalLog." } $ExpectedRuntimeAssemblyHash = $FixtureHashMatch.Groups[1].Value } $AssemblyMarker = '\[VoxelForgeCoreWorldTest\] world_assembly_hash=' + [regex]::Escape($ExpectedRuntimeAssemblyHash) + ' plans=1 native=1' if ($Text -notmatch $AssemblyMarker) { throw "BuildHost actor log does not prove the expected native SurfaceWorld plan was attached. See $FinalLog." } $RecipeMarker = '\[VoxelForgeCoreWorldTest\] world_initialized=1 recipe=' + [regex]::Escape($CoreMesherRecipe) if ($Text -notmatch $RecipeMarker) { throw "BuildHost actor log does not confirm the requested $CoreMesherRecipe runtime selection. See $FinalLog." } if ($CoreMesherRecipe -in @('WorldAssemblerHybridV1', 'WorldAssemblerHybridV2')) { foreach ($Fixture in @('corner90', 'doorway', 'riser1m', 'cliff_ledge', 'organic_cave_chamber')) { $FixtureMarker = '\[WorldAssemblerHybridPluginFixture\] name=' + [regex]::Escape($Fixture) + ' lod=0 .*exact_repeat=1' if ($Text -notmatch $FixtureMarker) { throw "BuildHost log is missing the production mesher fixture '$Fixture'. See $FinalLog." } if ($CoreMesherRecipe -eq 'WorldAssemblerHybridV2') { $V2FixtureMarker = '\[WorldAssemblerHybridPluginFixtureV2\] name=' + [regex]::Escape($Fixture) + ' lod=0 .*exact_repeat=1' if ($Text -notmatch $V2FixtureMarker) { throw "BuildHost actor log is missing the V2 production mesher fixture '$Fixture'. See $FinalLog." } } } if ($Text -notmatch '\[WorldAssemblerHybridPluginBorder\] same_lod=PASS independent=1') { throw "BuildHost log is missing the independent same-LOD border proof. See $FinalLog." } if ($Text -notmatch '\[WorldAssemblerHybridPluginBorder\] lod0_lod1_doorway=1 cases=125 over_50cm_cases=0') { throw "BuildHost log is missing a passing 125-phase MC doorway contour result. See $FinalLog." } } if ($EnableHybridFixturePlacement -and $Text -notmatch '\[VoxelForgeHybridCollisionContact\] pass=1 probes=5') { throw "BuildHost log is missing the cooked hybrid fixture trace contacts. See $FinalLog." } if ($CoreMesherRecipe -eq 'WorldAssemblerHybridV2' -and $EnableHybridFixturePlacement -and $Text -notmatch '\[VoxelForgeHybridCollisionContact\] fixture=corner_top .*expected_point_error_cm=[0-9.]+') { throw "BuildHost log is missing the V2 flat-face contact precision proof. See $FinalLog." } if ($Text -notmatch '\[VoxelForgeCoreWorldTest\] native_biome_field=1 .*sampled_biomes=[2-9]') { throw "BuildHost Core actor log does not prove native SurfaceWorld biome assignment. See $FinalLog." } if ($Text -notmatch '\[VoxelForgeCoreWorldTest\] matched_surface_tile_timing=1 .*same_keys=1 tiles=2553') { throw "BuildHost Core actor log is missing the matched native/legacy-bridge surface timing. See $FinalLog." } foreach ($Marker in @( '[VoxelForgeCoreWorldTest] geometry_scale_agreement=PASS', '[VoxelForgeCoreWorldTest] height_agreement=PASS', '[VoxelForgeCoreWorldTest] switch_off_content_gate=PASS', '[VoxelForgeCoreWorldTest] blueprint_carve=PASS', '[VoxelForgeCoreWorldTest] blueprint_fill=PASS', '[VoxelForgePawnSpeedFixture] source=staged_blueprints walk_cm_s=600.000 sprint_cm_s=6000.000' )) { if ($Text -notmatch [regex]::Escape($Marker)) { throw "BuildHost actor log is missing the round-6 proof '$Marker'. See $FinalLog." } } foreach ($Backend in @('core_native', 'legacy_surface_bridge')) { foreach ($LOD in @(0, 1)) { foreach ($Kind in @('flat_column', 'relief', 'mixed', 'unknown')) { if ($Text -notmatch "\[WorldAssemblerPawnLag\] sample=unhashed_runtime_fastpath backend=$Backend lod=$LOD kind=$Kind ") { throw "BuildHost actor log is missing the unhashed $Backend LOD$LOD $Kind streaming-lag row. See $FinalLog." } } } } $NewCrashes = @(Get-NewCrashFolders) if ($NewCrashes.Count -gt 0) { throw "New UECC crash folders appeared during Core actor validation: $($NewCrashes -join '; ')" } Write-Host "VOXELFORGE_CORE_WORLD_PASS recipe=$CoreMesherRecipe fixtures=$HybridFixturePlacementFlag streaming=1 collision=1 anchor_move=1 carve=1" Write-Host "Core actor log: $FinalLog" Write-Host "Peak commandlet private bytes sampled: $PeakPrivateBytes"