# Game-QVM animation helpers and contact registration RE-445–447 / F-193–195. [qvm-animation-contacts.json](qvm-animation-contacts.json) retains seven complete instruction partitions,576 animation probes,30 contact probes and ten posture bridges from the verified shipped qagame. Reproduce with `python3 scripts/analyze_qvm_animation_contacts.py`; check with `python3 scripts/test_qvm_animation_contacts.py`. These are bounded synthetic instruction evaluations, following [posture recovery](QVM_POSTURE.md) and [ground classification](QVM_GROUND.md). Original executables, complete QVM, native collision and rendering do not execute. Recovered animation children are evaluated at recorded call boundaries with separate synthetic local frames. Timed-animation table addresses are computed from the instructions, but their words are supplied fixtures: neither initialized nor live table contents, selector domains, request legality or real animation playback are established. Field names describe candidate roles and remain provisional. ## ANIM-001 — Direct setters and continuation wrappers (RE-445) The helper family reads the PS pointer through global35024032 and its movement-frame pointer. PS+76/+72 are called legs/timer below, and PS+84/+80 torso/timer. Direct helper39338 rejects PS type+4 >=3 or positive torso timer. Otherwise it writes torso as `((old & 128) XOR 128) OR request`. It does not reject an identical raw request: old25/request25 becomes153 when permitted. Direct helper39383 first rejects an identical raw leg word/request, then rejects type>=3 or positive leg timer. Otherwise it applies the same toggle/OR expression to PS+76. Old25/request25 remains25; old153/request25 can become25 through this direct setter. Requests themselves are not normalized or masked: a request containing bit128 can force that bit into the result regardless of the toggled old bit. Continuation helper39439 rejects either raw leg equality or equality after clearing bit128 from the current leg word, then rejects a positive leg timer; otherwise it calls39383(request). Torso continuation helper39482 applies the matching policy to PS+84/+80 and calls39338. These wrappers do not check type themselves; the evaluated child supplies that guard. They compare the masked old word to the raw request, rather than masking both operands. Fixtures cover signed type-1/0/3, timer-1/0/1, old words25/153 and requests25/36/153/164. Negative types and timers are synthetic guard probes, not established reachable gameplay inputs. Tests independently model the raw/masked comparisons, toggle algebra, timer/type guards and nested requests. ## ANIM-002 — Forced requests, timed torso and posture composition (RE-446) Helper39525 returns immediately for raw leg equality. Otherwise it first clears PS+72, then calls39383(request). Thus a positive prior timer does not block this forced path. Type>=3 still blocks the child's animation assignment, but the parent's timer reset survives. Raw equality skips both the reset and the child. Helper39552 always clears PS+80, calls39338(request), then assigns PS+80 from this computed word address: `35018540 + frame[+248] * 2560 + request * 32 + 28` The final duration assignment occurs even if the child rejects type>=3. Timed fixtures cover types-1/0/3, old torso26/154, timers-1/0/1, requests36/164, selectors0/2 and supplied duration words-1/0/321. This recovers request/selector strides and load ordering, not the table's allocation bounds, producers, loaded animation definitions or actual durations. No generic array-domain compatibility policy should be inferred from these samples. Ten bridges take the actual helper39525 request sequence from prior posture probes, evaluate its children and then apply the caller's timer200 store. They cover ordinary/no transition, entering, standing up, blocked stand-up, initial timer suppression, early type3 and identical/toggle-bearing current animations. For example, entry from animation0 requests36 and yields164, then timer200. Entry with raw animation36 skips helper animation/reset work, but the posture caller still assigns200. Successful stand-up requests37 with the same raw-equality/toggle policy. This removes the previously omitted animation-child effects from these selected request boundaries only: other PS/frame mutations, native collision/sqrt effects and complete movement composition remain outside the bridge. The bounded evaluator now supports standard signed32 `BXOR`; existing opcode paths are unchanged. The test covers bit128 toggles and high-bit/negative operands. Separate synthetic child frames preserve parent words; source-backed child/parent local-address checks verify isolation. ## CONTACT-001 — Touch/contact list policy (RE-447) Helper39253 receives an entity word. Entity1022 returns immediately. A count at frame+52 equal32 also returns. Otherwise a signed loop scans entries starting at frame+56, each four bytes; any matching word returns without appending. A new entity is written at `frame+56+4*count`, then count increments. Thirty fixtures cover counts0/1/2/31/32, first/last matches, fresh99, -1,1022 and1023 (some input rows coincide for empty/single lists). The append branch accepts1023 and synthetic-1; no semantic validity check occurs in this helper. This does not establish that the complete runtime submits either. A33rd canary slot remains untouched, and full-list requests leave every slot/count unchanged. The equality capacity guard is specifically `==32`, not `>=32`; invalid negative/oversized counts and pointer aliases are untested and remain open. The prior ground helper records39253(trace entity), so these instructions explain that request's candidate list effect. Native contact generation, entity callbacks and subsequent list consumers are not composed here. ## Validation and next tasks Eight tests independently verify all576 animation policies/results and nested requests, direct-setter asymmetry/masked continuation, reset-before-type ordering/raw request bits, timed address arithmetic/unconditional duration store,30 contact list/canary outcomes, ten posture request/timer compositions, XOR/local-frame behavior, source hash/complete partitions and scope. Direct posture/ground/scale reports are regenerated unchanged; the new report reproduces twice byte-identically. Full-suite and storage/link/whitespace outcomes are recorded in the ledger. RE-444 remains open for native collision/resource/semantic/full-state work. RE-448 tracks animation table allocation/loading and real duration/selector/request domains, type/timer/flag producers, frame contact count reset/list consumers/entity effects, invalid-count/alias domains, complete posture/ground/list/animation/movement composition and runtime/macOS/Linux validation before Rust/Bevy/Solari compatibility claims. Packet/entity/player/snapshot/rendering milestones remain open. Follow-up: [verified animation-table recovery](QVM_ANIMATION_TABLES.md) derives actual registration selectors, source symbol names and152 duration words from both preserved player config variants, then evaluates timed-helper consumers (RE-449–451). Native preprocessing/live table writers/playback and contact consumers remain open under RE-448/452. Follow-up: [query56639 recovery](QVM_TRAVERSAL_QUERY.md) records torso requests54/55 at acquisition/clearance branches and evaluates39338 with real timer/type guards. Actual collision/clearance/playback and full state remain open under RE-464.