nmarshall commited on
Commit
5b2e2cd
·
1 Parent(s): 50ed27d

qvm: recover single recipient payload

Browse files
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