Files
VoxelForge/Tools/TestVoxelForgeCoreWorldHost.ps1
T
Fr0zkaandClaude Opus 5.5 48fa028086 wip(assembler): M3 round 3 -- separated islands + Unreal island route (owner build 18:46)
Islands read as separate (91.89% open sky at mid-height), underside cavity closed,
rim teeth were capture shading. Island manifest import + BuildHost proof passed on the
pre-cache tree; M1 SurfaceWorld and M2 V1/V2 gates passed.

Known open: final XY-column cache compiled in the owner build but is unverified;
island LOD0 p95 ~155 ms misses the 133 ms sprint deadline (legacy ~43 ms); the island
manifest only fits the BuildHost fixture layout (owner's world: Core init fails,
empty world) -> round 4 builds plans inside Unreal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
2026-10-10 20:53:03 +02:00

430 lines
22 KiB
PowerShell

[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"