Skip to content

claim: WMP card 3: serve a wake by pulling the comparator forward, not by waiting for the 1 Hz tick #1252

Description

@drawmeanelephant

Claim

  • Owner: buffy (agent/buffy/wmp3-nudge-recovered)
  • 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.
  • Touches: — (the only landed artifact, the live-sched-ring regex repair, moved to its own claim claim: Gate repair: live-sched-ring's procs assertion has been unmatchable since eb37fbe #1253)
  • Depends on:
  • 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    claimClaimed work (AGENTS.md): open = active; progress in comments; close when done

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions