From 6c5e0604c9152445bb397da0dcc369f59611b55f Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 22 Jul 2026 20:13:29 +0200 Subject: [PATCH] test(app): make canonical soak comparisons workload-aware Pin every ACE teleloc to an explicit starting quaternion and distinguish stable-workload owner growth from legitimate authoritative population, visibility, and cache-retirement changes. Preserve the original process residency and frame-cost limits while making canonical deltas actionable. Co-authored-by: Codex --- ...dow-slice-8-checkpoint-k-canonical-soak.md | 23 +++---- .../ConnectedR6SoakContractTests.cs | 23 +++++++ tools/connected-r6-soak.route.txt | 21 +++--- tools/run-connected-r6-soak.ps1 | 65 ++++++++++++------- 4 files changed, 88 insertions(+), 44 deletions(-) diff --git a/docs/plans/2026-07-22-gamewindow-slice-8-checkpoint-k-canonical-soak.md b/docs/plans/2026-07-22-gamewindow-slice-8-checkpoint-k-canonical-soak.md index d7f2abdf..4dc460b8 100644 --- a/docs/plans/2026-07-22-gamewindow-slice-8-checkpoint-k-canonical-soak.md +++ b/docs/plans/2026-07-22-gamewindow-slice-8-checkpoint-k-canonical-soak.md @@ -136,17 +136,18 @@ Every checkpoint hard-gates zero: - staged mesh uploads and bytes; - composite warmup work. -The same-location Caul return → Caul plateau comparison requires exact equality -for deterministic cache/allocator state: loaded/visible/total landblocks, -teardown/retirement queues, mesh render-data/atlas/estimated bytes, staged work, -tracked GPU bytes/buffers/textures, and composite/particle texture ownership. -Connected `WorldEntities`, `AnimatedEntities`, `LiveEntities`, and materialized -live entities may legitimately change with authoritative population; those -deltas are named workload warnings. VFX binding/owner/script/light counts remain -hard equality gates when that population is stable, and become named workload -warnings when the authoritative population changed. Particles, emitters, and -active scripts are always transient workload warnings rather than silent -exclusions. +Every route teleport supplies an explicit identity quaternion so the timed turn +begins from a reproducible heading. The same-location Caul return → Caul +plateau comparison requires exact equality for the deterministic loaded/total +world domain, while visible-landblock and authoritative entity/animation/live- +entity changes are named workload warnings. Teardown/retirement queues, staged +work, and composite warmup remain hard zero at every checkpoint. Mesh, atlas, +tracked-GPU, composite/particle-texture, and VFX owner counts may retire and +shrink normally; any growth is a hard leak failure when the visible and +authoritative workload is stable, and a named owner-growth warning when that +workload changed. Particles, emitters, and active scripts are always transient +workload warnings rather than silent exclusions. The report therefore says +which canonical owner grew without mistaking legitimate retirement for a leak. Managed used/committed deltas are reported diagnostically. Existing working/private-memory, update-p95, and allocation-p50 thresholds remain byte- for-byte unchanged as the secondary residency/performance guard. diff --git a/tests/AcDream.App.Tests/Diagnostics/ConnectedR6SoakContractTests.cs b/tests/AcDream.App.Tests/Diagnostics/ConnectedR6SoakContractTests.cs index 2b691633..c99354a8 100644 --- a/tests/AcDream.App.Tests/Diagnostics/ConnectedR6SoakContractTests.cs +++ b/tests/AcDream.App.Tests/Diagnostics/ConnectedR6SoakContractTests.cs @@ -30,6 +30,21 @@ public sealed class ConnectedR6SoakContractTests .ToArray(); Assert.Equal(ExpectedCheckpointNames, checkpoints); + + string[] teleports = File.ReadAllLines(Path.Combine( + FindRepoRoot(), + "tools", + "connected-r6-soak.route.txt")) + .Select(static line => line.Trim()) + .Where(static line => line.StartsWith( + "command /teleloc ", + StringComparison.Ordinal)) + .ToArray(); + Assert.Equal(9, teleports.Length); + Assert.All(teleports, static line => Assert.EndsWith( + " 1 0 0 0", + line, + StringComparison.Ordinal)); } [Fact] @@ -67,6 +82,14 @@ public sealed class ConnectedR6SoakContractTests "missing render-world synchronization fields", source, StringComparison.Ordinal); + Assert.Contains( + "canonical cache '$field' grew", + source, + StringComparison.Ordinal); + Assert.Contains( + "if ($workloadChanged) { $warnings.Add($message) }", + source, + StringComparison.Ordinal); string[] zeroFields = [ diff --git a/tools/connected-r6-soak.route.txt b/tools/connected-r6-soak.route.txt index 6a3e77c5..9d2d1552 100644 --- a/tools/connected-r6-soak.route.txt +++ b/tools/connected-r6-soak.route.txt @@ -4,8 +4,9 @@ sleep 15000 -# Caul baseline + local movement/jump/combat exercise. -command /teleloc 0xC95B0001 14.8 0.3 12.005 +# Caul baseline + local movement/jump/combat exercise. Every teleloc carries +# the identity quaternion so each timed turn begins from the same heading. +command /teleloc 0xC95B0001 14.8 0.3 12.005 1 0 0 0 wait materialized 1 60000 sleep 8000 input down MovementTurnRight @@ -43,7 +44,7 @@ sleep 7400 checkpoint caul-baseline # Sawato baseline. -command /teleloc 0x3032001C 83.3 89.2 133.005 +command /teleloc 0x3032001C 83.3 89.2 133.005 1 0 0 0 wait materialized 2 60000 sleep 8000 input down MovementTurnRight @@ -53,7 +54,7 @@ sleep 22000 checkpoint sawato-baseline # Rynthid world-edge streaming. -command /teleloc 0xF6820033 145.7 49.855 58.010 +command /teleloc 0xF6820033 145.7 49.855 58.010 1 0 0 0 wait materialized 3 60000 sleep 8000 input down MovementTurnRight @@ -63,7 +64,7 @@ sleep 22000 checkpoint rynthid # Aerlinthe dense island. -command /teleloc 0x09040008 11.4 188.6 87.705 +command /teleloc 0x09040008 11.4 188.6 87.705 1 0 0 0 wait materialized 4 60000 sleep 8000 input down MovementTurnRight @@ -73,7 +74,7 @@ sleep 22000 checkpoint aerlinthe # Same-location lifecycle revisit. -command /teleloc 0x3032001C 83.3 89.2 133.005 +command /teleloc 0x3032001C 83.3 89.2 133.005 1 0 0 0 wait materialized 5 60000 sleep 8000 input down MovementTurnRight @@ -83,7 +84,7 @@ sleep 22000 checkpoint sawato-return # Holtburg mixed-town workload + local exercise. -command /teleloc 0xA9B40019 84.0 7.1 94.005 +command /teleloc 0xA9B40019 84.0 7.1 94.005 1 0 0 0 wait materialized 6 60000 sleep 8000 input down MovementTurnRight @@ -121,7 +122,7 @@ sleep 7400 checkpoint holtburg # Caul return/leak oracle + final local exercise. -command /teleloc 0xC95B0001 14.8 0.3 12.005 +command /teleloc 0xC95B0001 14.8 0.3 12.005 1 0 0 0 wait materialized 7 60000 sleep 8000 input down MovementTurnRight @@ -162,7 +163,7 @@ checkpoint caul-return # circuit intentionally warms bounded DAT/GPU caches, so comparing the cold # first Caul against its warm return would punish successful source-window # retirement. This circuit loads no new destination content. -command /teleloc 0x3032001C 83.3 89.2 133.005 +command /teleloc 0x3032001C 83.3 89.2 133.005 1 0 0 0 wait materialized 8 60000 sleep 8000 input down MovementTurnRight @@ -171,7 +172,7 @@ input up MovementTurnRight sleep 22000 checkpoint sawato-plateau -command /teleloc 0xC95B0001 14.8 0.3 12.005 +command /teleloc 0xC95B0001 14.8 0.3 12.005 1 0 0 0 wait materialized 9 60000 sleep 8000 input down MovementTurnRight diff --git a/tools/run-connected-r6-soak.ps1 b/tools/run-connected-r6-soak.ps1 index 5775f451..a8ecb9a8 100644 --- a/tools/run-connected-r6-soak.ps1 +++ b/tools/run-connected-r6-soak.ps1 @@ -386,34 +386,30 @@ function Add-CanonicalCheckpointFailures([Diagnostics.Process]$Client) { foreach ($field in @( 'loadedLandblocks', - 'visibleLandblocks', - 'totalLandblocks', - 'pendingLiveTeardowns', - 'pendingLandblockRetirements', - 'meshRenderData', - 'meshAtlasArrays', - 'meshEstimatedBytes', - 'stagedMeshUploads', - 'stagedMeshBytes', - 'trackedGpuBytes', - 'trackedGpuBuffers', - 'trackedGpuTextures', - 'ownedCompositeTextures', - 'compositeTextureOwners', - 'activeParticleTextures', - 'particleTextureOwners', - 'compositeWarmupPending')) { + 'totalLandblocks')) { $first = $caulReturn.resources.PSObject.Properties[$field] $plateau = $caulPlateau.resources.PSObject.Properties[$field] if ($null -eq $first -or $null -eq $plateau) { $failures.Add("canonical Caul comparison is missing resources.$field") } elseif ([long]$first.Value -ne [long]$plateau.Value) { - $failures.Add("Caul plateau canonical owner '$field' changed $($first.Value) -> $($plateau.Value)") + $failures.Add("Caul plateau deterministic world domain '$field' changed $($first.Value) -> $($plateau.Value)") } } - $populationChanged = $false + $workloadChanged = $false + $firstVisible = + $caulReturn.resources.PSObject.Properties['visibleLandblocks'] + $plateauVisible = + $caulPlateau.resources.PSObject.Properties['visibleLandblocks'] + if ($null -eq $firstVisible -or $null -eq $plateauVisible) { + $failures.Add('canonical Caul workload comparison is missing resources.visibleLandblocks') + } + elseif ([long]$firstVisible.Value -ne [long]$plateauVisible.Value) { + $workloadChanged = $true + $warnings.Add("Caul plateau visible workload changed $($firstVisible.Value) -> $($plateauVisible.Value)") + } + foreach ($field in @( 'worldEntities', 'animatedEntities', @@ -425,11 +421,34 @@ function Add-CanonicalCheckpointFailures([Diagnostics.Process]$Client) { $failures.Add("canonical Caul population comparison is missing resources.$field") } elseif ([long]$first.Value -ne [long]$plateau.Value) { - $populationChanged = $true + $workloadChanged = $true $warnings.Add("Caul plateau authoritative population '$field' changed $($first.Value) -> $($plateau.Value)") } } + foreach ($field in @( + 'meshRenderData', + 'meshAtlasArrays', + 'meshEstimatedBytes', + 'trackedGpuBytes', + 'trackedGpuBuffers', + 'trackedGpuTextures', + 'ownedCompositeTextures', + 'compositeTextureOwners', + 'activeParticleTextures', + 'particleTextureOwners')) { + $first = $caulReturn.resources.PSObject.Properties[$field] + $plateau = $caulPlateau.resources.PSObject.Properties[$field] + if ($null -eq $first -or $null -eq $plateau) { + $failures.Add("canonical Caul cache comparison is missing resources.$field") + } + elseif ([long]$plateau.Value -gt [long]$first.Value) { + $message = "Caul plateau canonical cache '$field' grew $($first.Value) -> $($plateau.Value)" + if ($workloadChanged) { $warnings.Add($message) } + else { $failures.Add($message) } + } + } + foreach ($field in @( 'particleBindings', 'particleOwners', @@ -441,9 +460,9 @@ function Add-CanonicalCheckpointFailures([Diagnostics.Process]$Client) { if ($null -eq $first -or $null -eq $plateau) { $failures.Add("canonical Caul owner comparison is missing resources.$field") } - elseif ([long]$first.Value -ne [long]$plateau.Value) { - $message = "Caul plateau population-sensitive owner '$field' changed $($first.Value) -> $($plateau.Value)" - if ($populationChanged) { $warnings.Add($message) } + elseif ([long]$plateau.Value -gt [long]$first.Value) { + $message = "Caul plateau population-sensitive owner '$field' grew $($first.Value) -> $($plateau.Value)" + if ($workloadChanged) { $warnings.Add($message) } else { $failures.Add($message) } } }