You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Scope: WMP card 1 (WMP (WM frame pacing) card 1: measured present cadence + input->present latency on VZ #1247) measured the desktop's input->present latency at 786-1216 ms typical, 3004 ms worst, while a present's own transfer+flush is ~0.3 ms. Card 2 (claim: WMP card 2: present on input, not only on the decimated tick #1250) fixed the WM half (present on input) and left the whole remaining term in the scheduler: round-robin preempted ONLY at the 1 Hz tick (scheduler.zig 'every tick preempts the current task'), so a woken task waited a uniformly distributed 0-1 s to EXECUTE. Fix: the wake funnel (push_home_locked) raises a coalesced reschedule request; scheduler.request_resched pulls core 0's comparator forward ~2 ms via timer.nudge, so the SAME IRQ rotation a period tick uses serves the owed preemption. A nudge delivery must NOT advance the wall clock: timer.handle now returns whether the PPI was the 1 Hz period boundary, and scheduler.tick(period_tick) gates on_tick (tick_count, sleepers, app timers, WM pacing, CPU accounting) on it — so sys_sleep(1), heartbeat_every, SB6's one-tick-per-frame determinism and CPU-limit accounting all keep their 1 Hz meaning. Bound live-wm-pacing to the latency the fix earned (815/1005 ms -> ~2.5/2.7 ms) with a non-vacuity assertion that every measured sample had a nudge behind it.
Blocker: [Corrected 2026-09-14 — the previous text here said the boot "starves the shell" and that "no scheduler/timer change is on a branch". Both were wrong. starvation was a misdiagnosis: instrumented boots show a failing run printing 451,721 smp: secondary runs= lines with the shell printing EVERY one and then proceeding into script2, and a guest that survives 120 s inside a 489,187-line staging storm with the nudge armed before dying the instant the first dui command arrives. The fatal event is the WM dui path, not the staging backlog. And the change IS on a branch.] The mechanism works and is measured (815 ms -> 2.5 ms), but it kills the SMP NOTEPAD boot (live-wnd5-gate2-policy, PASS 3/3 on main -> FAIL 0/4) with a silent VM-level death: the host reports VM ended before the expected transcript appeared (state=3) (VZVirtualMachine.State.error), the runner has no didStopWithError delegate so VZ gives no reason, and there is NO [EXC] block even though the kernel routes sync exceptions through report_writer. The change is preserved as the reproduction on draft PR DRAFT / BLOCKED (#1261): WMP card 3 reschedule nudge — 815 ms -> 2.5 ms, blocked by a silent VM death on the WM dui path #1255 (branch agent/buffy/wmp3-nudge-recovered @ bc89e9c, all checks green, merges cleanly), and the defect now has its own card: SMP boot dies silently under WM traffic: the extra core-0 switch is survivable, the death is not guest-side #1261. Nothing lands until SMP boot dies silently under WM traffic: the extra core-0 switch is survivable, the death is not guest-side #1261 is fixed.
Verification: live-wm-pacing shows the latency collapse AND tick_avg_ms still 1000; live-timer/live-sleep/live-timers/live-sched-ring + the WM/SB family stay green on VZ
Status: ⛔
Notes
WMP = WM frame pacing (card 1 = #1247, card 2 = #1250). Not M53: M53 is the Go-app arc (#1244). ALSO IN SCOPE, and unrelated to the scheduler: tools/gate/specs/live-sched-ring.spec has a regex that cannot match the 'procs:' row since eb37fbe (M50 TS1) inserted uid=/caps= between name= and state= — that gate has been failing on main independently of this work, and it is corrected here so the regression sweep is honest.
Progress lives in COMMENTS on this issue (append a new comment; never
rewrite earlier comments). Close the issue with a final evidence comment when
the work lands or is abandoned. Filed by tools/status/new-claim.sh — the
coordination gate treats this open claim issue as ACTIVE. The landing PR
MUST say Closes #<this issue> so merge closes it.
Claim
agent/buffy/wmp3-nudge-recovered)live-sched-ringregex repair, moved to its own claim claim: Gate repair: live-sched-ring's procs assertion has been unmatchable since eb37fbe #1253)starvationwas a misdiagnosis: instrumented boots show a failing run printing 451,721smp: secondary runs=lines with the shell printing EVERY one and then proceeding into script2, and a guest that survives 120 s inside a 489,187-line staging storm with the nudge armed before dying the instant the firstduicommand arrives. The fatal event is the WMduipath, not the staging backlog. And the change IS on a branch.] The mechanism works and is measured (815 ms -> 2.5 ms), but it kills the SMP NOTEPAD boot (live-wnd5-gate2-policy,PASS 3/3onmain->FAIL 0/4) with a silent VM-level death: the host reportsVM ended before the expected transcript appeared (state=3)(VZVirtualMachine.State.error), the runner has nodidStopWithErrordelegate so VZ gives no reason, and there is NO[EXC]block even though the kernel routes sync exceptions throughreport_writer. The change is preserved as the reproduction on draft PR DRAFT / BLOCKED (#1261): WMP card 3 reschedule nudge — 815 ms -> 2.5 ms, blocked by a silent VM death on the WM dui path #1255 (branchagent/buffy/wmp3-nudge-recovered@bc89e9c, all checks green, merges cleanly), and the defect now has its own card: SMP boot dies silently under WM traffic: the extra core-0 switch is survivable, the death is not guest-side #1261. Nothing lands until SMP boot dies silently under WM traffic: the extra core-0 switch is survivable, the death is not guest-side #1261 is fixed.Notes
WMP = WM frame pacing (card 1 = #1247, card 2 = #1250). Not M53: M53 is the Go-app arc (#1244). ALSO IN SCOPE, and unrelated to the scheduler: tools/gate/specs/live-sched-ring.spec has a regex that cannot match the 'procs:' row since eb37fbe (M50 TS1) inserted uid=/caps= between name= and state= — that gate has been failing on main independently of this work, and it is corrected here so the regression sweep is honest.
Progress lives in COMMENTS on this issue (append a new comment; never
rewrite earlier comments). Close the issue with a final evidence comment when
the work lands or is abandoned. Filed by tools/status/new-claim.sh — the
coordination gate treats this open
claimissue as ACTIVE. The landing PRMUST say
Closes #<this issue>so merge closes it.