qvm: server firing event prelude
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_EVENT.md +11 -0
- docs/research/README.md +3 -0
- docs/research/qvm-server-fire-event.json +0 -0
- scripts/analyze_qvm_server_fire_event.py +30 -0
- scripts/test_qvm_server_fire_event.py +22 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -463,3 +463,6 @@ Research progress: RE-591 [report](research/QVM_FIRE_SEQUENCES.md); remaining na
|
|
| 463 |
|
| 464 |
|
| 465 |
Research progress: RE-593 [report](research/QVM_SERVER_EVENT_ROUTE.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 463 |
|
| 464 |
|
| 465 |
Research progress: RE-593 [report](research/QVM_SERVER_EVENT_ROUTE.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.
|
docs/FINDINGS.md
CHANGED
|
@@ -821,3 +821,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
|
|
| 821 |
|
| 822 |
|
| 823 |
**RE-593 — Server event queue window and firing branch routing:** 151254 consumes at most the latest two ring events using a signed old-sequence clamp; event31 routes to151634, while other recognized consumers are stopped explicitly. [Evidence](research/QVM_SERVER_EVENT_ROUTE.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 821 |
|
| 822 |
|
| 823 |
**RE-593 — Server event queue window and firing branch routing:** 151254 consumes at most the latest two ring events using a signed old-sequence clamp; event31 routes to151634, while other recognized consumers are stopped explicitly. [Evidence](research/QVM_SERVER_EVENT_ROUTE.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).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -781,3 +781,6 @@ Research progress: RE-591 [report](research/QVM_FIRE_SEQUENCES.md); remaining na
|
|
| 781 |
|
| 782 |
|
| 783 |
Research progress: RE-593 [report](research/QVM_SERVER_EVENT_ROUTE.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 781 |
|
| 782 |
|
| 783 |
Research progress: RE-593 [report](research/QVM_SERVER_EVENT_ROUTE.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.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -655,3 +655,8 @@ RE-591 additional regression:19 related reports from RE-571–580 and RE-582–5
|
|
| 655 |
## 2026-10-20 — RE-593 Server event queue window and firing branch routing (separate task commit)
|
| 656 |
|
| 657 |
151254 consumes at most the latest two ring events using a signed old-sequence clamp; event31 routes to151634, while other recognized consumers are stopped explicitly. 150 independent fixtures check old/new sequence windows, ring parity, ignored/recognized event priority, unchanged state and no fabricated child execution. Full suite: 883 tests pass. Report regenerates byte-identically (409911 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 655 |
## 2026-10-20 — RE-593 Server event queue window and firing branch routing (separate task commit)
|
| 656 |
|
| 657 |
151254 consumes at most the latest two ring events using a signed old-sequence clamp; event31 routes to151634, while other recognized consumers are stopped explicitly. 150 independent fixtures check old/new sequence windows, ring parity, ignored/recognized event priority, unchanged state and no fabricated child execution. Full suite: 883 tests pass. Report regenerates byte-identically (409911 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
| 658 |
+
|
| 659 |
+
|
| 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.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -823,3 +823,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 823 |
|
| 824 |
|
| 825 |
- [x] RE-593 Server event queue window and firing branch routing ([report](research/QVM_SERVER_EVENT_ROUTE.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 823 |
|
| 824 |
|
| 825 |
- [x] RE-593 Server event queue window and firing branch routing ([report](research/QVM_SERVER_EVENT_ROUTE.md)).
|
| 826 |
+
|
| 827 |
+
|
| 828 |
+
- [x] RE-594 Published firing event to server pre-call reset ([report](research/QVM_SERVER_FIRE_EVENT.md)).
|
docs/research/QVM_SERVER_FIRE_EVENT.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Published firing event to server pre-call reset
|
| 2 |
+
|
| 3 |
+
RE-594. Reproduce with `python3 scripts/analyze_qvm_server_fire_event.py`; check with `python3 scripts/test_qvm_server_fire_event.py`. The [machine report](qvm-server-fire-event.json) retains source identity and bounded fixtures.
|
| 4 |
+
|
| 5 |
+
Actual54855..54978 publishes31 through29913, then actual151254 routes it using the latest-two-event window. On31,151634..151654 clears client+4140 and writes client+4328=1. The next instruction sequence is CONST289235/CALL151656 with entity argument. The parent is stopped before that call, so no unexamined firing result is supplied.
|
| 6 |
+
|
| 7 |
+
36 fixtures cover three initial field pairs, parameters0/7/unsigned−1, two sequence parities and one/three publications. Queue pressure correctly starts at current−2 rather than replaying old events. Parameter values survive publication, but the reset body itself does not consume them. Those facts do not establish whether later handlers use parameters.
|
| 8 |
+
|
| 9 |
+
Next: recover289235's suppression guard/statistic and angle basis, its muzzle helper, and the entity-weapon dispatch. Numeric client fields remain unnamed pending writer/reference evidence.
|
| 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
|
@@ -382,3 +382,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 382 |
|
| 383 |
|
| 384 |
[RE-593: Server event queue window and firing branch routing](QVM_SERVER_EVENT_ROUTE.md). Reproduce with `python3 scripts/analyze_qvm_server_event_route.py`; check with `python3 scripts/test_qvm_server_event_route.py`.
|
|
|
|
|
|
|
|
|
|
|
|
| 382 |
|
| 383 |
|
| 384 |
[RE-593: Server event queue window and firing branch routing](QVM_SERVER_EVENT_ROUTE.md). Reproduce with `python3 scripts/analyze_qvm_server_event_route.py`; check with `python3 scripts/test_qvm_server_event_route.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`.
|
docs/research/qvm-server-fire-event.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_server_fire_event.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Actual outer event31 publication through server routing and pre-fire resets."""
|
| 3 |
+
import itertools
|
| 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_server_event_route import route,LOCAL
|
| 8 |
+
from analyze_qvm_fire_sequences import publish
|
| 9 |
+
from analyze_qvm_acceleration import PS,FRAME
|
| 10 |
+
from analyze_qvm import write_json
|
| 11 |
+
|
| 12 |
+
def prelude(ins,m):
|
| 13 |
+
initial=state(m);m,c,r=execute(ins,151634,151655,m,(0,0,0),LOCAL)
|
| 14 |
+
assert ins[151655]['operand']==289235 and ins[151656]['opcode']=='CALL'
|
| 15 |
+
return m,{'initial':initial,'execution':r,'pending_call':{'instruction':151656,'target':289235,'entity':ENTITY},'final':state(m)}
|
| 16 |
+
|
| 17 |
+
def bridge(ins,m,parameter=0,count=1):
|
| 18 |
+
initial=state(m);old=m[PS+108];publications=[]
|
| 19 |
+
for _ in range(count):
|
| 20 |
+
m.update({FRAME+48:0,FRAME+252:0,FRAME+256:0,FRAME+260:1,FRAME+264:parameter});m,p=publish(ins,m);publications.append({'calls':p['execution']['calls'],'queue':p['final']['queue']})
|
| 21 |
+
m,r=route(ins,m,old);p=None
|
| 22 |
+
if r['execution']['stop']==151634:m,p=prelude(ins,m)
|
| 23 |
+
return m,{'initial':initial,'parameter':parameter,'count':count,'publications':publications,'route':r,'prelude':p,'final':state(m)}
|
| 24 |
+
|
| 25 |
+
def main():
|
| 26 |
+
q,raw,h,ins=source();rows=[]
|
| 27 |
+
for fields,param,seq,count in itertools.product([(-1,-1),(0,0),(1111,5)],[0,7,0xffffffff],[0,1],[1,3]):
|
| 28 |
+
m=seed(raw,h);m.update({PS+4140:fields[0],PS+4328:fields[1],PS+108:seq});rows.append(bridge(ins,m,param,count)[1])
|
| 29 |
+
write_json(Path('docs/research/qvm-server-fire-event.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Actual54855 publication→151254 routing→151634 reset, stopped before CALL151656 to289235. Event parameter is retained in queue but not read by this prelude; no firing child/native shot executes.'})
|
| 30 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_server_fire_event.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest,copy
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_server_event_route import routing
|
| 4 |
+
class ServerFireEventTests(unittest.TestCase):
|
| 5 |
+
@classmethod
|
| 6 |
+
def setUpClass(cls):cls.r=json.loads(Path('docs/research/qvm-server-fire-event.json').read_text())
|
| 7 |
+
def test_actual_producer_ring_and_route_handoff(self):
|
| 8 |
+
self.assertEqual(len(self.r['probes']),36)
|
| 9 |
+
for p in self.r['probes']:
|
| 10 |
+
q=copy.deepcopy(p['initial']['queue'])
|
| 11 |
+
for publication in p['publications']:
|
| 12 |
+
slot=q['sequence']&1;q['events'][slot]=31;q['parameters'][slot]=p['parameter'];q['sequence']+=1;self.assertEqual(publication['queue'],q)
|
| 13 |
+
self.assertEqual(p['route']['initial']['queue'],q);self.assertEqual(p['route']['execution']['stop'],routing(p['route'])[-1]);self.assertEqual(p['route']['execution']['stop'],151634)
|
| 14 |
+
def test_exact_resets_before_pending_fire_call(self):
|
| 15 |
+
for p in self.r['probes']:
|
| 16 |
+
r=p['prelude'];self.assertEqual(r['initial'],p['route']['final']);a=copy.deepcopy(r['initial']);a.update(field4140=0,field4328=1);self.assertEqual(r['final'],a);self.assertEqual(p['final'],a)
|
| 17 |
+
def test_no_fabricated_fire_child_or_parameter_effect(self):
|
| 18 |
+
for p in self.r['probes']:self.assertEqual(p['prelude']['execution']['calls'],[]);self.assertEqual(p['prelude']['pending_call'],{'instruction':151656,'target':289235,'entity':589824})
|
| 19 |
+
def test_queue_pressure_clamp_keeps_latest_two(self):
|
| 20 |
+
for p in self.r['probes']:
|
| 21 |
+
expected=p['initial']['queue']['sequence']+max(p['count']-2,0);self.assertEqual(p['route']['cursor'],expected)
|
| 22 |
+
if __name__=='__main__':unittest.main()
|