qvm: server firing basis
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_SERVER_FIRE_BASIS.md +11 -0
- docs/research/README.md +3 -0
- docs/research/qvm-server-fire-basis.json +0 -0
- scripts/analyze_qvm_server_fire_basis.py +26 -0
- scripts/test_qvm_server_fire_basis.py +28 -0
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()
|