Merge ca3-v4-amend 746099e3 into master (gate: green on 746099e3, recorded by tools/ci/pre-push.sh; landed on the build mirror)

This commit is contained in:
igneum-labs 2026-10-08 03:02:03 +00:00
commit c52c867811
8 changed files with 105 additions and 16 deletions

View file

@ -48,8 +48,15 @@ function HelperReset() {
Start-Sleep -Seconds 2
try { Start-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction Stop } catch { $t = "$_" -replace '\s+', ' '; "RESULT helper start refused: $t"; if ($t -match '800710E0') { 'RESULT helper STOP: the scheduler refused the elevated instance (0x800710E0); nothing escalates' }; return $false }
$t = 0
while ($t -lt 60) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
'RESULT helper STOP: helper.alive never freshened within 60 s of the start; nothing escalates'
while ($t -lt 20) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
# the 0.3.20 helper's heartbeat file does not freshen on every run (the 02:45Z restore: stale past 60 s, the rgc answered at once), so a
# probe dev line answered in helper.log is the proof when the heartbeat is not
$s0 = HelperSeqBase
$mark = 0; if (Test-Path $helperLog) { $mark = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue).Count }
Set-Content -LiteralPath $cmdFile -Value "$s0 dev $idx`n" -NoNewline -Encoding ascii
$t2 = 0
while ($t2 -lt 20) { Start-Sleep -Seconds 1; $t2++; $new = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue); if ($new.Count -gt $mark -and ($new[$mark..($new.Count - 1)] | Where-Object { $_ -match "\b$s0 dev " })) { "RESULT helper up after $($t + $t2) s (the heartbeat stale, the probe dev line $s0 answered in helper.log)"; return $true } }
'RESULT helper STOP: no heartbeat within 20 s and no answer to a probe dev line within 20 more; nothing escalates'
return $false
}
function HelperSeqBase() { $m = 0; foreach ($f in @($cmdFile, $helperLog)) { if (Test-Path $f) { foreach ($l in (Get-Content -LiteralPath $f -ErrorAction SilentlyContinue)) { if ($l -match '(?:^|\s)(\d{1,6}) (?:dev|pl|lgc|rgc|lmc|rmc|nvidia-smi|reregister)\b') { $v = [int]$Matches[1]; if ($v -gt $m) { $m = $v } } } } }; return $m + 100 }

View file

@ -41,8 +41,15 @@ function HelperReset() {
Start-Sleep -Seconds 2
try { Start-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction Stop } catch { $t = "$_" -replace '\s+', ' '; "RESULT helper start refused: $t"; if ($t -match '800710E0') { 'RESULT helper STOP: the scheduler refused the elevated instance (0x800710E0); nothing escalates' }; return $false }
$t = 0
while ($t -lt 60) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
'RESULT helper STOP: helper.alive never freshened within 60 s of the start; nothing escalates'
while ($t -lt 20) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
# the 0.3.20 helper's heartbeat file does not freshen on every run (the 02:45Z restore: stale past 60 s, the rgc answered at once), so a
# probe dev line answered in helper.log is the proof when the heartbeat is not
$s0 = HelperSeqBase
$mark = 0; if (Test-Path $helperLog) { $mark = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue).Count }
Set-Content -LiteralPath $cmdFile -Value "$s0 dev $idx`n" -NoNewline -Encoding ascii
$t2 = 0
while ($t2 -lt 20) { Start-Sleep -Seconds 1; $t2++; $new = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue); if ($new.Count -gt $mark -and ($new[$mark..($new.Count - 1)] | Where-Object { $_ -match "\b$s0 dev " })) { "RESULT helper up after $($t + $t2) s (the heartbeat stale, the probe dev line $s0 answered in helper.log)"; return $true } }
'RESULT helper STOP: no heartbeat within 20 s and no answer to a probe dev line within 20 more; nothing escalates'
return $false
}
function HelperSeqBase() { $m = 0; foreach ($f in @($cmdFile, $helperLog)) { if (Test-Path $f) { foreach ($l in (Get-Content -LiteralPath $f -ErrorAction SilentlyContinue)) { if ($l -match '(?:^|\s)(\d{1,6}) (?:dev|pl|lgc|rgc|lmc|rmc|nvidia-smi|reregister)\b') { $v = [int]$Matches[1]; if ($v -gt $m) { $m = $v } } } } }; return $m + 100 }

View file

@ -52,8 +52,15 @@ function HelperReset() {
Start-Sleep -Seconds 2
try { Start-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction Stop } catch { $t = "$_" -replace '\s+', ' '; "RESULT helper start refused: $t"; if ($t -match '800710E0') { 'RESULT helper STOP: the scheduler refused the elevated instance (0x800710E0); nothing escalates' }; return $false }
$t = 0
while ($t -lt 60) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
'RESULT helper STOP: helper.alive never freshened within 60 s of the start; nothing escalates'
while ($t -lt 20) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
# the 0.3.20 helper's heartbeat file does not freshen on every run (the 02:45Z restore: stale past 60 s, the rgc answered at once), so a
# probe dev line answered in helper.log is the proof when the heartbeat is not
$s0 = HelperSeqBase
$mark = 0; if (Test-Path $helperLog) { $mark = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue).Count }
Set-Content -LiteralPath $cmdFile -Value "$s0 dev $idx`n" -NoNewline -Encoding ascii
$t2 = 0
while ($t2 -lt 20) { Start-Sleep -Seconds 1; $t2++; $new = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue); if ($new.Count -gt $mark -and ($new[$mark..($new.Count - 1)] | Where-Object { $_ -match "\b$s0 dev " })) { "RESULT helper up after $($t + $t2) s (the heartbeat stale, the probe dev line $s0 answered in helper.log)"; return $true } }
'RESULT helper STOP: no heartbeat within 20 s and no answer to a probe dev line within 20 more; nothing escalates'
return $false
}
function HelperSeqBase() { $m = 0; foreach ($f in @($cmdFile, $helperLog)) { if (Test-Path $f) { foreach ($l in (Get-Content -LiteralPath $f -ErrorAction SilentlyContinue)) { if ($l -match '(?:^|\s)(\d{1,6}) (?:dev|pl|lgc|rgc|lmc|rmc|nvidia-smi|reregister)\b') { $v = [int]$Matches[1]; if ($v -gt $m) { $m = $v } } } } }; return $m + 100 }

View file

@ -1,4 +1,5 @@
# PC 1: put the RTX 5090's clocks back to the driver default through the Igneum Power Helper task (7 October 2026, 20:4x UTC).
# PC 1: put the RTX 5090's clocks back to the driver default through the Igneum Power Helper task (7 October 2026, 20:4x UTC; again 8 October
# 02:4x UTC after the third pass hit its time cap at the 300 MHz step, so its finally block never ran).
# The second efficiency pass (run-ca3-pc1-v4-eff-5090-floor-20261007) lost the helper at its 1,000 MHz step (no helper.log line
# within 30 s for that and every later command, the `nvidia-smi -lgc 0,1000` most likely hanging inside the helper), so its
# closing `rgc` never ran and the card stayed at the 1,100 MHz lock (sm 1,087 on the unlocked-end rows; the live miner at 118
@ -20,11 +21,15 @@ if (Test-Path $helperLog) { "RESULT helper.log tail: $((Get-Content -LiteralPath
$task = Get-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction SilentlyContinue
if (-not $task) { 'RESULT error the Igneum Power Helper task is not registered: no reset path without a prompt (Power control off)'; exit 3 }
"RESULT task state before: $($task.State)"
# the cleared sequence (update-return lane, 8 October 2026, 01:17 BST): the 0.3.20 helper skips the first N lines of cmd.txt, N = the line
# count when it started, so the task is started over an EMPTY file and its heartbeat waited for before the write
Set-Content -LiteralPath $cmdFile -Value '' -NoNewline -Encoding ascii
try { Stop-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction Stop; 'RESULT task stopped' } catch { "RESULT task stop failed: $_" }
Start-Sleep -Seconds 3
try { Start-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction Stop; 'RESULT task started' } catch { "RESULT task start failed: $_"; exit 3 }
Start-Sleep -Seconds 3
"RESULT task state now: $((Get-ScheduledTask -TaskName 'Igneum Power Helper').State)"
Start-Sleep -Seconds 2
try { Start-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction Stop; 'RESULT task started over an empty cmd.txt' } catch { "RESULT task start failed: $_"; exit 3 }
$alive = Join-Path $helperDir 'helper.alive'; $t = 0; $fresh = $false
while ($t -lt 60 -and -not $fresh) { Start-Sleep -Seconds 1; $t++; if (Test-Path -LiteralPath $alive) { try { $v = [int64]((Get-Content -LiteralPath $alive -Raw).Trim()); if (([int64][double]::Parse((Get-Date -UFormat %s)) - $v) -le 4) { $fresh = $true } } catch { } } }
"RESULT task state now: $((Get-ScheduledTask -TaskName 'Igneum Power Helper').State); heartbeat fresh=$fresh after $t s"
$seq = 0
if (Test-Path $cmdFile) { $seq = @(Get-Content -LiteralPath $cmdFile -ErrorAction SilentlyContinue | ForEach-Object { if ($_ -match '^(\d{1,6})\s') { [int]$Matches[1] } }) | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum }
if (-not $seq) { $seq = 0 }

View file

@ -141,8 +141,15 @@ function HelperReset() {
Start-Sleep -Seconds 2
try { Start-ScheduledTask -TaskName 'Igneum Power Helper' -ErrorAction Stop } catch { $t = "$_" -replace '\s+', ' '; "RESULT helper start refused: $t"; if ($t -match '800710E0') { 'RESULT helper STOP: the scheduler refused the elevated instance (0x800710E0); nothing escalates' }; return $false }
$t = 0
while ($t -lt 60) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
'RESULT helper STOP: helper.alive never freshened within 60 s of the start; nothing escalates'
while ($t -lt 20) { Start-Sleep -Seconds 1; $t++; if ((HelperAliveAge) -le 4) { "RESULT helper fresh after $t s (helper.alive within 4 s; started over an empty cmd.txt)"; return $true } }
# the 0.3.20 helper's heartbeat file does not freshen on every run (the 02:45Z restore: stale past 60 s, the rgc answered at once), so a
# probe dev line answered in helper.log is the proof when the heartbeat is not
$s0 = HelperSeqBase
$mark = 0; if (Test-Path $helperLog) { $mark = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue).Count }
Set-Content -LiteralPath $cmdFile -Value "$s0 dev $idx`n" -NoNewline -Encoding ascii
$t2 = 0
while ($t2 -lt 20) { Start-Sleep -Seconds 1; $t2++; $new = @(Get-Content -LiteralPath $helperLog -ErrorAction SilentlyContinue); if ($new.Count -gt $mark -and ($new[$mark..($new.Count - 1)] | Where-Object { $_ -match "\b$s0 dev " })) { "RESULT helper up after $($t + $t2) s (the heartbeat stale, the probe dev line $s0 answered in helper.log)"; return $true } }
'RESULT helper STOP: no heartbeat within 20 s and no answer to a probe dev line within 20 more; nothing escalates'
return $false
}
function HelperSeqBase() {
@ -238,10 +245,15 @@ function Bench([string] $pk, [int] $n, [string] $variant = 'base') {
if (-not $res -or $rc -ne 0) { $e = ($lines | Where-Object { $_ -match 'FAIL|error|MISMATCH' } | Select-Object -First 1); $err = if ($e) { ($e -replace '\s+', ' ') } else { "exit $rc, no RESULT line" } }
return [pscustomobject]@{ pack = $pk; t0 = $t0; t1 = $t1; rc = $rc; fp = $fp; mhs = $mhs; check = $check; err = $err; res = $res; batches = $n; dev = $dev; variant = $variant; race = $race; served = $served; sparse = $sparse }
}
# the step budget (8 October 2026: the third 5090 pass sized every step's batch count from the unlocked rate, so the 500 MHz step ran
# 155 s instead of 60 and the 45 min cap killed the script before its restore): the batch count follows the last rate read for the pack,
# and a step that would end within four minutes of the cap is not started, so the reset and the drift check run inside it
$lastMhs = @{}
function Step([string] $label, [string] $lockNote) {
foreach ($pk in $packOrder) { foreach ($variant in $variants) {
if ((Get-Date) -gt $deadline) { "RESULT STEP card=$cardName pack=$pk lock=$label variant=$variant error=budget spent"; continue }
if ((Get-Date) -gt $deadline.AddMinutes(-4)) { "RESULT STEP card=$cardName pack=$pk lock=$label variant=$variant error=budget spent (four minutes kept for the restore)"; continue }
$n = if ($ca4) { 250 } else { $nb[$pk] }
if (-not $ca4 -and $lastMhs[$pk]) { $n = [math]::Max(20, [math]::Min(2000, [int][math]::Ceiling($stepSeconds * $lastMhs[$pk] * 1e6 / 16777216.0))) }
$b = Bench $pk $n $variant
if ($b.err) { "RESULT STEP card=$cardName pack=$pk lock=$label variant=$variant error=$($b.err) lock_note=$lockNote race=[$($b.race)]"; continue }
$w = ReadWindow $b.t0.AddSeconds(8) $b.t1
@ -259,7 +271,7 @@ function Step([string] $label, [string] $lockNote) {
$lab = if ($ca4) { 'ca4-research' } else { 'efficiency' }
$vfail = if ($ca4 -and $variant -ne 'base' -and ($b.served -eq 'base' -or $b.race -match 'variant_not_installed')) { ' variant_row=FAILED' } else { '' }
"RESULT STEP card=$cardName pack=$pk lock=$label variant=$variant served=$($b.served) sparse_blocks=$($b.sparse)$vfail label=$lab sm_mhz=$sm mem_mhz=$mem watts=$watts watts_instant=$wInst watts_average=$wAvg temp_max=$tmax throttle=$thr mhs=$($b.mhs) mh_per_w=$eff fingerprint=$($b.fp) match=$match expected=$want check=$($b.check) batches=$n wall_s=$wall samples=$($w.Count) device=$($b.dev) lock_note=$lockNote alone=$alone race=[$($b.race)]"
if ($variant -eq 'base') { $script:rows += [pscustomobject]@{ pack = $pk; lock = $label; sm = $sm; watts = $watts; mhs = $b.mhs; eff = $eff; match = $match } }
if ($variant -eq 'base') { $script:rows += [pscustomobject]@{ pack = $pk; lock = $label; sm = $sm; watts = $watts; mhs = $b.mhs; eff = $eff; match = $match } }; if ($b.mhs) { $script:lastMhs[$pk] = $b.mhs }
} }
}
try {
@ -286,7 +298,7 @@ try {
foreach ($c in $locks) { foreach ($pk in $packOrder) { "RESULT STEP card=$cardName pack=$pk lock=$c error=no lock path (not elevated, no helper task)" } }
} else {
foreach ($c in $locks) {
if ((Get-Date) -gt $deadline) { "RESULT STEP card=$cardName pack=* lock=$c error=budget spent"; continue }
if ((Get-Date) -gt $deadline.AddMinutes(-4)) { "RESULT STEP card=$cardName pack=* lock=$c error=budget spent (four minutes kept for the restore)"; continue }
$note = SetLock $c
$lockState = "locked $c"
if ($note -match 'no helper.log') { foreach ($pk in $packOrder) { "RESULT STEP card=$cardName pack=$pk lock=$c error=lock $note" }; "RESULT locks stopped at $c MHz: the helper gave no answer (a lock under the driver's floor hangs its nvidia-smi call); the remaining locks are skipped and the task is restarted for the reset"; RestartHelper | Out-Null; break }

View file

@ -23,6 +23,7 @@ no playbook quits, pauses or resumes the installed app
no script writes into another worktree or walks Projects
the signer is never piped into head
bash bodies in PowerShell job scripts pass bash -n
the PC 1 measurement pass keeps four minutes of its cap for the restore and sizes each step from the last rate (known-failed first)
run jobs test their fetched kit before use
every Windows spawn of the app runs with a hidden console
pinned guest programs match their manifest

View file

@ -0,0 +1,49 @@
#!/usr/bin/env bash
# The PC 1 measurement scripts' step budget (8 October 2026, 02:4x UTC, the Counter ASIC coordinator's order): the third 5090 pass sized
# every step's batch count from the unlocked rate, so the 500 MHz step ran 155 s instead of 60, the 45 min cap killed the script during
# the 300 MHz step, its finally block never ran and the card sat at a 400 MHz lock for four minutes until a restore job. Two rules on
# tools/ca3-v4-amend/pc1-v4-efficiency.ps1, checked here: (1) a step is started only when it ends before the cap less a four-minute reserve
# (`$deadline.AddMinutes(-4)` guards every step and every lock), so the clocks reset and the drift check run inside the cap; (2) the
# batch count per step follows the last rate read for the pack (`$lastMhs`), so a 60 s step stays 60 s as the rate falls. The self-test is
# the known-failed case: a grid whose steps lengthen past the cap under the old rule (the batch count fixed, the deadline alone) ends on
# the cap with no restore; under the new rule it ends with the restore run. Both halves run in the gate.
# bash tools/ci/pc1-step-budget-check.sh [--self-test]
set -euo pipefail
cd "$(dirname "$0")/../.."
# simulate(reserve_s, follow_rate): seconds at which the restore runs, or "cap" when the cap (2700 s) kills the script first. The grid is
# the third pass's: 2 packs x 9 locks;
# the unlocked rate 137 MH/s, each lock's rate following the clock below the knee (121 MH/s at 1,100 down to 32 at 300, as measured);
# a step's seconds = 60 x (the rate its batch count was sized from / the step's rate) + 15 s of build and settle, the restore 30 s.
simulate() {
local reserve="$1" follow="$2" cap=2700 t=120 rate=137000 sized=137000 lock
for lock in 1100 1000 900 800 700 600 500 400 300; do
rate=$(( 137000 * lock / 1300 )) # below the knee the rate follows the clock (the measured 121 MH/s at 1,100, 42.6 at 400)
[ "$follow" = 1 ] && sized=$rate
local step=$(( 2 * (60 * sized / rate + 15) )) # 60 s x (the sized rate's batch count) at the step's rate, 15 s of build and settle, two packs
# the guard is a clock check before the step (the script cannot know the step's length): the step starts when the clock is under
# the cap less the reserve, and the cap kills the script when the step overruns it
if [ $t -gt $(( cap - reserve )) ]; then break; fi
t=$(( t + step ))
[ $t -gt $cap ] && { echo cap; return; }
done
t=$(( t + 30 ))
if [ $t -gt $cap ]; then echo cap; else echo "$t"; fi
}
if [ "${1:-}" = "--self-test" ]; then
old=$(simulate 0 0); new=$(simulate 240 1)
[ "$old" = cap ] || { echo "self-test FAILED: the old rule (no reserve, the batch count fixed) should end on the cap, got $old"; exit 1; }
case "$new" in cap) echo "self-test FAILED: the new rule should end with the restore inside the cap"; exit 1 ;; esac
[ "$new" -le 2700 ] || { echo "self-test FAILED: the restore at $new s is past the cap"; exit 1; }
echo "self-test passed: the old rule ends on the cap with no restore; the new rule ends with the restore at $new s of 2700"
exit 0
fi
f=tools/ca3-v4-amend/pc1-v4-efficiency.ps1
[ -f "$f" ] || { echo "pc1-step-budget: $f is missing"; exit 1; }
bad=0
n=$(grep -c 'deadline.AddMinutes(-4)' "$f" || true)
[ "$n" -ge 2 ] || { echo "pc1-step-budget: $f guards fewer than two places with the four-minute reserve (\$deadline.AddMinutes(-4): the step loop and the lock loop)"; bad=1; }
grep -q 'lastMhs\[\$pk\] \* 1e6' "$f" || { echo "pc1-step-budget: $f does not size the batch count from the last rate read (\$lastMhs)"; bad=1; }
grep -q 'script:lastMhs\[\$pk\] = \$b.mhs' "$f" || { echo "pc1-step-budget: $f never records the last rate per pack"; bad=1; }
if grep -vE '^\s*#' "$f" | grep -qE 'if \(\(Get-Date\) -gt \$deadline\)'; then echo "pc1-step-budget: $f still guards a step with the bare deadline (no reserve for the restore)"; bad=1; fi
[ $bad = 0 ] && echo "pc1-step-budget: the efficiency pass keeps four minutes for its restore and sizes each step from the last rate"
exit $bad

View file

@ -108,6 +108,7 @@ tree_checks() {
run "no script writes into another worktree or walks Projects" bash -c 'bash tools/ci/no-foreign-tree-writes.sh --self-test && bash tools/ci/no-foreign-tree-writes.sh'
run "the signer is never piped into head" bash tools/ci/signer-pipe-check.sh
run "bash bodies in PowerShell job scripts pass bash -n" bash -c 'bash tools/ci/bash-body-check.sh --self-test && bash tools/ci/bash-body-check.sh'
run "the PC 1 measurement pass keeps four minutes of its cap for the restore and sizes each step from the last rate (known-failed first)" bash -c 'bash tools/ci/pc1-step-budget-check.sh --self-test && bash tools/ci/pc1-step-budget-check.sh'
run "run jobs test their fetched kit before use" bash -c 'bash tools/ci/kit-path-check.sh --self-test && bash tools/ci/kit-path-check.sh'
run "every Windows spawn of the app runs with a hidden console" bash -c 'node tools/ci/windows-spawn-check.mjs --self-test && node tools/ci/windows-spawn-check.mjs'
run "pinned guest programs match their manifest" bash tools/ci/pinned-guests-check.sh