# Movement callbacks: RE-994–1003 Semantic correction from RE-1024: historical capture tags `teleport`, `award` and `sound` for functions205260,283463 and193620 identify score update, indexed counter increment and team radio respectively. Their numeric call arguments remain evidence; the old schemas are retained for compatibility. [Corrected source evidence](QVM_EFFECT_COUNTER.md). Ten tasks recover five source/Rust contracts across **244 paired fixtures**. They extend the [movement-context batch](QVM_MOVE_CONTEXT_BATCH.md) by replacing supplied mode10 self feedback with recovered callback policies. Every task has its own focused validation and commit. This remains bounded reverse engineering; nonempty assistance search, mode8 objective mutation and actual movement54475 remain open. | Tasks | Contract | Paired fixtures | | --- | --- | ---: | | RE-994 / RE-995 | [Source meter completion](QVM_MOVE_METER.md) / [Rust completion](RUST_MOVE_METER.md) | 90 | | RE-996 / RE-997 | [Source self-recovery](QVM_MOVE_SELF_RECOVERY.md) / [Rust self-recovery](RUST_MOVE_SELF_RECOVERY.md) | 36 | | RE-998 / RE-999 | [Source assistance cleanup](QVM_MOVE_ASSIST_CLEANUP.md) / [Rust cleanup](RUST_MOVE_ASSIST_CLEANUP.md) | 28 | | RE-1000 / RE-1001 | [Source mode8 eligibility](QVM_MOVE_MODE8_ELIGIBILITY.md) / [Rust eligibility](RUST_MOVE_MODE8_ELIGIBILITY.md) | 66 | | RE-1002 / RE-1003 | [Source resolved self setup](QVM_MOVE_RESOLVED_SELF.md) / [Rust setup](RUST_MOVE_RESOLVED_SELF.md) | 24 | ## Meter completion152386 Client232 converts from a signed word to f32, adds carry6332, converts back by truncation and clamps a negative result to zero. Carry clears. A resulting meter at least32000 resets to zero, clears client220 mask16384 and client104 mask16, and selects movement-type0. Self-melt completion requests event107 and the original client-melt log. Assisted completion requests score update205260, reset6369, event108 and the original thaw log. The supplied allocated event receives entity168 and ORs mask32 into event424. Optional receiver meter mirroring occurs after completion, so a completed meter mirrors zero. The source log references receiver/client name pointers; their pointers and format bytes are checked, while formatting/native logging remain captured. Ninety cases cover negative/zero/threshold/above-threshold/large integer meters, fractional and negative carry, both completion modes and valid receiver presence. The assisted-completion path requires a receiver for its log pointer reads. Rust rejects assisted completion without one rather than fabricating null memory. Unsupported nonfinite or out-of-range conversion also rejects before mutation. Tests preserve f32 rounding before truncation, including integers beyond exact f32 precision. ## Timed self-recovery152673 The actual source body checks entity/client existence, mode10, connection2, positive signed client health208, zero follow4324 and client220 mask16384. Active progress uses staged f32 operations: `32000 / (global34062072 * 1000) * signed_word(global34992532 - client6324)` The result adds to carry6332, the clock6324 advances, and actual152386 executes in self-melt mode with no receiver. Early exits preserve carry and clock. Thirty-six cases cover each gate, positive/negative duration, negative/wrapped elapsed time, fractional carry and completion. Rust stages clock, meter and effect plans together; invalid active float domains or late conversion errors leave all state unchanged. Unused invalid duration on an admission exit is not evaluated. ## Assistance cleanup152792 The recovered prefix ends at152994, before the subsequent proximity/assistance search. Self admission matches entity/client, mode, connection, health and follow checks. Protected self mask16384 clears its own assistance mask8192, active6316 and target6320, then returns immediately. Otherwise the first loop traverses entity slots using880-byte strides and their client pointers. Active helpers lose assistance when the target client is disconnected, dead/nonpositive-health or following. Inactive helper targets are not dereferenced. Cleanup preserves unrelated flag bits. Twenty-eight cases include zero and64 scanned entries, high-bit flags, self early exits and target states. Rust represents supplied entity/client identity with typed indices and rejects invalid active targets or unsupported counts atomically. Allocation, aliasing and stale-pointer lifecycle invariants remain to be recovered. ## Mode8 eligibility153419 This contract stops at153596 before objective lookup, or154087 before the void return. Both global35000400 and35000380 must be nonzero. Signed wrapped elapsed from35000412 must strictly exceed global34080428×1000, and completion35000396 must be zero. Self must be connected/live/non-following and on the selected team. Selector35000476 exactly1 selects team2; other values select team1. The teammate scan uses client strides6336 through the supplied client-pool pointer. It excludes self. A connected/live/non-following same-team client with nonzero6164 blocks eligibility; other clients do not. The prefix performs no game-state mutation. Sixty-six cases cover timing boundaries, signed wraps, selectors0/1/2, team mismatch, self busy state, teammate bypasses and zero/64-entry pools. ## Coherent resolved self setup Twenty-four probes execute154544 through154867 with actual152792,152673,152386 and linked-overlap151954. Assistance pool count is explicitly zero, allowing the complete152792 body to return without its unresolved proximity search. The protected-self path still clears assistance before timed recovery. Source callbacks execute against the same coherent memory later used for command suppression, command snapshot, collision masks, context and vector copies. These cases compare clock/carry, meter, completion flags, movement type, assistance state, nested effect plans, ordered setup requests, command/snapshot, reciprocal links, overlap results, native context fields and raw vector copies. They include completion, fractional/time/negative/wrapped progress, admission bypasses, pause and broken links. Completion can change movement type before the linked-overlap test. Rust requires its shared flag/movement views to agree and stages the entire composition, including failures after callback effects have been planned. Nested score/recipient reset/log effects are captured; event allocation is supplied. Their actual feedback into health, origin or entity allocation is not executed. Mode8 eligibility does not establish the rest of153419. Physics54475, post-movement handling and native platform/runtime acceptance are outside these contracts. Semantic names remain tied to the documented offsets and source strings. ## Validation Every task runs its corresponding `cargo xtask test-group qvm-...` or `rust-...` before its commit. Reports regenerate twice identically. Source reports retain original QVM identity and execution traces; independent arithmetic/gate/scan expectations check results. Rust reports compare every projected source field and retain source-report SHA256. Ten additional Rust unit tests cover effect order, f32 precision, wrapped time, strict gates, input immutability, typed-index errors, shared views and atomic rollback. The dependency registry includes all five source/Rust pairs and the shared callback module/CLI. Resolved self setup also depends on the earlier movement-context module. Gameplay test-count metadata remains selected when these modules change. One full-suite run executes at the tenth-commit boundary: `cargo xtask test-full --since ad83778f`. Python uses the flake-declared Nix runtime for analysis and Git hooks. Original assets are unchanged. The single `cargo xtask test-full --since ad83778f` run at the tenth-commit boundary passed: **1,938 Python tests** across519 modules, **299 Rust tests** (assets10, gameplay259, xtask30), **121 deterministic affected report producers**, storage policy, links across **579 documentation files** and whitespace guards. Regeneration left no changes. Focused dependency-registry regression also passed. These validation notes are amended into task ten, preserving ten commits. ## Follow-up from RE-1004 The [RE-1004–1013 assistance batch](QVM_ASSISTANCE_BATCH.md) now covers nonempty complete152792, actual distance/target meter and repeated-call transitions. Mode8 objective mutation, actual nested effects and full client/physics integration remain open. The original follow-up scope was: - [ ] Recover152994..153417 assistance proximity search with multiple clients, distance helper65655, target ownership, progress34062368, events104/105 and actual152386 target feedback. - [ ] Recover153596 onward mode8 objective lookup276433, distance checks, progress6164, shared clock35000484, completion, weapon/animation and event/native effects. - [ ] Resolve score update205260, reset6369, event allocation277695, event publication278003 and actual log/userinfo/network adapters; replace captured nested feedback. - [ ] Compose mode10 callbacks with nonempty assistance pools and mode8 callbacks through actual objective transitions, then connect the full154089 timing/routing/inactivity prefix. - [ ] Recover movement54475/native trace/contents adapters and154867 onward post-movement decisions, event/linking/health feedback and timer155714. - [ ] Expand identity/aliasing/count/wrap/float domains and source-backed longer scenarios; continue assets/rendering/Bevy/Solari integration and native macOS/Linux acceptance.