qvm: freeflight movement
Browse files- docs/ASSET_PIPELINE_TODO.md +3 -0
- docs/FINDINGS.md +3 -0
- docs/PROVISIONAL_TODO.md +3 -0
- docs/RESEARCH_LEDGER.md +5 -0
- docs/REVERSE_ENGINEERING_TODO.md +3 -0
- docs/research/QVM_FREEFLIGHT.md +11 -0
- docs/research/README.md +3 -0
- docs/research/qvm-freeflight.json +0 -0
- scripts/analyze_qvm_freeflight.py +33 -0
- scripts/test_qvm_freeflight.py +23 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -370,3 +370,6 @@ Research progress: RE-557 [report](research/QVM_WALK_POLICY.md); remaining nativ
|
|
| 370 |
|
| 371 |
|
| 372 |
Research progress: RE-558 [report](research/QVM_WALKING_MODE.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 370 |
|
| 371 |
|
| 372 |
Research progress: RE-558 [report](research/QVM_WALKING_MODE.md); remaining native/content/runtime/platform scope stays open.
|
| 373 |
+
|
| 374 |
+
|
| 375 |
+
Research progress: RE-560 [report](research/QVM_FREEFLIGHT.md); remaining native/content/runtime/platform scope stays open.
|
docs/FINDINGS.md
CHANGED
|
@@ -728,3 +728,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
|
|
| 728 |
|
| 729 |
|
| 730 |
**RE-558 — Complete bounded walking wrapper and combined main handoffs:** Complete43626 routes actual entry to air/water or normal policy, clears32 and runs60091(0) only when horizontal velocity is nonzero; actual main posture/contents/ground/timer/action/query and post-ground share the resulting state. [Evidence](research/QVM_WALKING_MODE.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 728 |
|
| 729 |
|
| 730 |
**RE-558 — Complete bounded walking wrapper and combined main handoffs:** Complete43626 routes actual entry to air/water or normal policy, clears32 and runs60091(0) only when horizontal velocity is nonzero; actual main posture/contents/ground/timer/action/query and post-ground share the resulting state. [Evidence](research/QVM_WALKING_MODE.md).
|
| 731 |
+
|
| 732 |
+
|
| 733 |
+
**RE-560 — Complete bounded freeflight movement:** 42486 composes friction, command scale multiplied by1.5, a three-axis wish, normalization and coefficient8 acceleration, then integrates position only if any resulting absolute velocity component exceeds1. [Evidence](research/QVM_FREEFLIGHT.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -682,3 +682,6 @@ Research progress: RE-557 [report](research/QVM_WALK_POLICY.md); remaining nativ
|
|
| 682 |
|
| 683 |
|
| 684 |
Research progress: RE-558 [report](research/QVM_WALKING_MODE.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 682 |
|
| 683 |
|
| 684 |
Research progress: RE-558 [report](research/QVM_WALKING_MODE.md); remaining native/content/runtime/platform scope stays open.
|
| 685 |
+
|
| 686 |
+
|
| 687 |
+
Research progress: RE-560 [report](research/QVM_FREEFLIGHT.md); remaining native/content/runtime/platform scope stays open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -496,3 +496,8 @@ Complete43626 routes actual entry to air/water or normal policy, clears32 and ru
|
|
| 496 |
### Ten-task batch final regression audit
|
| 497 |
|
| 498 |
RE-549–558 each has its own code/tests/report/documentation commit. All759 tests pass; all ten direct test commands execute four tests each. Ten new reports and six prior contact/main/active/flagged/walk-entry/air reports regenerate byte-identically after final integration. New reports remain below the2MiB normal-Git cap. Completed coverage and explicit native-supplied limits are indexed in `research/QVM_MOVEMENT_BATCH.md`; RE-559 preserves remaining original-reference/native/runtime/rendering/content/platform work. No asset payloads or Rust runtime were added.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 496 |
### Ten-task batch final regression audit
|
| 497 |
|
| 498 |
RE-549–558 each has its own code/tests/report/documentation commit. All759 tests pass; all ten direct test commands execute four tests each. Ten new reports and six prior contact/main/active/flagged/walk-entry/air reports regenerate byte-identically after final integration. New reports remain below the2MiB normal-Git cap. Completed coverage and explicit native-supplied limits are indexed in `research/QVM_MOVEMENT_BATCH.md`; RE-559 preserves remaining original-reference/native/runtime/rendering/content/platform work. No asset payloads or Rust runtime were added.
|
| 499 |
+
|
| 500 |
+
|
| 501 |
+
## 2026-10-19 — RE-560 Complete bounded freeflight movement (separate task commit)
|
| 502 |
+
|
| 503 |
+
42486 composes friction, command scale multiplied by1.5, a three-axis wish, normalization and coefficient8 acceleration, then integrates position only if any resulting absolute velocity component exceeds1. 64 finite fixtures independently check friction, scaling, wish geometry, normalization, acceleration, strict integration threshold and untouched state. Full suite: 763 tests pass. Report regenerates byte-identically (453652 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -722,3 +722,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 722 |
|
| 723 |
|
| 724 |
- [x] RE-558 Complete bounded walking wrapper and combined main handoffs ([report](research/QVM_WALKING_MODE.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 722 |
|
| 723 |
|
| 724 |
- [x] RE-558 Complete bounded walking wrapper and combined main handoffs ([report](research/QVM_WALKING_MODE.md)).
|
| 725 |
+
|
| 726 |
+
|
| 727 |
+
- [x] RE-560 Complete bounded freeflight movement ([report](research/QVM_FREEFLIGHT.md)).
|
docs/research/QVM_FREEFLIGHT.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Complete bounded freeflight movement
|
| 2 |
+
|
| 3 |
+
RE-560. Reproduce with `python3 scripts/analyze_qvm_freeflight.py`; check with `python3 scripts/test_qvm_freeflight.py`. The [machine report](qvm-freeflight.json) retains source identity and bounded fixtures.
|
| 4 |
+
|
| 5 |
+
The complete42486 body is interpreted from42487 to its void epilogue42836. Actual recovered39988 friction,40397 scale and40275 acceleration run in disjoint frames; the finite native sqrt response is supplied from ordinary math rounded to float32. Unlike the collision movement consumers, this body directly adds velocity×dt to all three origin components when any component has absolute value strictly above1. At or below1 it retains origin.
|
| 6 |
+
|
| 7 |
+
Command scale is multiplied by1.5 before basis construction; forward/right contribute to all three components and signed up contributes to Z. The normalized vector and its original length feed acceleration using file-backed21200=8. Tests cover zero and signed commands, pitched and identity bases, dt0/.016 and threshold velocities. No native collision request occurs. Original dispatch legality, live view basis, invalid/nonfinite vectors, spectator/noclip semantic naming and reference parity remain open.
|
| 8 |
+
|
| 9 |
+
Next integration work: connect this recovered consumer to main dispatch with actual command/timer/environment state; reproduce movement in Rust only after reference fixtures exist.
|
| 10 |
+
|
| 11 |
+
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.
|
docs/research/README.md
CHANGED
|
@@ -283,3 +283,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 283 |
|
| 284 |
|
| 285 |
[RE-558: Complete bounded walking wrapper and combined main handoffs](QVM_WALKING_MODE.md). Reproduce with `python3 scripts/analyze_qvm_walking_mode.py`; check with `python3 scripts/test_qvm_walking_mode.py`.
|
|
|
|
|
|
|
|
|
|
|
|
| 283 |
|
| 284 |
|
| 285 |
[RE-558: Complete bounded walking wrapper and combined main handoffs](QVM_WALKING_MODE.md). Reproduce with `python3 scripts/analyze_qvm_walking_mode.py`; check with `python3 scripts/test_qvm_walking_mode.py`.
|
| 286 |
+
|
| 287 |
+
|
| 288 |
+
[RE-560: Complete bounded freeflight movement](QVM_FREEFLIGHT.md). Reproduce with `python3 scripts/analyze_qvm_freeflight.py`; check with `python3 scripts/test_qvm_freeflight.py`.
|
docs/research/qvm-freeflight.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_freeflight.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Complete bounded42486 friction, three-axis wish and direct integration."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source,memory,execute
|
| 6 |
+
from analyze_qvm_acceleration import PS,FRAME,word
|
| 7 |
+
from analyze_qvm_active_mode import command_scale,accelerate
|
| 8 |
+
from analyze_qvm_friction import friction_probe
|
| 9 |
+
from analyze_qvm_jump_entry import snapshot
|
| 10 |
+
from analyze_qvm_slide_prefix import vec
|
| 11 |
+
from analyze_qvm import write_json
|
| 12 |
+
LOCAL=0x6a000000
|
| 13 |
+
|
| 14 |
+
def freeflight(ins,m,cmd):
|
| 15 |
+
initial=snapshot(m)
|
| 16 |
+
def friction(i,m,a,c):
|
| 17 |
+
m,r=friction_probe(i,{},(0,0,0),initial_memory=m,return_memory=True);return m,c,0,r
|
| 18 |
+
def scale(i,m,a,c):
|
| 19 |
+
m,r=command_scale(i,m,c,a[8]);return m,c,r['result_scale_float_word'],r
|
| 20 |
+
def acceleration(i,m,a,c):
|
| 21 |
+
m,r=accelerate(i,m,a);return m,c,0,r
|
| 22 |
+
m,c,r=execute(ins,42487,42836,m,cmd,LOCAL,{39988:friction,40397:scale,40275:acceleration})
|
| 23 |
+
return m,{'initial':initial,'commands':list(cmd),'forward_basis':vec(m,35023892),'right_basis':vec(m,35023904),'dt':m[35023928],'constructed':vec(m,LOCAL+44),'direction':vec(m,LOCAL+20),'speed':m[LOCAL+32]&0xffffffff,'execution':r,'final':snapshot(m)}
|
| 24 |
+
|
| 25 |
+
def main():
|
| 26 |
+
q,raw,h,ins=source();rows=[]
|
| 27 |
+
for cmd,v,dt,basis in itertools.product([(0,0,0),(127,0,0),(81,1,-128),(0,0,127)],[(0,0,0),(1,-1,1),(-1.01,0,0),(10,20,-30)],[0,.016],[(1,0,0,0,1,0),(.6,0,.8,0,1,0)]):
|
| 28 |
+
m=memory(raw,h,cmd,plane=0);m[PS+220]=0;m[35023928]=word(dt)
|
| 29 |
+
for j,x in enumerate(v):m[PS+32+4*j]=word(x)
|
| 30 |
+
for j,x in enumerate(basis):m[(35023892 if j<3 else 35023904)+4*(j%3)]=word(x)
|
| 31 |
+
rows.append(freeflight(ins,m,cmd)[1])
|
| 32 |
+
write_json(Path('docs/research/qvm-freeflight.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Complete finite42486 with recovered friction/scale/acceleration and supplied finite sqrt; no collision or native movement. Dispatch legality and live basis remain unverified.'})
|
| 33 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_freeflight.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest,math
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_ground import word,n,f
|
| 4 |
+
from test_qvm_acceleration import scale_oracle,accel_oracle,s8
|
| 5 |
+
from test_qvm_friction import friction_oracle
|
| 6 |
+
class FreeflightTests(unittest.TestCase):
|
| 7 |
+
@classmethod
|
| 8 |
+
def setUpClass(cls):cls.r=json.loads(Path('docs/research/qvm-freeflight.json').read_text())
|
| 9 |
+
def test_actual_children(self):
|
| 10 |
+
self.assertEqual(len(self.r['probes']),64)
|
| 11 |
+
constants={21160:100,21208:4,21212:1,21220:5,21224:3000}
|
| 12 |
+
for p in self.r['probes']:
|
| 13 |
+
a=p['execution']['children'];self.assertEqual([x['call']['target'] for x in a],[39988,40397,-107,40275]);fr=a[0]['effect'];self.assertEqual(fr['result_velocity_float_words'],friction_oracle(fr,constants)[3]);sc=a[1]['effect'];self.assertEqual(sc['result_scale_float_word'],scale_oracle(sc));ac=a[3]['effect'];self.assertEqual(ac['result_velocity_float_words'],accel_oracle(ac,fr['result_velocity_float_words'])[3])
|
| 14 |
+
def test_three_axis_wish_and_normalization(self):
|
| 15 |
+
for p in self.r['probes']:
|
| 16 |
+
scale=f(1.5*n(p['execution']['children'][1]['effect']['result_scale_float_word']));fw,right,up=map(s8,[x&255 for x in p['commands']]);v=[f(f(f(scale*n(a))*fw)+f(f(scale*n(b))*right)) for a,b in zip(p['forward_basis'],p['right_basis'])];v[2]=f(v[2]+f(scale*up));self.assertEqual(p['constructed'],list(map(word,v)));length=f(math.sqrt(f(f(f(v[0]*v[0])+f(v[1]*v[1]))+f(v[2]*v[2]))));self.assertEqual(p['speed'],word(length));self.assertEqual(p['direction'],[word(f(x*f(1/length))) if length else word(x) for x in v])
|
| 17 |
+
def test_strict_velocity_threshold_and_direct_position(self):
|
| 18 |
+
for p in self.r['probes']:
|
| 19 |
+
v=list(map(n,p['final']['velocity']));initial=p['initial']['origin'];want=[word(f(n(o)+f(x*n(p['dt'])))) for o,x in zip(initial,v)] if any(abs(x)>1 for x in v) else initial;self.assertEqual(p['final']['origin'],want)
|
| 20 |
+
def test_other_state_and_no_collision(self):
|
| 21 |
+
for p in self.r['probes']:
|
| 22 |
+
a=dict(p['initial']);a.update(origin=p['final']['origin'],velocity=p['final']['velocity']);self.assertEqual(p['final'],a);self.assertNotIn(-25,[x['target'] for x in p['execution']['calls']])
|
| 23 |
+
if __name__=='__main__':unittest.main()
|