nmarshall commited on
Commit
3655587
·
1 Parent(s): 33aafbd

qvm: firing pose dispatch

Browse files
docs/ASSET_PIPELINE_TODO.md CHANGED
@@ -442,3 +442,6 @@ Research progress: RE-584 [report](research/QVM_FIRE_AMMO.md); remaining native/
442
 
443
 
444
  Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
 
 
 
 
442
 
443
 
444
  Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
445
+
446
+
447
+ Research progress: RE-586 [report](research/QVM_FIRE_POSE.md); remaining native/content/runtime/platform scope stays open.
docs/FINDINGS.md CHANGED
@@ -800,3 +800,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
800
 
801
 
802
  **RE-585 — Firing animation priority before class dispatch:** 52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. [Evidence](research/QVM_FIRE_POSE_PRIORITY.md).
 
 
 
 
800
 
801
 
802
  **RE-585 — Firing animation priority before class dispatch:** 52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. [Evidence](research/QVM_FIRE_POSE_PRIORITY.md).
803
+
804
+
805
+ **RE-586 — Complete firing animation class tag and gait dispatch:** 52253..52729 completes firing pose selection: the class jump table combines running-leg membership with tag22/tag25 exceptions, after the recovered earlier priority routes. [Evidence](research/QVM_FIRE_POSE.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -758,3 +758,6 @@ Research progress: RE-584 [report](research/QVM_FIRE_AMMO.md); remaining native/
758
 
759
 
760
  Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
 
 
 
 
758
 
759
 
760
  Research progress: RE-585 [report](research/QVM_FIRE_POSE_PRIORITY.md); remaining native/content/runtime/platform scope stays open.
761
+
762
+
763
+ Research progress: RE-586 [report](research/QVM_FIRE_POSE.md); remaining native/content/runtime/platform scope stays open.
docs/RESEARCH_LEDGER.md CHANGED
@@ -618,3 +618,8 @@ RE-580 additional regression: all19 reports from RE-560–569 and RE-571–579 r
618
  ## 2026-10-20 — RE-585 Firing animation priority before class dispatch (separate task commit)
619
 
620
  52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. 148 probes independently check toggle-bit aliases, priority conflicts, movement-leg alternatives, positive timers, kind3 and supplied duration0/−1 effects with actual animation children. Full suite: 855 tests pass. Report regenerates byte-identically (980744 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
 
 
 
 
 
 
618
  ## 2026-10-20 — RE-585 Firing animation priority before class dispatch (separate task commit)
619
 
620
  52253..52411 prioritizes masked legs25 over weaponIDs4/24, then action buttons8192/16384; resolved routes select conditional53/64/49 or timed61/51 and skip the class continuation. 148 probes independently check toggle-bit aliases, priority conflicts, movement-leg alternatives, positive timers, kind3 and supplied duration0/−1 effects with actual animation children. Full suite: 855 tests pass. Report regenerates byte-identically (980744 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
621
+
622
+
623
+ ## 2026-10-20 — RE-586 Complete firing animation class tag and gait dispatch (separate task commit)
624
+
625
+ 52253..52729 completes firing pose selection: the class jump table combines running-leg membership with tag22/tag25 exceptions, after the recovered earlier priority routes. 112 independent probes check classes−1..8, tags22/25/99, masked running legs, weapon/button priority, exact helper kind/timer/duration effects and initialized jump targets. Full suite: 859 tests pass. Report regenerates byte-identically (827171 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
@@ -799,3 +799,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
799
 
800
 
801
  - [x] RE-585 Firing animation priority before class dispatch ([report](research/QVM_FIRE_POSE_PRIORITY.md)).
 
 
 
 
799
 
800
 
801
  - [x] RE-585 Firing animation priority before class dispatch ([report](research/QVM_FIRE_POSE_PRIORITY.md)).
802
+
803
+
804
+ - [x] RE-586 Complete firing animation class tag and gait dispatch ([report](research/QVM_FIRE_POSE.md)).
docs/research/QVM_FIRE_POSE.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Complete firing animation class tag and gait dispatch
2
+
3
+ RE-586. Reproduce with `python3 scripts/analyze_qvm_fire_pose.py`; check with `python3 scripts/test_qvm_fire_pose.py`. The [machine report](qvm-fire-pose.json) retains source identity and bounded fixtures.
4
+
5
+ After priority routes, class table21316..21344 selects timed requests. Classes0/5 and out-of-range request53;1/7 request52. Class2 chooses59 on base legs38/43/24 else47;3 chooses77 else79. Class4 chooses59/47 for tag22, otherwise60/73. Class6 chooses59/47 for tag25, otherwise60/48. Masked legs166 aliases38. All paths reach52730 after exactly one animation helper.
6
+
7
+ 112 finite fixtures combine the complete dispatch with earlier legs25, IDs4/24 and button priority. Timed durations are supplied321 with0/−1 boundaries, and actual39552/39338 or39482 helpers run in disjoint frames. Type3 and positive prior timers demonstrate helper-specific behavior. Jump targets are initialized image evidence; tag/class overrides are explicitly synthetic.
8
+
9
+ This recovers numerical animation choice, not skeleton playback or request-to-asset identity. No shot request or counter/delay/resource change has yet occurred; the next slices publish that request and compute its accounting.
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
@@ -359,3 +359,6 @@ The extension collector adds five focused tests for native tail calls, command-r
359
 
360
 
361
  [RE-585: Firing animation priority before class dispatch](QVM_FIRE_POSE_PRIORITY.md). Reproduce with `python3 scripts/analyze_qvm_fire_pose_priority.py`; check with `python3 scripts/test_qvm_fire_pose_priority.py`.
 
 
 
 
359
 
360
 
361
  [RE-585: Firing animation priority before class dispatch](QVM_FIRE_POSE_PRIORITY.md). Reproduce with `python3 scripts/analyze_qvm_fire_pose_priority.py`; check with `python3 scripts/test_qvm_fire_pose_priority.py`.
362
+
363
+
364
+ [RE-586: Complete firing animation class tag and gait dispatch](QVM_FIRE_POSE.md). Reproduce with `python3 scripts/analyze_qvm_fire_pose.py`; check with `python3 scripts/test_qvm_fire_pose.py`.
docs/research/qvm-fire-pose.json ADDED
The diff for this file is too large to render. See raw diff
 
scripts/analyze_qvm_fire_pose.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Complete52253..52729 firing animation priority/class/tag/legs dispatch."""
3
+ import itertools
4
+ from pathlib import Path
5
+ from qvm_research_support import source,constants
6
+ from qvm_firing_support import seed,segment
7
+ from analyze_qvm_animation_contacts import TABLE
8
+ from analyze_qvm_acceleration import PS,FRAME
9
+ from analyze_qvm import write_json
10
+ REQUESTS=[47,48,49,51,52,53,59,60,61,64,73,77,79]
11
+
12
+ def pose(ins,m,cmd=(0,0,0),preserve_locals=False):
13
+ durations={str(r):m[TABLE+m[FRAME+248]*2560+r*32+28] for r in REQUESTS};m,p=segment(ins,m,52253,[52730],cmd,preserve_locals);p['durations']=durations;return m,p
14
+
15
+ def main():
16
+ q,raw,h,ins=source();rows=[]
17
+ for klass,tag,legs in itertools.product(range(-1,9),[22,25,99],[38,41,166]):
18
+ m=seed(raw,h);m.update({4032+432*22:klass,4196+432*22:tag,PS+76:legs});rows.append(pose(ins,m)[1])
19
+ for ident,legs,buttons in itertools.product([1,4,24],[25,38,41],[0,8192]):
20
+ m=seed(raw,h,ident);m.update({PS+76:legs,FRAME+20:buttons});rows.append(pose(ins,m)[1])
21
+ for changes in [{PS+4:3},{PS+80:999},{TABLE+60*32+28:0},{TABLE+60*32+28:-1}]:
22
+ m=seed(raw,h);m.update({PS+76:38,4196+432*22:99});m.update(changes);rows.append(pose(ins,m)[1])
23
+ write_json(Path('docs/research/qvm-fire-pose.json'),{'source':q['source'],'sha256':q['sha256'],'jump_table':constants(raw,h,range(21316,21348,4)),'probes':rows,'limits':'Complete finite52253..52729 animation consumer with actual helpers. Class/tag overrides and animation durations supplied; request publication52730+ and native skeletal playback excluded.'})
24
+ if __name__=='__main__':main()
scripts/test_qvm_fire_pose.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json,unittest
2
+ from pathlib import Path
3
+ from test_qvm_fire_pose_priority import pose_choice,pose_apply
4
+
5
+ def full_pose_choice(p):
6
+ e,r=pose_choice(p)
7
+ if e:return e,r
8
+ run=p['initial']['legs']&~128 in [38,43,24];klass=p['config']['class'];tag=p['config']['tag']
9
+ if klass==2:r=59 if run else 47
10
+ elif klass==3:r=77 if run else 79
11
+ elif klass==4:r=(59 if tag==22 else 60) if run else (47 if tag==22 else 73)
12
+ elif klass==6:r=(59 if tag==25 else 60) if run else (47 if tag==25 else 48)
13
+ else:r={1:52,7:52}.get(klass,53)
14
+ return 39552,r
15
+ class FirePoseTests(unittest.TestCase):
16
+ @classmethod
17
+ def setUpClass(cls):cls.r=json.loads(Path('docs/research/qvm-fire-pose.json').read_text())
18
+ def test_full_exact_animation_state(self):
19
+ self.assertEqual(len(self.r['probes']),112)
20
+ for p in self.r['probes']:self.assertEqual(p['final'],pose_apply(p,full_pose_choice(p)));self.assertEqual(p['execution']['stop'],52730)
21
+ def test_actual_source_helper_and_request(self):
22
+ for p in self.r['probes']:self.assertEqual([(c['target'],c['args']['8']) for c in p['execution']['calls']],[full_pose_choice(p)])
23
+ def test_initialized_class_table(self):self.assertEqual(list(self.r['jump_table'].values()),[52455,52462,52469,52499,52529,52455,52627,52725])
24
+ def test_class_tag_and_running_leg_variants(self):
25
+ rows=self.r['probes'];self.assertTrue(any(p['config']['class']==4 and p['config']['tag']==99 and full_pose_choice(p)==(39552,73) for p in rows));self.assertTrue(any(p['config']['class']==6 and p['config']['tag']==25 and full_pose_choice(p)==(39552,59) for p in rows))
26
+ if __name__=='__main__':unittest.main()