# Shot body table copies and direction frame construction RE-612. Reproduce with `python3 scripts/analyze_qvm_shot_frame.py`; check with `python3 scripts/test_qvm_shot_frame.py`. The [machine report](qvm-shot-frame.json) retains source identity and bounded fixtures. Actual295019–295494 retains initialized table provenance (32856→local956,12bytes;32868→696,240;33108→432,240;33348→936,16) and nine zeroed counters. Actual31691 searches16 slots for entity weaponID. The input direction is normalized with supplied f32 sqrt. Strict smaller-absolute-component tests choose a coordinate axis, so ties retain the earliest axis. Projection uses the literal squared reciprocal of the normalized vector squared length, then normalizes the perpendicular and computes direction×perpendicular. Tests retain this operation order rather than substituting a generic orthonormal-basis utility. Zero input takes the source zero-normal branch but would divide by zero during projection; the harness stops before that operation and makes no legal-domain or recovery claim. The nonzero path stops before295495 muzzle preparation, native trig, per-shot seed perturbation, traces and damage. No original executable/full QVM/native collision/physics/rendering executes. Native responses and legal input domains are supplied or unverified where stated; full runtime/macOS/Linux Rust/Bevy/Solari gameplay remains open.