nmarshall commited on
Commit
29279fd
·
1 Parent(s): db252c6

qvm: basic trajectory branches

Browse files
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()