From 5c597edf6859af54d16b4a420a21d76177dc82bd Mon Sep 17 00:00:00 2001 From: Cyd Date: Fri, 14 Aug 2026 11:34:00 -0500 Subject: [PATCH] The loop tests the build you just made Each pod sandbox keeps its own copy of rpl4opt.exe, planted by setup.ps1. Run a batch without refreshing it and you are testing whatever was built the last time setup ran - so a bug you fixed an hour ago reproduces perfectly, on the binary that still has it, and reads as the fix having failed. That is not hypothetical. The playerVehicle fix went in at 11:20; a 20-launch batch started at 11:23 trapped at 00486ebe, the same address as before, because all four pods were still running the 09:33 exe. Ten minutes of looking at a crash that had already been fixed. So the loop now copies Release\rpl4opt.exe into every pod before it starts, and logs the hash and build time it planted. A batch whose first line does not name the build you expect is a batch you can throw away without reading the rest. Co-Authored-By: Claude Opus 5 (1M context) --- tools/podium-repro/loop.ps1 | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tools/podium-repro/loop.ps1 b/tools/podium-repro/loop.ps1 index bf2ff87..d7e1457 100644 --- a/tools/podium-repro/loop.ps1 +++ b/tools/podium-repro/loop.ps1 @@ -28,6 +28,7 @@ param( # play. cdbrun.txt's PEB trick is dead on Windows 26200 (see README). [string]$CdbScript = 'cdbrun-gflags.txt', [int]$RaceSeconds = 45, + [string]$ReleaseExe = 'C:\VWE\RP412\Release\rpl4opt.exe', # Run without the heap instrument on purpose. Says so in the tally. [switch]$AllowNoPageHeap ) @@ -88,6 +89,34 @@ if (-not $pageHeapOn) { Log 'page heap ON (IFEO GlobalFlag has FLG_HEAP_PAGE_ALLOCS)' } +#----------------------------------------------------------------- +# Put THIS build in the sandboxes. +# +# Each pod dir keeps its own copy of the exe, planted by setup.ps1. Run a +# batch without refreshing it and you test whatever was built whenever +# setup.ps1 last ran - so a freshly fixed bug reproduces perfectly, on the +# binary that still has it, and reads as the fix having failed. That +# happened: the fix went in at 11:20 and a 20-launch batch trapped at the +# same address on the 09:33 exe. +#----------------------------------------------------------------- +if (-not (Test-Path $ReleaseExe)) { + Log "ReleaseExe missing: $ReleaseExe - build Release first" + exit 1 +} +$relHash = (Get-FileHash $ReleaseExe -Algorithm MD5).Hash +$refreshed = 0 +for ($i = 0; $i -lt $PodCount; $i++) { + $podDir = Join-Path $Scratch ('pod' + [char](65 + $i)) + if (Test-Path $podDir) { + Copy-Item $ReleaseExe (Join-Path $podDir 'rpl4opt.exe') -Force + $refreshed++ + } else { + Log "pod dir missing: $podDir - run setup.ps1 -PodCount $PodCount first" + exit 1 + } +} +Log "exe: $($relHash.Substring(0,12)) built $((Get-Item $ReleaseExe).LastWriteTime.ToString('MM-dd HH:mm:ss')) -> $refreshed pod(s)" + #----------------------------------------------------------------- # A quiet machine before each launch. #