qvm: basic trajectory branches
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_BASIC_TRAJECTORY.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-basic-trajectory.json +0 -0
- scripts/analyze_qvm_basic_trajectory.py +30 -0
- scripts/test_qvm_basic_trajectory.py +30 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -706,3 +706,6 @@ Research progress: RE-676 [report](research/QVM_STRING_RELEASE.md); remaining na
|
|
| 706 |
|
| 707 |
|
| 708 |
Research progress: RE-677 [report](research/QVM_FREE_REALLOCATE.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 706 |
|
| 707 |
|
| 708 |
Research progress: RE-677 [report](research/QVM_FREE_REALLOCATE.md); remaining native/content/runtime/platform scope stays open.
|
| 709 |
+
|
| 710 |
+
|
| 711 |
+
Research progress: RE-678 [report](research/QVM_BASIC_TRAJECTORY.md); remaining native/content/runtime/platform scope stays open.
|
docs/FINDINGS.md
CHANGED
|
@@ -1052,3 +1052,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
|
|
| 1052 |
|
| 1053 |
|
| 1054 |
**RE-677 — Actual entity free through allocator reuse timing:** Actual277400 free-time and used state now feed277165 reuse policy; age1000 is eligible, and start+2000 can permit immediate reuse. [Evidence](research/QVM_FREE_REALLOCATE.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1052 |
|
| 1053 |
|
| 1054 |
**RE-677 — Actual entity free through allocator reuse timing:** Actual277400 free-time and used state now feed277165 reuse policy; age1000 is eligible, and start+2000 can permit immediate reuse. [Evidence](research/QVM_FREE_REALLOCATE.md).
|
| 1055 |
+
|
| 1056 |
+
|
| 1057 |
+
**RE-678 — Basic source trajectory position branches:** 27168 types0/1 copy base,2 advances linearly,3 clamps time to duration and nonnegative elapsed, and5 subtracts400×elapsed² from z. [Evidence](research/QVM_BASIC_TRAJECTORY.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1032,3 +1032,6 @@ Research progress: RE-676 [report](research/QVM_STRING_RELEASE.md); remaining na
|
|
| 1032 |
|
| 1033 |
|
| 1034 |
Research progress: RE-677 [report](research/QVM_FREE_REALLOCATE.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1032 |
|
| 1033 |
|
| 1034 |
Research progress: RE-677 [report](research/QVM_FREE_REALLOCATE.md); remaining native/content/runtime/platform scope stays open.
|
| 1035 |
+
|
| 1036 |
+
|
| 1037 |
+
Research progress: RE-678 [report](research/QVM_BASIC_TRAJECTORY.md); remaining native/content/runtime/platform scope stays open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1042,3 +1042,8 @@ Complete36038 tests each byte of packed words and returns the first NUL offset,
|
|
| 1042 |
## 2026-10-21 — RE-677 Actual entity free through allocator reuse timing (separate task commit)
|
| 1043 |
|
| 1044 |
Actual277400 free-time and used state now feed277165 reuse policy; age1000 is eligible, and start+2000 can permit immediate reuse. 16 full-record compositions independently check free/reuse/extension across protected records, start offsets and ages0/999/1000/1001. Full suite: 1169 tests pass. Report regenerates byte-identically (782381 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1042 |
## 2026-10-21 — RE-677 Actual entity free through allocator reuse timing (separate task commit)
|
| 1043 |
|
| 1044 |
Actual277400 free-time and used state now feed277165 reuse policy; age1000 is eligible, and start+2000 can permit immediate reuse. 16 full-record compositions independently check free/reuse/extension across protected records, start offsets and ages0/999/1000/1001. Full suite: 1169 tests pass. Report regenerates byte-identically (782381 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
| 1045 |
+
|
| 1046 |
+
|
| 1047 |
+
## 2026-10-21 — RE-678 Basic source trajectory position branches (separate task commit)
|
| 1048 |
+
|
| 1049 |
+
27168 types0/1 copy base,2 advances linearly,3 clamps time to duration and nonnegative elapsed, and5 subtracts400×elapsed² from z. 240 independent float32 fixtures check before/at/after timestamps, zero/nonzero duration, signed velocities and exact base/output aliasing. Full suite: 1173 tests pass. Report regenerates byte-identically (181365 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
|
@@ -1075,3 +1075,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1075 |
|
| 1076 |
|
| 1077 |
- [x] RE-677 Actual entity free through allocator reuse timing ([report](research/QVM_FREE_REALLOCATE.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1075 |
|
| 1076 |
|
| 1077 |
- [x] RE-677 Actual entity free through allocator reuse timing ([report](research/QVM_FREE_REALLOCATE.md)).
|
| 1078 |
+
|
| 1079 |
+
|
| 1080 |
+
- [x] RE-678 Basic source trajectory position branches ([report](research/QVM_BASIC_TRAJECTORY.md)).
|
docs/research/QVM_BASIC_TRAJECTORY.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Basic source trajectory position branches
|
| 2 |
+
|
| 3 |
+
RE-678. Reproduce with `python3 scripts/analyze_qvm_basic_trajectory.py`; check with `python3 scripts/test_qvm_basic_trajectory.py`. The [machine report](qvm-basic-trajectory.json) retains source identity and bounded fixtures.
|
| 4 |
+
|
| 5 |
+
Actual27169–29544 executes only reached source branches0/1/2/3/5 from the file-backed dispatch table. Types0/1 copy base;2 computes base+delta×elapsedSeconds;3 clamps upper time to start+duration and lower elapsed to0;5 uses source z−(elapsed×400)×elapsed after linear movement. Negative elapsed is retained outside type3. All output words and exact base aliases are independently checked with source-order float32 oracles. The research wrapper rejects other trajectory types explicitly rather than providing invented motion. No native, collision, bounce or original clock-domain validation occurs.
|
| 6 |
+
|
| 7 |
+
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
|
@@ -633,3 +633,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 633 |
|
| 634 |
|
| 635 |
[RE-677: Actual entity free through allocator reuse timing](QVM_FREE_REALLOCATE.md). Reproduce with `python3 scripts/analyze_qvm_free_reallocate.py`; check with `python3 scripts/test_qvm_free_reallocate.py`.
|
|
|
|
|
|
|
|
|
|
|
|
| 633 |
|
| 634 |
|
| 635 |
[RE-677: Actual entity free through allocator reuse timing](QVM_FREE_REALLOCATE.md). Reproduce with `python3 scripts/analyze_qvm_free_reallocate.py`; check with `python3 scripts/test_qvm_free_reallocate.py`.
|
| 636 |
+
|
| 637 |
+
|
| 638 |
+
[RE-678: Basic source trajectory position branches](QVM_BASIC_TRAJECTORY.md). Reproduce with `python3 scripts/analyze_qvm_basic_trajectory.py`; check with `python3 scripts/test_qvm_basic_trajectory.py`.
|
docs/research/qvm-basic-trajectory.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_basic_trajectory.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""27168 stationary/linear/linear-stop/gravity branches on finite clocks."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source,execute,constants
|
| 6 |
+
from analyze_qvm_acceleration import word
|
| 7 |
+
from analyze_qvm_slide_prefix import vec
|
| 8 |
+
from analyze_qvm import write_json
|
| 9 |
+
LOCAL=0x78700000
|
| 10 |
+
TRAJECTORY=LOCAL+4096
|
| 11 |
+
OUTPUT=TRAJECTORY+256
|
| 12 |
+
SUPPORTED={0,1,2,3,5}
|
| 13 |
+
|
| 14 |
+
def trajectory(ins,m,args):
|
| 15 |
+
m=dict(m);pointer=args[8];kind=m[pointer]
|
| 16 |
+
if kind not in SUPPORTED:raise ValueError('unrecovered trajectory type')
|
| 17 |
+
before={'kind':kind,'start':m[pointer+4],'duration':m[pointer+8],'base':vec(m,pointer+12),'delta':vec(m,pointer+24)}
|
| 18 |
+
for o,v in args.items():m[LOCAL+340+o]=v
|
| 19 |
+
m,_,e=execute(ins,27169,29545,m,(0,0,0),LOCAL)
|
| 20 |
+
return m,{'arguments':args,'initial':before,'output':vec(m,args[16]),'execution':e}
|
| 21 |
+
|
| 22 |
+
def main():
|
| 23 |
+
q,raw,h,ins=source();table=constants(raw,h,range(20464,20512,4));rows=[]
|
| 24 |
+
for kind,duration,offset,velocity,alias in itertools.product(sorted(SUPPORTED),[0,1000],[-1000,-1,0,500,1000,1500],[(3,-4,12),(-.5,1.25,-2)],[False,True]):
|
| 25 |
+
m=dict(table);m.update({TRAJECTORY:kind,TRAJECTORY+4:5000,TRAJECTORY+8:duration})
|
| 26 |
+
for base,values in [(12,(10,20,30)),(24,velocity)]:
|
| 27 |
+
for j,v in enumerate(values):m[TRAJECTORY+base+4*j]=word(v)
|
| 28 |
+
rows.append(trajectory(ins,m,{8:TRAJECTORY,12:5000+offset,16:TRAJECTORY+12 if alias else OUTPUT})[1])
|
| 29 |
+
write_json(Path('docs/research/qvm-basic-trajectory.json'),{'source':q['source'],'sha256':q['sha256'],'dispatch':{str(j):table[20464+4*j] for j in range(12)},'supported_types':sorted(SUPPORTED),'probes':rows,'limits':'Actual27168 reached branches0/1/2/3/5 only. Other types reject in the research wrapper and remain unrecovered. Explicit finite clocks/descriptors, no native/world collision or original domain parity.'})
|
| 30 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_basic_trajectory.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_ground import word,n,f
|
| 4 |
+
|
| 5 |
+
def expected(p):
|
| 6 |
+
a=p['initial'];kind=a['kind'];now=p['arguments']['12']
|
| 7 |
+
if kind in [0,1]:return a['base']
|
| 8 |
+
if kind==3:now=min(now,a['start']+a['duration'])
|
| 9 |
+
t=f(f(float(now-a['start']))*n(981668463))
|
| 10 |
+
if kind==3:t=max(0,t)
|
| 11 |
+
out=[f(n(x)+f(n(v)*t)) for x,v in zip(a['base'],a['delta'])]
|
| 12 |
+
if kind==5:out[2]=f(out[2]-f(f(t*n(1137180672))*t))
|
| 13 |
+
return list(map(word,out))
|
| 14 |
+
class BasicTrajectoryTests(unittest.TestCase):
|
| 15 |
+
@classmethod
|
| 16 |
+
def setUpClass(cls):cls.r=json.loads(Path('docs/research/qvm-basic-trajectory.json').read_text())
|
| 17 |
+
def test_independent_all_supported_position_branches(self):
|
| 18 |
+
self.assertEqual(len(self.r['probes']),240)
|
| 19 |
+
for p in self.r['probes']:self.assertEqual(p['output'],expected(p))
|
| 20 |
+
def test_exact_base_alias_matches_distinct_output(self):
|
| 21 |
+
rows=self.r['probes']
|
| 22 |
+
for a,b in zip(rows[::2],rows[1::2]):self.assertEqual(a['output'],b['output'])
|
| 23 |
+
def test_no_native_calls_and_preserved_dispatch(self):
|
| 24 |
+
self.assertEqual(self.r['supported_types'],[0,1,2,3,5]);self.assertEqual([self.r['dispatch'][str(j)] for j in [0,1,2,3,5]],[27190,27190,27199,27385,27632])
|
| 25 |
+
for p in self.r['probes']:self.assertEqual(p['execution']['calls'],[])
|
| 26 |
+
def test_unsupported_branch_not_fabricated(self):
|
| 27 |
+
from qvm_research_support import source
|
| 28 |
+
from analyze_qvm_basic_trajectory import trajectory,TRAJECTORY
|
| 29 |
+
with self.assertRaisesRegex(ValueError,'unrecovered'):trajectory(source()[3],{TRAJECTORY:4},{8:TRAJECTORY,12:5000,16:TRAJECTORY+12})
|
| 30 |
+
if __name__=='__main__':unittest.main()
|