# Game-QVM step attempt, fallback wrapper and gravity-mode composition RE-469–471 / F-211–213. [qvm-step-collision.json](qvm-step-collision.json) retains complete shipped qagame helpers59710/60091,117 step probes,20 wrapper probes and14 compositions through helper41768. Reproduce with `python3 scripts/analyze_qvm_step_collision.py`; verify with `python3 scripts/test_qvm_step_collision.py`. This follows [conditional gravity-mode recovery](QVM_CLEARANCE_MODE.md), where60091 effects were supplied. The new batch evaluates its wrapper policy and step child, with disjoint synthetic local frames and shared selected PS/frame words. Helper57714's slide return, position and velocity are supplied; its other effects are omitted. Native trace records are also supplied. No original executable, full QVM, native collision, physics or rendering executes. Trace consistency/contact legality, complete slide effects, semantic/legal/exceptional/alias domains and runtime compatibility remain open. ## STEPTRACE-001 — Raised step attempt, down trace and clipping (RE-469) Helper59710 subtracts binary32 literal18 from frame upper bound+204. It copies the supplied original origin/velocity pointers back to PS+20/+32, raises origin Z by18 and requests57714(gravity argument). The wrapper passes18 as a fourth argument, but this body uses literal18 and has no LOCAL172 reference that would read that argument. This establishes this shipped helper's constant policy, not a generic configurable step-height function. The analyzer supplies the slide's return and post-slide position/velocity at that request boundary. A nonzero return sets PS+12 flag32, but does not itself prevent later success. The helper traces down18 from the post-slide origin using current bounds, callback frame+224, PS+140 and frame mask+28. In fixtures, original maxZ45 becomes27 during the slide/down trace; supplied origin(110,220,330) gives a down endpoint(110,220,312). Original position/velocity at the slide request are independently checked before the supplied replacement. A supplied nonzero allsolid **or** startsolid returns0 after adding18 back to maxZ. It does not restore origin/velocity itself. With both words zero and fraction<1, it clips velocity against the supplied normal: 1. Compute rounded dot(velocity,normal). 2. Multiply negative dot by exact word1065361605 (approximately1.00100005), otherwise by word1065336456 (approximately0.999001026). 3. Subtract each rounded normal-component×biased-dot product from the original component. Fraction>=1 bypasses clipping. No normal normalization occurs in this body. Tests cover normals along positive/negative Z and an oblique(0.6,0,0.8), including negative dot and multi-component changes. These finite fixtures do not prove normal/contact legality or native floating-point behavior. After clipping/bypass, the helper adds18 back to maxZ, copies the supplied first trace end-position into PS origin, and requests an overlap trace with **start and end both PS+20** using restored bounds. Nonzero final allsolid/startsolid returns0; otherwise it returns1. A final failure still leaves the moved origin and clipped velocity. The wrapper below performs any fallback. Only the callback fields consumed in these branches matter; no real collision or record generation is evaluated. The117 fixtures cover slide returns, both initial solid words, fractions0.5/1, normal direction, final solid/startsolid, positive/zero/negative vertical velocity, endpoint heights and gravity arguments0/1. All sampled return paths restore maxZ45 by the source addition; this is not a claim of exact reversibility for arbitrary floating bounds. ## STEPWRAP-001 — First-attempt retention, fallback and height recording (RE-470) Helper60091 saves original position/velocity and requests57714(gravity argument). With supplied zero return, it immediately returns1, retaining that supplied first-attempt state. With nonzero return, it saves the first-attempt result and requests59710(gravity, original-position pointer, original-velocity pointer,18). The actual evaluated step effects are applied before continuing the wrapper's branch. If step returns0,60091 copies back the saved **first-attempt** origin/velocity and sets flag32. It does not restore all original pre-movement state or clear flags the step path already set. A nonzero step return retains the step result, including any flag32 set by its slide return. It then computes rounded final Z minus original Z. Only a delta strictly greater than2 writes frame+48, converting that float to integer with truncation toward zero. Thus delta2 leaves the seeded field99 unchanged; delta2.75 triggers a write of2; delta3 writes3. The value99 is an untouched-field canary, not a proposed runtime initial state. The early zero-first-return path skips this height recording entirely. Field semantics and later consumers remain open. Every sampled wrapper branch returns1, including fallback. That return must not be interpreted as proof that the second movement attempt succeeded. Twenty probes check exact request arguments/pointers, disjoint saved-local frames, independent child outcomes, fallback copies/flag stores, strict height threshold and every final word. ## STEPCHAIN-001 — Evaluated60091 effects inside41768 (RE-471) Fourteen compositions execute41768's prefix, the evaluated60091/59710 policies, then41768's gravity tail against the resulting shared PS/frame state. They replace the previous arbitrary post60091 velocity/flag examples for these cases. The mode still clears32 before60091(1); underlying57714 effects and native traces remain supplied. This identifies a concrete way for32 to reappear: the evaluated step/wrapper code sets it when the second slide reports nonzero or when the wrapper takes fallback. If the later gravity tail produces negative Z, it clears64/128 and the timer while preserving32. This is no longer only a hypothetical post-callback flag edit, although the triggering slide/trace outcomes remain conditional fixtures. The composition checks first-slide bypass, early/final step failure, step-slide nonzero return and supplied step velocities0/12.8/100. The tail uses the resulting wrapper velocity with supplied gravity800 and binary32 dt0.016. Shared original-state snapshots and separate local frames preserve wrapper/child/mode live words. Other slide contact/entity/global effects, native geometry, surrounding main-loop work and later suffix are not composed. Full movement/gameplay equivalence is not established. ## Validation and next tasks Eight independent tests verify117 step returns/clip words/bounds/trace geometry and ABI requests; failure-without-rollback/fraction bypass;20 wrapper request/fallback/height results;14 wrapper-to-mode outputs and actual flag32 restoration; source hash/complete partitions/literal height policy and explicit limitations. Direct clearance-mode report regenerates unchanged; the new report reproduces twice byte-identically. Full-suite/storage/link/whitespace outcomes are recorded in the ledger. RE-468 remains open for the missing physical slide effects. RE-472 tracks helper57714's complete slide/contact/plane/gravity loop, native trace/collision ABI and legal records, frame+48 meaning/consumers, other step callers/arguments/flag producers, full mode/environment/shared-state composition and gameplay/macOS/Linux/Rust/Bevy/Solari validation. Other actions/modes/suffix, contact/resource/playback/packet/entity/player/snapshot/rendering milestones remain open. Follow-up: [slide57714 prefix recovery](QVM_SLIDE_PREFIX.md) replaces supplied first-slide results in20 clear-path wrapper/mode chains. First gravity/plane preparation, clear/allsolid exits and partial touch/contact handling are evaluated; later plane solving, repeated bumps and actual native collision remain open (RE-473–476). Follow-up: [contact-capable actual slide composition](QVM_CONTACT_CALLERS.md) completes bounded RE-493–495, replacing supplied57714 returns/vectors in selected step/wrapper/mode chains with evaluated children. This earlier report retains its original supplied-slide scope. Native collision/full main/runtime remain open.