qvm: recover recent record awards
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_RECENT_AWARDS.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-recent-awards.json +0 -0
- scripts/analyze_qvm_recent_awards.py +16 -0
- scripts/qvm_recent_award_support.py +26 -0
- scripts/test_qvm_recent_awards.py +29 -0
- xtask/checks.tsv +3 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -940,3 +940,6 @@ Research progress: RE-759 [report](research/QVM_STAT_RATIOS.md); original assets
|
|
| 940 |
|
| 941 |
|
| 942 |
Research progress: RE-760 [report](research/QVM_TEAM_COUNTERS.md); original assets unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
| 940 |
|
| 941 |
|
| 942 |
Research progress: RE-760 [report](research/QVM_TEAM_COUNTERS.md); original assets unchanged.
|
| 943 |
+
|
| 944 |
+
|
| 945 |
+
Research progress: RE-761 [report](research/QVM_RECENT_AWARDS.md); original assets unchanged.
|
docs/FINDINGS.md
CHANGED
|
@@ -1286,3 +1286,6 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 1286 |
|
| 1287 |
|
| 1288 |
**RE-760 — Complete same team aggregate counters and participant gates:** 279720 increments first-client2444 and second-client2516 only for distinct same-team clients in supported modes. [Evidence](research/QVM_TEAM_COUNTERS.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1286 |
|
| 1287 |
|
| 1288 |
**RE-760 — Complete same team aggregate counters and participant gates:** 279720 increments first-client2444 and second-client2516 only for distinct same-team clients in supported modes. [Evidence](research/QVM_TEAM_COUNTERS.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).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1281,3 +1281,6 @@ Research progress: RE-759 [report](research/QVM_STAT_RATIOS.md); full native/pla
|
|
| 1281 |
|
| 1282 |
|
| 1283 |
Research progress: RE-760 [report](research/QVM_TEAM_COUNTERS.md); full native/platform/game scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1281 |
|
| 1282 |
|
| 1283 |
Research progress: RE-760 [report](research/QVM_TEAM_COUNTERS.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.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1454,3 +1454,8 @@ Exactly ten task commits follow baseline `ae4d61e7`. Each task passed focused `c
|
|
| 1454 |
## 2026-10-21 — RE-760 Complete same team aggregate counters and participant gates
|
| 1455 |
|
| 1456 |
279720 increments first-client2444 and second-client2516 only for distinct same-team clients in supported modes. Focused `cargo xtask test-group team-counters` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 77671 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1454 |
## 2026-10-21 — RE-760 Complete same team aggregate counters and participant gates
|
| 1455 |
|
| 1456 |
279720 increments first-client2444 and second-client2516 only for distinct same-team clients in supported modes. Focused `cargo xtask test-group team-counters` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 77671 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
| 1457 |
+
|
| 1458 |
+
|
| 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.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -1324,3 +1324,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1324 |
|
| 1325 |
|
| 1326 |
- [x] RE-760 Complete same team aggregate counters and participant gates ([report](research/QVM_TEAM_COUNTERS.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1324 |
|
| 1325 |
|
| 1326 |
- [x] RE-760 Complete same team aggregate counters and participant gates ([report](research/QVM_TEAM_COUNTERS.md)).
|
| 1327 |
+
|
| 1328 |
+
|
| 1329 |
+
- [x] RE-761 Complete recent record awards timestamp gates and index64 alias ([report](research/QVM_RECENT_AWARDS.md)).
|
docs/research/QVM_RECENT_AWARDS.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Complete recent record awards timestamp gates and index64 alias
|
| 2 |
+
|
| 3 |
+
RE-761. Reproduce with `python3 scripts/analyze_qvm_recent_awards.py`; validate with `cargo xtask test-group recent-awards`. See the [machine report](qvm-recent-awards.json).
|
| 4 |
+
|
| 5 |
+
Recovered complete285227 with actual33715 across68 fixtures, including equality boundaries, future timestamps, signed clock wrap, null offender client and wrapping awards. Original source accepts index64, where pair count and award counter are the same3032 word. No nonnegative age gate is invented. Logging7259 and live matrix/offender ownership remain unresolved.
|
| 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
|
@@ -876,3 +876,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 876 |
|
| 877 |
|
| 878 |
[RE-760: Complete same team aggregate counters and participant gates](QVM_TEAM_COUNTERS.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 876 |
|
| 877 |
|
| 878 |
[RE-760: Complete same team aggregate counters and participant gates](QVM_TEAM_COUNTERS.md).
|
| 879 |
+
|
| 880 |
+
|
| 881 |
+
[RE-761: Complete recent record awards timestamp gates and index64 alias](QVM_RECENT_AWARDS.md).
|
docs/research/qvm-recent-awards.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_recent_awards.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Complete recent-record award gates with source index64 aliasing."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source
|
| 6 |
+
from qvm_recent_award_support import seed,award
|
| 7 |
+
from analyze_qvm import write_json
|
| 8 |
+
|
| 9 |
+
def main():
|
| 10 |
+
q,raw,h,ins=source();rows=[]
|
| 11 |
+
cases=[dict(mode=m,index=i,count=c,age=t) for m,i,c,t in itertools.product([3,9,10,11],[-1,1,64,65],[39,40],[30000,30001])]
|
| 12 |
+
cases += [dict(index=1,count=40,age=-1,initial=0xffffffff),dict(index=1,actor_client=False),dict(index=1,count=0xffffffff),dict(index=1,now=-2147483648,age=30000)]
|
| 13 |
+
for a in cases:
|
| 14 |
+
_,_,p=award(ins,seed(**a),{8:a['index'],12:2});p['input']=a;rows.append(p)
|
| 15 |
+
write_json(Path('docs/research/qvm-recent-awards.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Complete285227 with actual33715 across68 finite mode/index/count/time/client fixtures. Logs7259 captured. Source index64 aliases pair-count and award word3032; lifetime ownership, invalid offender IDs and original runtime parity remain open.'})
|
| 16 |
+
if __name__=='__main__':main()
|
scripts/qvm_recent_award_support.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""285227 finite cross-client award record and timestamp contracts."""
|
| 2 |
+
from qvm_health_effects_support import H
|
| 3 |
+
from qvm_notification_support import POOL
|
| 4 |
+
from qvm_record_clear_support import RPOOL
|
| 5 |
+
from qvm_trace_support import resume,captured
|
| 6 |
+
from qvm_contact_support import predicate
|
| 7 |
+
A=H+0x160000
|
| 8 |
+
SLOTS=[0,1,2,3,64]
|
| 9 |
+
|
| 10 |
+
def seed(**a):
|
| 11 |
+
index=a.get('index',1);key=index if 0<=index<=64 else 0;now=a.get('now',40000);m={34090788:a.get('mode',10),34992532:now}
|
| 12 |
+
for j in range(65):
|
| 13 |
+
c=RPOOL+j*6336 if j in SLOTS and not(j==2 and not a.get('actor_client',True)) else 0;m[POOL+880*j+520]=c;m[POOL+880*j+168]=j
|
| 14 |
+
if c:m.update({c+3096:1 if j in [1,64] else 2,c+3032:a.get('initial',7),c+2520+8*key:a.get('count',40),c+2524+8*key:(now-a.get('age',30000))&0xffffffff})
|
| 15 |
+
return m
|
| 16 |
+
|
| 17 |
+
def snapshot(m,index):
|
| 18 |
+
key=index if 0<=index<=64 else 0;rows=[]
|
| 19 |
+
for j in SLOTS:
|
| 20 |
+
c=m[POOL+880*j+520]
|
| 21 |
+
rows.append({'slot':j,'present':bool(c),'team':m[c+3096] if c else None,'awards':m[c+3032]&0xffffffff if c else None,'count':m[c+2520+8*key]&0xffffffff if c else None,'when':m[c+2524+8*key]&0xffffffff if c else None})
|
| 22 |
+
return rows
|
| 23 |
+
|
| 24 |
+
def award(ins,m,args):
|
| 25 |
+
m[A+112]=args[8];m[A+116]=args[12];before=snapshot(m,args[8]);requests=[];m,e=resume(ins,285228,285484,m,A,handlers={33715:predicate,7259:captured(7259,requests)})
|
| 26 |
+
return m,0,{'arguments':args,'initial':before,'final':snapshot(m,args[8]),'requests':requests,'execution':e}
|
scripts/test_qvm_recent_awards.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_stat_totals import signed
|
| 4 |
+
|
| 5 |
+
def awarded(p):
|
| 6 |
+
a=p['input'];mode=a.get('mode',10);i=a['index'];now=a.get('now',40000);rows={r['slot']:r for r in p['initial']};out=[]
|
| 7 |
+
if not(0<=i<=64 and mode>=3 and mode not in [9,11] and rows[i]['present']):return out
|
| 8 |
+
for j,r in rows.items():
|
| 9 |
+
if j>=64 or not r['present'] or j==2 or r['team']==rows[i]['team']:continue
|
| 10 |
+
if signed(r['count'])<40 or signed(now-r['when'])>30000 or not rows[2]['present']:continue
|
| 11 |
+
out.append(j)
|
| 12 |
+
return out
|
| 13 |
+
class RecentAwardTests(unittest.TestCase):
|
| 14 |
+
@classmethod
|
| 15 |
+
def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-recent-awards.json').read_text())['probes']
|
| 16 |
+
def test_independent_awards_and_aliasing(self):
|
| 17 |
+
for p in self.ps:
|
| 18 |
+
ids=awarded(p);r=[dict(row) for row in p['initial']]
|
| 19 |
+
for row in r:
|
| 20 |
+
if row['slot'] in ids:row['awards']=(row['awards']+1)&0xffffffff
|
| 21 |
+
if p['input']['index']==64 and row['slot'] in ids:row['count']=row['awards']
|
| 22 |
+
self.assertEqual(p['final'],r,p['input']);self.assertEqual(len(p['requests']),len(ids))
|
| 23 |
+
def test_log_identifiers_and_exact_exit(self):
|
| 24 |
+
for p in self.ps:
|
| 25 |
+
for c,j in zip(p['requests'],awarded(p)):self.assertEqual(c['target'],7259);self.assertEqual({k:c['arguments'][k] for k in ['8','12','16','20']},{'8':95461,'12':j,'16':2,'20':p['input']['index']})
|
| 26 |
+
self.assertEqual(p['execution']['stop'],285484)
|
| 27 |
+
def test_threshold_wrap_and_index64_domains(self):
|
| 28 |
+
self.assertEqual(len(self.ps),68);self.assertTrue(any(p['input']['index']==64 and p['requests'] for p in self.ps));self.assertTrue(any(p['input'].get('initial')==0xffffffff and p['requests'] for p in self.ps))
|
| 29 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -1281,3 +1281,6 @@ group stat-ratios scripts/analyze_qvm_stat_ratios.py
|
|
| 1281 |
report scripts/analyze_qvm_team_counters.py docs/research/qvm-team-counters.json
|
| 1282 |
edge docs/research/qvm-team-counters.json scripts/test_qvm_team_counters.py
|
| 1283 |
group team-counters scripts/analyze_qvm_team_counters.py
|
|
|
|
|
|
|
|
|
|
|
|
| 1281 |
report scripts/analyze_qvm_team_counters.py docs/research/qvm-team-counters.json
|
| 1282 |
edge docs/research/qvm-team-counters.json scripts/test_qvm_team_counters.py
|
| 1283 |
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
|