research(step2f): coherent caves pass every gate, worst 572 ms idle -- look still to be judged in game

Editor-only, default off (voxel.ResearchParameterizedCave 1; the live skip proofs now decline
automatically). Jittered elliptical chambers of varied size and height with rock between them,
narrow tunnels, capped shafts, occasional pillars/ledges/stalactites/stalagmites/hanging masses;
detail bands at 48/24/12 samples (shortest 3 m), bound 3.822.
Gates, step 2e -> step 2f R29 (worst of 8 profiles), each rejecting 2e:
  crumbs < 1 m^3 2,290 -> 0; dihedral >45 deg 40.7% -> 2.2%; lattice detail energy 0.83 -> 0.007
  (RMS floor kept: 0.484 >= 0.40); LOD1 distance p95 0.709 -> 0.377 samples; grid autocorrelation
  0.667 -> 0.348; solid share 2.7% -> 79-82%; roof/floor openings 26,657 -> 0.
Speed, 259^3 ring, six workers, idle machine (20 GB free): 527-572 ms, worst TerracedBasin 572.3 ms
(R27 591 ms, R28 603 ms: run-to-run spread is ~5%). Proof audit 0 violations, undersized control
caught; seams pass; 1 vs 6 worker hash 876069a813c83cee; TraversalSeeds pass.
Captures are UNLIT (lit runs showed only sky; three D3D12 device-removed crashes): they show the
material's tiling, not the cave forms, so the look is not yet judged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-01 05:50:20 +02:00
1 parent d6555df5fa
commit ca78352e43
16 files changed
+8070 -80

No files matched your search

+63 -8
View File
@@ -589,6 +589,53 @@ function Sync-OwnerAssets {
return @($rows)
}
function Sync-Step2fCaptureMaterialDependencies {
# The authored terrain materials depend on packages outside the plugin. Copy their exact
# source packages into the isolated host so the in-game capture uses the owner's material
# graph instead of Unreal's fallback material. Source assets remain untouched.
$rows = [System.Collections.Generic.List[object]]::new()
$relativePackages = @(
'Magic_Forest\Landscape_Material\Rock_Cliffs\T_Rock_C',
'Magic_Forest\Mesh\Rock\Textures\T_Rocks_N',
'VoxelForge\MF_LayerWeight',
'VoxelForge\MF_Triplanar',
'VoxelForge\MF_VoxelOrbLighting',
'LUSH_StylizedEnvironmentSet\Foliage\Grass\LG_Grass',
'LUSH_StylizedEnvironmentSet\Landscape\Textures\T_BeachSand_N',
'UltraDynamicSky\Textures\3D_Clouds\3DCells_128'
)
foreach ($relativePackage in $relativePackages) {
$sourceBase = Join-Path (Join-Path $ProjectRoot 'Content') $relativePackage
$targetBase = Join-Path (Join-Path $HostRoot 'Content') $relativePackage
$sourceAsset = "$sourceBase.uasset"
if (-not (Test-Path -LiteralPath $sourceAsset -PathType Leaf)) {
throw "Step2f capture material dependency is missing: $sourceAsset"
}
Ensure-Directory (Split-Path -Parent $targetBase)
$copied = [System.Collections.Generic.List[string]]::new()
foreach ($extension in @('.uasset', '.uexp', '.ubulk', '.uptnl')) {
$source = "$sourceBase$extension"
if (Test-Path -LiteralPath $source -PathType Leaf) {
$target = "$targetBase$extension"
$null = Copy-Item -LiteralPath $source -Destination $target -Force -PassThru
[void]$copied.Add($target)
}
}
foreach ($target in $copied) {
$relativeTarget = $target.Substring((Join-Path $HostRoot 'Content').Length).TrimStart('\')
[void]$rows.Add([ordered]@{
name = "Step2fCapture/$relativeTarget"
used_by_scenario = $true
source_path = (Join-Path (Join-Path $ProjectRoot 'Content') $relativeTarget)
source_sha256 = Get-Sha256 (Join-Path (Join-Path $ProjectRoot 'Content') $relativeTarget)
staged_path = $target
staged_sha256 = Get-Sha256 $target
})
}
}
return @($rows)
}
function Sync-TestCharacterFixture {
$rows = [System.Collections.Generic.List[object]]::new()
@@ -652,7 +699,8 @@ function Merge-Cvars([System.Collections.IDictionary]$Base) {
return $merged
}
function New-CommonArguments([string]$Kind, [string]$LogPath, $CvarMap, [bool]$EnableRender = $false) {
function New-CommonArguments([string]$Kind, [string]$LogPath, $CvarMap,
[bool]$EnableRender = $false) {
$safeLabel = ($Label -replace '[^A-Za-z0-9_.-]', '_')
$args = [System.Collections.Generic.List[string]]::new()
# Quoting the whole -project= token is intentional: this is the failure mode that used to
@@ -676,6 +724,10 @@ function New-CommonArguments([string]$Kind, [string]$LogPath, $CvarMap, [bool]$E
[void]$args.Add('-NoZenAutoLaunch')
[void]$args.Add('-notraceserver')
[void]$args.Add('-nocrashreports')
# The editor's default usage-data setting creates a process summary under the
# machine-wide Epic analytics directory, outside this run's isolated output.
# Keep harness launches self-contained and let the external-state guard verify it.
[void]$args.Add('-ini:EditorSettings:/Script/UnrealEd.AnalyticsPrivacySettings:bSendUsageData=false')
[void]$args.Add('-WindowsPlatformCrashContext.ForceCrashReportDialogOff=1')
[void]$args.Add("-enginesaveddirsuffix=VoxelForgeTest_$safeLabel")
[void]$args.Add(('-userdir="{0}"' -f (Join-Path $RunRoot 'User')))
@@ -1388,6 +1440,9 @@ try {
} else {
$AssetEvidence = @(Get-AssetEvidence)
}
if ($Scenario -in @('step2f-capture', 'horizon-render')) {
$AssetEvidence += @(Sync-Step2fCaptureMaterialDependencies)
}
if ($Scenario -eq 'tests') {
$AssetEvidence += @(Sync-TestCharacterFixture)
}
@@ -1623,11 +1678,14 @@ try {
}
}
'step2f-capture' {
$tracePath = Join-Path $RunRoot 'step2f_capture_trace.jsonl'
$baseCvars['voxel.TestRenderDistanceChunks'] = $HorizonRenderDistanceChunks
$baseCvars['voxel.TestMaxClipLevel'] = $HorizonLevel
$baseCvars['voxel.StartupTraceFile'] = $tracePath
$baseCvars['voxel.StartupTraceMaxTiles'] = 16384
$baseCvars['voxel.TestCeilingCameraX'] = 0
$baseCvars['voxel.TestCeilingCameraY'] = 0
$baseCvars['voxel.TestCeilingCameraZ'] = -8800
$baseCvars['voxel.TestCeilingCameraPitch'] = 0
$baseCvars['voxel.TestCeilingCameraYaw'] = 0
$baseCvars['voxel.TestCeilingWallCloseup'] = if ($Step2fCaptureView -eq 'wall-closeup') { 1 } else { 0 }
$baseCvars['voxel.TestCeilingView'] = 1
$baseCvars['voxel.TestCeilingCaptureDelaySeconds'] = 60
$baseCvars['voxel.TestExitSeconds'] = 120
@@ -1640,11 +1698,8 @@ try {
$renderLog (Join-Path $RunRoot 'Logs\step2f-capture.stdout.log') `
(Join-Path $RunRoot 'Logs\step2f-capture.stderr.log')
$GameMetrics = Get-StreamingMetrics $renderLog
$HorizonMetrics = Get-HorizonMetrics $tracePath $gameLedger $GameMetrics
$HorizonMetrics = [ordered]@{ requested = $false; status = 'not_requested_for_capture' }
$HorizonRenderMetrics = Get-HorizonRenderMetrics $gameLedger $renderLog
if ($HorizonMetrics.status -ne 'ok') {
Add-Failure "step2f capture render trace did not settle: $($HorizonMetrics.status)"
}
if ($HorizonRenderMetrics.status -ne 'passed') {
Add-Failure "step2f profile $Step2fProfile in-game capture failed: $($HorizonRenderMetrics.status)"
} else {