qvm: recover single recipient payload
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_RECIPIENT_SINGLE.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-recipient-single.json +0 -0
- scripts/analyze_qvm_recipient_single.py +17 -0
- scripts/qvm_recipient_payload_support.py +35 -0
- scripts/test_qvm_recipient_single.py +31 -0
- xtask/checks.tsv +3 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -943,3 +943,6 @@ Research progress: RE-760 [report](research/QVM_TEAM_COUNTERS.md); original asse
|
|
| 943 |
|
| 944 |
|
| 945 |
Research progress: RE-761 [report](research/QVM_RECENT_AWARDS.md); original assets unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
| 943 |
|
| 944 |
|
| 945 |
Research progress: RE-761 [report](research/QVM_RECENT_AWARDS.md); original assets unchanged.
|
| 946 |
+
|
| 947 |
+
|
| 948 |
+
Research progress: RE-762 [report](research/QVM_RECIPIENT_SINGLE.md); original assets unchanged.
|
docs/FINDINGS.md
CHANGED
|
@@ -1289,3 +1289,6 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 1289 |
|
| 1290 |
|
| 1291 |
**RE-761 — Complete recent record awards timestamp gates and index64 alias:** 285227 awards distinct enemy recipients when record count is at least40 and wrapped signed age is at most30000; index64 aliases the award word. [Evidence](research/QVM_RECENT_AWARDS.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1289 |
|
| 1290 |
|
| 1291 |
**RE-761 — Complete recent record awards timestamp gates and index64 alias:** 285227 awards distinct enemy recipients when record count is at least40 and wrapped signed age is at most30000; index64 aliases the award word. [Evidence](research/QVM_RECENT_AWARDS.md).
|
| 1292 |
+
|
| 1293 |
+
|
| 1294 |
+
**RE-762 — Single recipient numeric payload cached ping and send requests:** 179736 numeric payload preserves cached follow ping, applies entity-flag publication override, and emits source status/time/packed-field arguments. [Evidence](research/QVM_RECIPIENT_SINGLE.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1284,3 +1284,6 @@ Research progress: RE-760 [report](research/QVM_TEAM_COUNTERS.md); full native/p
|
|
| 1284 |
|
| 1285 |
|
| 1286 |
Research progress: RE-761 [report](research/QVM_RECENT_AWARDS.md); full native/platform/game scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1284 |
|
| 1285 |
|
| 1286 |
Research progress: RE-761 [report](research/QVM_RECENT_AWARDS.md); full native/platform/game scope remains open.
|
| 1287 |
+
|
| 1288 |
+
|
| 1289 |
+
Research progress: RE-762 [report](research/QVM_RECIPIENT_SINGLE.md); full native/platform/game scope remains open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1459,3 +1459,8 @@ Exactly ten task commits follow baseline `ae4d61e7`. Each task passed focused `c
|
|
| 1459 |
## 2026-10-21 — RE-761 Complete recent record awards timestamp gates and index64 alias
|
| 1460 |
|
| 1461 |
285227 awards distinct enemy recipients when record count is at least40 and wrapped signed age is at most30000; index64 aliases the award word. Focused `cargo xtask test-group recent-awards` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 238290 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1459 |
## 2026-10-21 — RE-761 Complete recent record awards timestamp gates and index64 alias
|
| 1460 |
|
| 1461 |
285227 awards distinct enemy recipients when record count is at least40 and wrapped signed age is at most30000; index64 aliases the award word. Focused `cargo xtask test-group recent-awards` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 238290 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
| 1462 |
+
|
| 1463 |
+
|
| 1464 |
+
## 2026-10-21 — RE-762 Single recipient numeric payload cached ping and send requests
|
| 1465 |
+
|
| 1466 |
+
179736 numeric payload preserves cached follow ping, applies entity-flag publication override, and emits source status/time/packed-field arguments. Focused `cargo xtask test-group recipient-single` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 417817 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -1327,3 +1327,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1327 |
|
| 1328 |
|
| 1329 |
- [x] RE-761 Complete recent record awards timestamp gates and index64 alias ([report](research/QVM_RECENT_AWARDS.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1327 |
|
| 1328 |
|
| 1329 |
- [x] RE-761 Complete recent record awards timestamp gates and index64 alias ([report](research/QVM_RECENT_AWARDS.md)).
|
| 1330 |
+
|
| 1331 |
+
|
| 1332 |
+
- [x] RE-762 Single recipient numeric payload cached ping and send requests ([report](research/QVM_RECIPIENT_SINGLE.md)).
|
docs/research/QVM_RECIPIENT_SINGLE.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Single recipient numeric payload cached ping and send requests
|
| 2 |
+
|
| 3 |
+
RE-762. Reproduce with `python3 scripts/analyze_qvm_recipient_single.py`; validate with `cargo xtask test-group recipient-single`. See the [machine report](qvm-recipient-single.json).
|
| 4 |
+
|
| 5 |
+
Recovered179740..180084 gates, cache writes and numeric formatter ABI over72 fixtures. Ping is capped only above999, negative ping survives, follow flag1024 reuses cache, and entity bit8 publishes-1 after cache handling. Status priority and class0..20 are checked independently. The initial unaligned literal-copy setup is excluded; strlen/copy/format/send effects remain supplied or captured, so serialized strings and native networking are not claimed.
|
| 6 |
+
|
| 7 |
+
No original executable/full VM/native world collision or rendering runs. Supplied callback/native responses and fixture domains remain explicit; complete macOS/Linux Rust/Bevy/Solari gameplay remains open.
|
docs/research/README.md
CHANGED
|
@@ -879,3 +879,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 879 |
|
| 880 |
|
| 881 |
[RE-761: Complete recent record awards timestamp gates and index64 alias](QVM_RECENT_AWARDS.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 879 |
|
| 880 |
|
| 881 |
[RE-761: Complete recent record awards timestamp gates and index64 alias](QVM_RECENT_AWARDS.md).
|
| 882 |
+
|
| 883 |
+
|
| 884 |
+
[RE-762: Single recipient numeric payload cached ping and send requests](QVM_RECIPIENT_SINGLE.md).
|
docs/research/qvm-recipient-single.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_recipient_single.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Single-recipient numeric score/status payload, excluding literal-copy setup."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source
|
| 6 |
+
from qvm_recipient_payload_support import seed,payload,TARGET,RECIPIENT
|
| 7 |
+
from analyze_qvm import write_json
|
| 8 |
+
|
| 9 |
+
def main():
|
| 10 |
+
q,raw,h,ins=source();rows=[]
|
| 11 |
+
cases=[dict(ping=p,connected=c,follow=int(f),pm_flags=1024 if f else 0,entity_flags=e,name_length=n) for (p,n),c,f,e in itertools.product([(-5,0),(998,1),(999,2),(1500,31)],[0,2],[False,True],[0,8])]
|
| 12 |
+
cases += [dict(health=health,protected=flags,special=special,**{'class':cl}) for health,flags,special,cl in itertools.product([0,100],[0,16384],[0,1],[-1,0,20,21])]
|
| 13 |
+
cases += [dict(null=True),dict(null_recipient=True),dict(active=0),dict(client=False),dict(recipient_active=0),dict(recipient_client=False),dict(follow=1,pm_flags=0),dict(now=-2147483648,entered=2147483647,extra_time=0,packed=0xffff00ff)]
|
| 14 |
+
for a in cases:
|
| 15 |
+
_,p=payload(ins,seed(**a),{8:0 if a.get('null') else TARGET,12:0 if a.get('null_recipient') else RECIPIENT},lengths=(a.get('name_length',0),0));p['input']=a;rows.append(p)
|
| 16 |
+
write_json(Path('docs/research/qvm-recipient-single.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'179740..180084 numeric body and gates; initial unaligned literal BLOCK_COPY excluded by start boundary. strlen lengths supplied;69338 copy/70458 format/-18 send captured. Numeric formatter arguments and ping-cache writes verified; no serialized text or networking parity.'})
|
| 17 |
+
if __name__=='__main__':main()
|
scripts/qvm_recipient_payload_support.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""179736/180087 numeric payload bodies; literal/copy/format boundaries explicit."""
|
| 2 |
+
from qvm_health_effects_support import H,TARGET,ATTACKER
|
| 3 |
+
from qvm_notification_support import POOL,CPOOL
|
| 4 |
+
from qvm_trace_support import resume,captured
|
| 5 |
+
S=H+0x170000
|
| 6 |
+
BODY=H+0x180000
|
| 7 |
+
RECIPIENT=POOL+3*880
|
| 8 |
+
FIRST=CPOOL+6336
|
| 9 |
+
SECOND=CPOOL+2*6336
|
| 10 |
+
FIELDS=[12,140,208,220,248,280,300,308,452,468,576,696,3032,3692,3740,4324,4336,6160]
|
| 11 |
+
|
| 12 |
+
def seed(**a):
|
| 13 |
+
m={34992496:CPOOL,34992532:a.get('now',121000),TARGET+520:FIRST if a.get('client',True) else 0,TARGET+532:a.get('active',1),ATTACKER+520:SECOND,ATTACKER+532:1,RECIPIENT+520:CPOOL+3*6336 if a.get('recipient_client',True) else 0,RECIPIENT+532:a.get('recipient_active',1)}
|
| 14 |
+
defaults={12:0,140:1,208:100,220:0,248:7,280:3,300:0x800001ff,308:17,452:70,468:2,576:1000,696:20,3032:4,3692:9,3740:0,4324:0,4336:60000,6160:77}
|
| 15 |
+
names={'ping':452,'connected':468,'follow':4324,'pm_flags':12,'health':208,'protected':220,'special':3740,'class':696,'cached':6160,'packed':300,'entered':576,'extra_time':4336}
|
| 16 |
+
for c,prefix,id in [(FIRST,'',1),(SECOND,'second_',2)]:
|
| 17 |
+
for o,v in defaults.items():m[c+o]=v
|
| 18 |
+
m[c+140]=id
|
| 19 |
+
for name,o in names.items():m[c+o]=a.get(prefix+name,defaults[o])
|
| 20 |
+
m[POOL+880*id+424]=a.get(prefix+'entity_flags',0)
|
| 21 |
+
if a.get('self'):m[ATTACKER+520]=FIRST
|
| 22 |
+
return m
|
| 23 |
+
|
| 24 |
+
def numeric_state(m,c):return {str(o):m[c+o]&0xffffffff for o in FIELDS}
|
| 25 |
+
|
| 26 |
+
def payload(ins,m,args,pair=False,lengths=(0,0)):
|
| 27 |
+
frame=276 if pair else 148;end=180740 if pair else 180085;start=180091 if pair else 179740
|
| 28 |
+
for o,v in args.items():m[S+frame+o]=v
|
| 29 |
+
initial=[numeric_state(m,c) for c in [FIRST,SECOND]];requests=[];name_calls=[]
|
| 30 |
+
def length(i,m,a):
|
| 31 |
+
pos=0 if a[8]==FIRST+3624 else 1;v=lengths[pos];name_calls.append({'pointer':a[8],'supplied_length':v});return m,v,{'supplied_length':v,'original_strlen_not_executed':True}
|
| 32 |
+
def formatted(i,m,a):requests.append({'target':70458,'arguments':a,'native_effect_not_executed':True});return m,BODY,{'supplied_pointer':BODY,'formatting_not_executed':True}
|
| 33 |
+
hs={36038:length,69338:captured(69338,requests),70458:formatted,-18:captured(-18,requests)}
|
| 34 |
+
m,e=resume(ins,start,end,m,S,handlers=hs)
|
| 35 |
+
return m,{'initial_clients':initial,'final_clients':[numeric_state(m,c) for c in [FIRST,SECOND]],'requests':requests,'name_calls':name_calls,'execution':e}
|
scripts/test_qvm_recipient_single.py
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,math,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_stat_totals import signed
|
| 4 |
+
from qvm_recipient_payload_support import FIRST,S,BODY
|
| 5 |
+
|
| 6 |
+
def numeric(c,entity_flags,now):
|
| 7 |
+
v=lambda o:signed(c[str(o)]);ping=min(v(452),999) if v(468)==2 else 999;cached=v(6160)
|
| 8 |
+
if v(4324) and v(12)&1024:ping=cached
|
| 9 |
+
else:cached=ping
|
| 10 |
+
if entity_flags&8:ping=-1
|
| 11 |
+
status=2 if v(3740) else 1 if v(4324) or v(208)<=0 or v(220)&16384 else 0
|
| 12 |
+
return cached,{'score':v(248),'ping':ping,'minutes':math.trunc(signed(signed(now-v(576))+v(4336))/60000),'status':status,'deaths':v(280),'field3692':v(3692),'packed_low':c['300']&255,'packed_high':v(300)>>8,'field308':v(308),'awards':v(3032),'class':v(696) if 0<=v(696)<=20 else 0}
|
| 13 |
+
KEYS=['score','ping','minutes','status','deaths','field3692','packed_low','packed_high','field308','awards','class']
|
| 14 |
+
class RecipientSingleTests(unittest.TestCase):
|
| 15 |
+
@classmethod
|
| 16 |
+
def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-recipient-single.json').read_text())['probes']
|
| 17 |
+
def test_independent_numeric_payload_and_cache(self):
|
| 18 |
+
for p in self.ps:
|
| 19 |
+
a=p['input'];active=not a.get('null') and not a.get('null_recipient') and a.get('active',1) and a.get('client',True) and a.get('recipient_active',1) and a.get('recipient_client',True);formats=[r for r in p['requests'] if r['target']==70458];self.assertEqual(len(formats),int(bool(active)))
|
| 20 |
+
expected=[dict(c) for c in p['initial_clients']]
|
| 21 |
+
if active:
|
| 22 |
+
cache,fields=numeric(expected[0],a.get('entity_flags',0),a.get('now',121000));expected[0]['6160']=cache&0xffffffff;args=formats[0]['arguments'];self.assertEqual(args['8'],79263);self.assertEqual(args['12'],1);self.assertEqual({key:args[str(16+4*j)] for j,key in enumerate(KEYS)},fields)
|
| 23 |
+
self.assertEqual(p['final_clients'],expected,a)
|
| 24 |
+
def test_copy_selection_and_send_abi(self):
|
| 25 |
+
for p in self.ps:
|
| 26 |
+
if not p['requests']:continue
|
| 27 |
+
a=p['input'];copies=[r for r in p['requests'] if r['target']==69338];self.assertEqual(copies[0]['arguments'],{'8':S+72,'12':FIRST+3624 if a.get('name_length',0)>=2 else S+112,'16':32});self.assertEqual(p['requests'][-1]['arguments'],{'8':3,'12':BODY})
|
| 28 |
+
def test_exit_and_domains(self):
|
| 29 |
+
self.assertEqual(len(self.ps),72)
|
| 30 |
+
for p in self.ps:self.assertEqual(p['execution']['stop'],180085)
|
| 31 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -1284,3 +1284,6 @@ group team-counters scripts/analyze_qvm_team_counters.py
|
|
| 1284 |
report scripts/analyze_qvm_recent_awards.py docs/research/qvm-recent-awards.json
|
| 1285 |
edge docs/research/qvm-recent-awards.json scripts/test_qvm_recent_awards.py
|
| 1286 |
group recent-awards scripts/analyze_qvm_recent_awards.py
|
|
|
|
|
|
|
|
|
|
|
|
| 1284 |
report scripts/analyze_qvm_recent_awards.py docs/research/qvm-recent-awards.json
|
| 1285 |
edge docs/research/qvm-recent-awards.json scripts/test_qvm_recent_awards.py
|
| 1286 |
group recent-awards scripts/analyze_qvm_recent_awards.py
|
| 1287 |
+
report scripts/analyze_qvm_recipient_single.py docs/research/qvm-recipient-single.json
|
| 1288 |
+
edge docs/research/qvm-recipient-single.json scripts/test_qvm_recipient_single.py
|
| 1289 |
+
group recipient-single scripts/analyze_qvm_recipient_single.py
|