nmarshall commited on
Commit
728e786
·
1 Parent(s): e1f74e0

qvm: server firing basis

Browse files
docs/ASSET_PIPELINE_TODO.md CHANGED
@@ -466,3 +466,6 @@ Research progress: RE-593 [report](research/QVM_SERVER_EVENT_ROUTE.md); remainin
466
 
467
 
468
  Research progress: RE-594 [report](research/QVM_SERVER_FIRE_EVENT.md); remaining native/content/runtime/platform scope stays open.
 
 
 
 
466
 
467
 
468
  Research progress: RE-594 [report](research/QVM_SERVER_FIRE_EVENT.md); remaining native/content/runtime/platform scope stays open.
469
+
470
+
471
+ Research progress: RE-595 [report](research/QVM_SERVER_FIRE_BASIS.md); remaining native/content/runtime/platform scope stays open.
docs/FINDINGS.md CHANGED
@@ -824,3 +824,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
824
 
825
 
826
  **RE-594 — Published firing event to server pre-call reset:** Actual outer31 publication reaches server151634, which writes client4140=0 and4328=1 before pending289235(entity); this prelude does not read the queued parameter. [Evidence](research/QVM_SERVER_FIRE_EVENT.md).
 
 
 
 
824
 
825
 
826
  **RE-594 — Published firing event to server pre-call reset:** Actual outer31 publication reaches server151634, which writes client4140=0 and4328=1 before pending289235(entity); this prelude does not read the queued parameter. [Evidence](research/QVM_SERVER_FIRE_EVENT.md).
827
+
828
+
829
+ **RE-595 — Server firing suppression statistic and angle basis:** 289235 first rejects client6164!=0, otherwise increments statistic4116 unless entity weaponID1, then builds global forward/right/up from client angles using native sin/cos requests. [Evidence](research/QVM_SERVER_FIRE_BASIS.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -784,3 +784,6 @@ Research progress: RE-593 [report](research/QVM_SERVER_EVENT_ROUTE.md); remainin
784
 
785
 
786
  Research progress: RE-594 [report](research/QVM_SERVER_FIRE_EVENT.md); remaining native/content/runtime/platform scope stays open.
 
 
 
 
784
 
785
 
786
  Research progress: RE-594 [report](research/QVM_SERVER_FIRE_EVENT.md); remaining native/content/runtime/platform scope stays open.
787
+
788
+
789
+ Research progress: RE-595 [report](research/QVM_SERVER_FIRE_BASIS.md); remaining native/content/runtime/platform scope stays open.
docs/RESEARCH_LEDGER.md CHANGED
@@ -660,3 +660,8 @@ RE-591 additional regression:19 related reports from RE-571–580 and RE-582–5
660
  ## 2026-10-20 — RE-594 Published firing event to server pre-call reset (separate task commit)
661
 
662
  Actual outer31 publication reaches server151634, which writes client4140=0 and4328=1 before pending289235(entity); this prelude does not read the queued parameter. 36 producer/ring/routing/reset compositions independently check one/three publications, parity, retained parameters, exact two-field mutation and explicit pending-call boundary. Full suite: 887 tests pass. Report regenerates byte-identically (340717 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
 
 
 
 
 
 
660
  ## 2026-10-20 — RE-594 Published firing event to server pre-call reset (separate task commit)
661
 
662
  Actual outer31 publication reaches server151634, which writes client4140=0 and4328=1 before pending289235(entity); this prelude does not read the queued parameter. 36 producer/ring/routing/reset compositions independently check one/three publications, parity, retained parameters, exact two-field mutation and explicit pending-call boundary. Full suite: 887 tests pass. Report regenerates byte-identically (340717 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
663
+
664
+
665
+ ## 2026-10-20 — RE-595 Server firing suppression statistic and angle basis (separate task commit)
666
+
667
+ 289235 first rejects client6164!=0, otherwise increments statistic4116 unless entity weaponID1, then builds global forward/right/up from client angles using native sin/cos requests. 80 independent fixtures check suppression, ID0/1/22/28, statistic wrap, float32 pitch/yaw/roll basis formulas and actual six-native-call order/arguments. Full suite: 891 tests pass. Report regenerates byte-identically (335153 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
@@ -826,3 +826,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
826
 
827
 
828
  - [x] RE-594 Published firing event to server pre-call reset ([report](research/QVM_SERVER_FIRE_EVENT.md)).
 
 
 
 
826
 
827
 
828
  - [x] RE-594 Published firing event to server pre-call reset ([report](research/QVM_SERVER_FIRE_EVENT.md)).
829
+
830
+
831
+ - [x] RE-595 Server firing suppression statistic and angle basis ([report](research/QVM_SERVER_FIRE_BASIS.md)).
docs/research/QVM_SERVER_FIRE_BASIS.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Server firing suppression statistic and angle basis
2
+
3
+ RE-595. Reproduce with `python3 scripts/analyze_qvm_server_fire_basis.py`; check with `python3 scripts/test_qvm_server_fire_basis.py`. The [machine report](qvm-server-fire-basis.json) retains source identity and bounded fixtures.
4
+
5
+ 289236..289484 executes before muzzle generation. Nonzero client6164 exits289592 before statistic/trig effects. Otherwise entity+192 unequal1 increments client4116 using32-bit arithmetic, even for an ID later rejected by dispatch. Angles client152/156/160 are multiplied by source radians factor1016003125. Native requests are yaw sin/cos, pitch sin/cos, roll sin/cos in that order.
6
+
7
+ Supplied finite ordinary-math sin/cos returns, rounded to float32, feed the actual source basis stores at36477748(forward),36477736(right),36477724(up).80 fixtures check exact operation ordering, including signed zero, rotated and fractional angles, statistic wrap and unchanged muzzle/queue. These numeric models do not prove actual platform libm bit parity.
8
+
9
+ Execution stops before288779 muzzle child at289485, or at the actual suppressed return. Next: recover muzzle origins and dispatcher table; no actual firing outcome is fabricated.
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
@@ -385,3 +385,6 @@ The extension collector adds five focused tests for native tail calls, command-r
385
 
386
 
387
  [RE-594: Published firing event to server pre-call reset](QVM_SERVER_FIRE_EVENT.md). Reproduce with `python3 scripts/analyze_qvm_server_fire_event.py`; check with `python3 scripts/test_qvm_server_fire_event.py`.
 
 
 
 
385
 
386
 
387
  [RE-594: Published firing event to server pre-call reset](QVM_SERVER_FIRE_EVENT.md). Reproduce with `python3 scripts/analyze_qvm_server_fire_event.py`; check with `python3 scripts/test_qvm_server_fire_event.py`.
388
+
389
+
390
+ [RE-595: Server firing suppression statistic and angle basis](QVM_SERVER_FIRE_BASIS.md). Reproduce with `python3 scripts/analyze_qvm_server_fire_basis.py`; check with `python3 scripts/test_qvm_server_fire_basis.py`.
docs/research/qvm-server-fire-basis.json ADDED
The diff for this file is too large to render. See raw diff
 
scripts/analyze_qvm_server_fire_basis.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """289235 pre-muzzle suppression/statistic and finite native-trig basis model."""
3
+ import itertools,math
4
+ from pathlib import Path
5
+ from qvm_research_support import source,execute
6
+ from qvm_server_fire_support import seed,state,ENTITY
7
+ from analyze_qvm_acceleration import PS,word,number
8
+ from analyze_qvm import write_json
9
+ LOCAL=0x7b000000
10
+
11
+ def basis(ins,m):
12
+ initial=state(m);m[LOCAL+88]=ENTITY
13
+ def trig(kind):
14
+ def apply(i,m,a,c):value=word((math.sin if kind=='sin' else math.cos)(number(a[8])));return m,c,value,{'model':kind,'argument':a[8]&0xffffffff,'result':value}
15
+ return apply
16
+ m,c,r=execute(ins,289236,289592,m,(0,0,0),LOCAL,{-104:trig('sin'),-105:trig('cos')},boundaries=[289485])
17
+ return m,{'initial':initial,'execution':r,'final':state(m)}
18
+
19
+ def main():
20
+ q,raw,h,ins=source();rows=[]
21
+ for angles,ident,blocked,count in itertools.product([(0,0,0),(30,60,90),(-90,180,-45),(360,-360,0),(12.3,-24.6,67.8)],[0,1,22,28],[0,1],[10,0xffffffff]):
22
+ m=seed(raw,h,ident);m.update({PS+6164:blocked,PS+4116:count})
23
+ for j,v in enumerate(angles):m[PS+152+4*j]=word(v)
24
+ rows.append(basis(ins,m)[1])
25
+ write_json(Path('docs/research/qvm-server-fire-basis.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'289236..289484 only or actual early exit289592. Sin/cos are supplied finite ordinary-math float32 responses to native−104/−105; no platform libm/reference parity or actual shot execution. Muzzle child not called.'})
26
+ if __name__=='__main__':main()
scripts/test_qvm_server_fire_basis.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json,unittest,math,copy
2
+ from pathlib import Path
3
+ from test_qvm_ground import word,n,f
4
+
5
+ def vectors(angles):
6
+ p,y,r=[f(n(v)*n(1016003125)) for v in angles];sp,sy,sr=[f(math.sin(v)) for v in [p,y,r]];cp,cy,cr=[f(math.cos(v)) for v in [p,y,r]];mul=lambda a,b:f(a*b);add=lambda a,b:f(a+b)
7
+ fw=[mul(cp,cy),mul(cp,sy),f(-sp)];right=[add(mul(mul(-sr,sp),cy),mul(-cr,-sy)),add(mul(mul(-sr,sp),sy),mul(-cr,cy)),mul(-sr,cp)];up=[add(mul(mul(cr,sp),cy),mul(-sr,-sy)),add(mul(mul(cr,sp),sy),mul(-sr,cy)),mul(cr,cp)];return [list(map(word,v)) for v in [fw,right,up]]
8
+ class ServerFireBasisTests(unittest.TestCase):
9
+ @classmethod
10
+ def setUpClass(cls):cls.r=json.loads(Path('docs/research/qvm-server-fire-basis.json').read_text())
11
+ def test_complete_guard_statistic_and_basis_state(self):
12
+ self.assertEqual(len(self.r['probes']),80)
13
+ for p in self.r['probes']:
14
+ a=copy.deepcopy(p['initial'])
15
+ if not a['blocked6164']:
16
+ if a['entity_weapon']!=1:a['stat4116']=(a['stat4116']+1)&0xffffffff
17
+ a['forward'],a['right'],a['up']=vectors(a['angles'])
18
+ self.assertEqual(p['final'],a)
19
+ def test_actual_native_order_arguments_and_response_model(self):
20
+ for p in self.r['probes']:
21
+ active=not p['initial']['blocked6164'];self.assertEqual([c['target'] for c in p['execution']['calls']],[-104,-105,-104,-105,-104,-105] if active else [])
22
+ if active:
23
+ angles=p['initial']['angles'];expected=[word(f(n(angles[j])*n(1016003125))) for j in [1,1,0,0,2,2]];self.assertEqual([c['args']['8']&0xffffffff for c in p['execution']['calls']],expected)
24
+ def test_early_return_vs_pre_muzzle_boundary(self):
25
+ for p in self.r['probes']:self.assertEqual(p['execution']['stop'],289592 if p['initial']['blocked6164'] else 289485)
26
+ def test_muzzle_not_fabricated_and_entity_id_not_slot(self):
27
+ for p in self.r['probes']:self.assertEqual(p['initial']['muzzle'],p['final']['muzzle']);self.assertEqual(p['initial']['queue'],p['final']['queue'])
28
+ if __name__=='__main__':unittest.main()