Download docs/research/QVM_HISTORY_PELLET_BATCH.md from nmarshall/urt-rs: direct link, hf CLI and curl.
- Browser
- Download file 7.98 kB
-
https://huggingface.co/nmarshall/urt-rs/resolve/main/docs/research/QVM_HISTORY_PELLET_BATCH.md
- Command line
-
hf download hf://nmarshall/urt-rs/docs/research/QVM_HISTORY_PELLET_BATCH.md
-
curl -L -o QVM_HISTORY_PELLET_BATCH.md https://huggingface.co/nmarshall/urt-rs/resolve/main/docs/research/QVM_HISTORY_PELLET_BATCH.md
Rewind histories and complete supplied-world shots: RE-637–646
Ten separately checked tasks extend the trace and rewind-state batch. Complete history rewind and restoration now execute through the player selectors and trace routine. The direct event57 firing path also reaches its void caller boundary after all twenty supplied-world pellets and actual no-target bookkeeping. Native collision and successful player-hit behavior remain unverified.
| Task | Recovered scope | Evidence |
|---|---|---|
| RE-637 | History bracketing, equality and fallback weights | Selection |
| RE-638 | Exact weighted vector interpolation and input aliases | Vector interpolation |
| RE-639 | Strict half-turn angle correction and interpolation | Angle interpolation |
| RE-640 | History application: vectors, angles, animation bytes and client fields | Application |
| RE-641 | Complete 143100 rewind followed by actual restoration | Whole rewind |
| RE-642 | Actual player selectors through complete rewind and restore | Selector composition |
| RE-643 | Trace routine with recovered rewind/configuration/restoration | Rewound trace |
| RE-644 | All twenty pellet iterations, signed seed carry and no-target handoff | Pellet loop |
| RE-645 | Statistic category maps and complete no-target bookkeeping | Statistics |
| RE-646 | Allocated event57 through twenty world traces, statistics and caller continuation | Event57 composition |
Findings for the rewrite
History selection examines entries 1 through 19 in the supplied 20-entry table, using an 80-byte stride and timestamp offset 68. It picks the first timestamp at or below the target; it does not sort the table. Exhaustion leaves both indices at zero but can still produce an unclamped fallback weight from timestamps zero and one. Equal timestamps have explicit source fallbacks. The producer and intended ordering of live history records remain to be recovered.
The vector helper calculates (1 - fraction) * a + fraction * b in source f32 order. A conventional subtract-then-add lerp can produce different bits. Exact output aliases to either input vector are tested; partial overlaps remain open. The angle helper applies strict greater-than-180 and less-than-minus-180 corrections by a single turn, then interpolates without normalizing the result or weight. Large arbitrary angle differences are not fully reduced modulo 360.
History application blends position, velocity and angles, then copies animation bytes and six client fields directly from the lower numerical index. Those discrete fields do not interpolate. Whole 143100 now preserves the complete snapshot, selection and application sequence, then requests a native link. Actual restoration returns the original entity/client fields with the expected loss of animation high bits in the byte snapshot.
The fixed player selectors now execute complete rewind children rather than captured requests. Tests verify full selected records and unchanged unselected pool records. Trace composition dispatches recovered rewind, configured player_bb construction and restoration around explicitly supplied native trace records. World and skipped-target paths reach source return zero after cleanup; a model-hit path still suspends before helper 144766. A pending hit path does not pretend cleanup or a return occurred.
The twenty-pellet analysis follows the actual loop and its index progression, rotates by 18 degrees per iteration, carries the signed argument-local seed and checks every endpoint independently. Global RNG remains unchanged during pellet processing. Supplied world traces return zero from the recovered trace routine, leaving all four aggregate target IDs at 1023 and reaching no-target bookkeeping. These fixtures do not exercise successful model/contact/damage branches.
Bookkeeping maps weapon and location categories through initialized jump tables. With no target, it increments the mapped row's attempt and miss counters and computes the stored percentage in source f32 order. If the attempt counter wraps to zero, the source resets the percentage rather than dividing. Invalid weapon categories and attacker minus one have explicit early exits. Victim/team/hit updates remain separate source branches.
The direct 285840 event57 composition now executes source allocation/initialization, temporary event creation, 4096-scale direction truncation, global RNG, the complete twenty-world-pellet path, no-target bookkeeping and the caller continuation to its void epilogue. Statistics update once for the whole no-target shot. The argument-local seed carries independently of the event's stored seed and global RNG. Zero direction stops before projection division and does not resume the caller or update statistics.
Validation and limits
The 1023-test baseline gains 36 checks, ending at 1059 tests. Independent f32, geometry, full-record, byte-packing, table-mapping, call-order and complete composition oracles check the recovered paths. All task reports regenerate deterministically and stay below 2 MiB. Storage/filter, documentation-link and whitespace checks pass. No original assets, Rust runtime or shared VM evaluator change in this batch.
Player histories, target times, candidate lists, attacker/client bindings and native collision responses are explicit finite fixtures. Native link, unlink and entity-registration requests are captured without engine effects; native math uses the previously stated finite models. Original history population, legal live input domains, native library bit parity and world collision remain unverified. No original executable/full VM, successful model hit, contact/damage, complete live server tick, networking/rendering or macOS/Linux Bevy/Solari gameplay runs here.
Next ten concrete tasks
- Recover the producer of the 20-entry history table: insertion/update timing, record ordering, timestamp origin, packing and connection/reset behavior. Validate the time forwarded from the shooter against that producer.
- Partition model-hit helper 144766 and recover its first native/copy/math and model-state contracts, preserving unresolved asset/model identity references.
- Recover the helper's actual hit classification and output record fields through reached consumers, without supplying a successful player hit as a shortcut.
- Continue shared handler 293732 through an actual trace return into contact 292545 and bookkeeping 279820. Preserve source caller pointers, flags and all asset/event references.
- Recover 295018's nonzero trace-return branches, contact conditions and four-target/fifteen-slot aggregation. Existing twenty-world-pellet fixtures only cover the zero-return/no-target branch.
- Recover victim/team/hit statistic updates, including helper 33715 and percentage/damage accumulation. Compare exact counters against complete no-target behavior.
- Recover reached damage 211239 and the tagged trace branch's event64/normal encoding and penetration/retry behavior. Retain actual allocation and explicit native boundaries.
- Recover
player_bbexpiry callback 277400 and entity free/reset behavior, then connect allocator timing/capacity evidence to real lifecycle transitions. - Continue query 276433, base construction after allocation and grenade 223156 trajectory/contact/bounce/explosion paths as bounded source stages with independent contracts.
- Capture original executable/native/DLL reference traces and implement one verified Rust gameplay slice. Continue all map/model/texture/shader/audio/network findings and macOS/Linux Bevy/Solari rendering/runtime work; these bounded QVM compositions do not complete the game.