arm
Arm runs ON the lane thread (from beginFrame/endFrame), which is what lets it hand the watchdog the thread to photograph. disarm deliberately does NOT clear the capture — a report may render after the frame ends, and a stale one can only ever attach to a real later timeout, which arms (and so clears) first.
cancel(false) cannot stop a body that already started, so the generation is what retires one instead. The body reads its victim FIRST and checks the generation SECOND: one that still matches proves the victim just read was published by THIS frame. Swap the two and a step from a later frame can be killed.
That read and the kill write hold GuardState's monitor, which enterStep takes too: the id armed is the one on the lane's stack right then, and a step that registers afterwards arms itself. The stack walk stays OUTSIDE — it is the slow half, needing a safepoint that can outlast the step it caught, so a shot the victim no longer matches is dropped rather than reported against them.