qvm: recover cross-client clearing
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_CROSS_CLIENT_CLEAR.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-cross-client-clear.json +0 -0
- scripts/analyze_qvm_cross_client_clear.py +15 -0
- scripts/qvm_record_clear_support.py +21 -0
- scripts/test_qvm_cross_client_clear.py +19 -0
- xtask/checks.tsv +3 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -913,3 +913,6 @@ Research progress: RE-749 [report](research/QVM_METHOD_STAT_SLOTS.md); original
|
|
| 913 |
|
| 914 |
|
| 915 |
Research progress: RE-750 [report](research/QVM_METHOD_STAT_UPDATES.md); original assets unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
| 913 |
|
| 914 |
|
| 915 |
Research progress: RE-750 [report](research/QVM_METHOD_STAT_UPDATES.md); original assets unchanged.
|
| 916 |
+
|
| 917 |
+
|
| 918 |
+
Research progress: RE-751 [report](research/QVM_CROSS_CLIENT_CLEAR.md); original assets unchanged.
|
docs/FINDINGS.md
CHANGED
|
@@ -1259,3 +1259,6 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 1259 |
|
| 1260 |
|
| 1261 |
**RE-750 — Complete method counter mutation aliases and notifications:** 278834 updates per-method or fallback counters with wrapping increments, distinct self cases, and ordered aggregate/report requests. [Evidence](research/QVM_METHOD_STAT_UPDATES.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1259 |
|
| 1260 |
|
| 1261 |
**RE-750 — Complete method counter mutation aliases and notifications:** 278834 updates per-method or fallback counters with wrapping increments, distinct self cases, and ordered aggregate/report requests. [Evidence](research/QVM_METHOD_STAT_UPDATES.md).
|
| 1262 |
+
|
| 1263 |
+
|
| 1264 |
+
**RE-751 — Complete cross client record clearing and inclusive index64:** 285486 clears two words across nonnull client records in64 entity slots; its source gate accepts index64 inclusively. [Evidence](research/QVM_CROSS_CLIENT_CLEAR.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1251,3 +1251,6 @@ Research progress: RE-749 [report](research/QVM_METHOD_STAT_SLOTS.md); full nati
|
|
| 1251 |
|
| 1252 |
|
| 1253 |
Research progress: RE-750 [report](research/QVM_METHOD_STAT_UPDATES.md); full native/platform/game scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1251 |
|
| 1252 |
|
| 1253 |
Research progress: RE-750 [report](research/QVM_METHOD_STAT_UPDATES.md); full native/platform/game scope remains open.
|
| 1254 |
+
|
| 1255 |
+
|
| 1256 |
+
Research progress: RE-751 [report](research/QVM_CROSS_CLIENT_CLEAR.md); full native/platform/game scope remains open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1400,3 +1400,8 @@ Exactly ten task commits follow baseline `e1f7eb5a`. Each task passed focused `c
|
|
| 1400 |
## 2026-10-21 — RE-750 Complete method counter mutation aliases and notifications
|
| 1401 |
|
| 1402 |
278834 updates per-method or fallback counters with wrapping increments, distinct self cases, and ordered aggregate/report requests. Focused `cargo xtask test-group stat-updates` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 956970 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1400 |
## 2026-10-21 — RE-750 Complete method counter mutation aliases and notifications
|
| 1401 |
|
| 1402 |
278834 updates per-method or fallback counters with wrapping increments, distinct self cases, and ordered aggregate/report requests. Focused `cargo xtask test-group stat-updates` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 956970 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
| 1403 |
+
|
| 1404 |
+
|
| 1405 |
+
## 2026-10-21 — RE-751 Complete cross client record clearing and inclusive index64
|
| 1406 |
+
|
| 1407 |
+
285486 clears two words across nonnull client records in64 entity slots; its source gate accepts index64 inclusively. Focused `cargo xtask test-group record-clear` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 137753 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
|
@@ -1294,3 +1294,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1294 |
|
| 1295 |
|
| 1296 |
- [x] RE-750 Complete method counter mutation aliases and notifications ([report](research/QVM_METHOD_STAT_UPDATES.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1294 |
|
| 1295 |
|
| 1296 |
- [x] RE-750 Complete method counter mutation aliases and notifications ([report](research/QVM_METHOD_STAT_UPDATES.md)).
|
| 1297 |
+
|
| 1298 |
+
|
| 1299 |
+
- [x] RE-751 Complete cross client record clearing and inclusive index64 ([report](research/QVM_CROSS_CLIENT_CLEAR.md)).
|
docs/research/QVM_CROSS_CLIENT_CLEAR.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Complete cross client record clearing and inclusive index64
|
| 2 |
+
|
| 3 |
+
RE-751. Reproduce with `python3 scripts/analyze_qvm_cross_client_clear.py`; validate with `cargo xtask test-group record-clear`. See the [machine report](qvm-cross-client-clear.json).
|
| 4 |
+
|
| 5 |
+
Recovered complete285486 with actual33715 over40 mode/index/sparse/dense fixtures. Exact write footprints verify no other seeded record word changes, including neighbors. Index64 clears client3032/3036 and is retained for fidelity; it is not silently narrowed to63. Matrix ownership, live IDs and original native parity remain open.
|
| 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
|
@@ -849,3 +849,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 849 |
|
| 850 |
|
| 851 |
[RE-750: Complete method counter mutation aliases and notifications](QVM_METHOD_STAT_UPDATES.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 849 |
|
| 850 |
|
| 851 |
[RE-750: Complete method counter mutation aliases and notifications](QVM_METHOD_STAT_UPDATES.md).
|
| 852 |
+
|
| 853 |
+
|
| 854 |
+
[RE-751: Complete cross client record clearing and inclusive index64](QVM_CROSS_CLIENT_CLEAR.md).
|
docs/research/qvm-cross-client-clear.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_cross_client_clear.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Complete285486 index/mode gates and exact cross-client write footprint."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source
|
| 6 |
+
from qvm_record_clear_support import seed,clear,RPOOL
|
| 7 |
+
from qvm_notification_support import POOL
|
| 8 |
+
from analyze_qvm import write_json
|
| 9 |
+
|
| 10 |
+
def main():
|
| 11 |
+
q,raw,h,ins=source();rows=[]
|
| 12 |
+
for mode,index,dense in itertools.product([3,9,10,11],[-1,0,63,64,65],[False,True]):
|
| 13 |
+
a=dict(mode=mode,index=index,dense=dense);m=seed(**a);slots=[j for j in range(64) if m[POOL+880*j+520]];_,_,p=clear(ins,m,{8:index});p.update(input=a,client_slots=slots);rows.append(p)
|
| 14 |
+
write_json(Path('docs/research/qvm-cross-client-clear.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Complete285486 with actual33715,64 entity slots and sparse/dense client pointers. Accepts index64 (inclusive source bound), clearing pair at3032/3036. Fixture record values supplied; live matrix ownership and native parity remain open.'})
|
| 15 |
+
if __name__=='__main__':main()
|
scripts/qvm_record_clear_support.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""285486 cross-client pair clearing, including accepted index64."""
|
| 2 |
+
from qvm_health_effects_support import H
|
| 3 |
+
from qvm_notification_support import POOL
|
| 4 |
+
from qvm_trace_support import resume
|
| 5 |
+
from qvm_contact_support import predicate
|
| 6 |
+
R=H+0x110000
|
| 7 |
+
RPOOL=H+0x300000
|
| 8 |
+
|
| 9 |
+
def seed(**a):
|
| 10 |
+
m={34090788:a.get('mode',10)};slots=list(range(64)) if a.get('dense',False) else [0,3,63]
|
| 11 |
+
for j in range(64):
|
| 12 |
+
c=RPOOL+j*6336 if j in slots else 0;m[POOL+880*j+520]=c
|
| 13 |
+
if c:
|
| 14 |
+
for k in range(65):m[c+2520+8*k]=10000+j*256+2*k;m[c+2524+8*k]=10001+j*256+2*k
|
| 15 |
+
return m
|
| 16 |
+
|
| 17 |
+
def clear(ins,m,args):
|
| 18 |
+
m[R+40]=args[8];addresses=sorted(a for a in m if RPOOL<=a<RPOOL+64*6336);before={a:m[a]&0xffffffff for a in addresses}
|
| 19 |
+
m,e=resume(ins,285487,285578,m,R,handlers={33715:predicate})
|
| 20 |
+
changes=[{'address':a,'before':v,'after':m[a]&0xffffffff} for a,v in before.items() if v!=(m[a]&0xffffffff)]
|
| 21 |
+
return m,0,{'arguments':args,'changes':changes,'execution':e}
|
scripts/test_qvm_cross_client_clear.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from qvm_record_clear_support import RPOOL
|
| 4 |
+
class CrossClientClearTests(unittest.TestCase):
|
| 5 |
+
@classmethod
|
| 6 |
+
def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-cross-client-clear.json').read_text())['probes']
|
| 7 |
+
def test_independent_exact_write_footprint_and_values(self):
|
| 8 |
+
for p in self.ps:
|
| 9 |
+
a=p['input'];active=0<=a['index']<=64 and a['mode']>=3 and a['mode'] not in [9,11];expected=[]
|
| 10 |
+
if active:
|
| 11 |
+
for j in p['client_slots']:
|
| 12 |
+
for k in [0,1]:expected.append({'address':RPOOL+j*6336+2520+8*a['index']+4*k,'before':10000+j*256+2*a['index']+k,'after':0})
|
| 13 |
+
self.assertEqual(p['changes'],expected,a)
|
| 14 |
+
def test_inclusive64_and_sparse_slots(self):
|
| 15 |
+
self.assertEqual(len(self.ps),40);self.assertTrue(any(p['input']['index']==64 and p['changes'] for p in self.ps));self.assertEqual({len(p['client_slots']) for p in self.ps},{3,64})
|
| 16 |
+
def test_only_actual_mode_predicate_child_and_complete_exit(self):
|
| 17 |
+
for p in self.ps:
|
| 18 |
+
self.assertEqual(p['execution']['stop'],285578);self.assertEqual([c['target'] for c in p['execution']['calls']],[33715] if 0<=p['input']['index']<=64 else [])
|
| 19 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -1233,3 +1233,6 @@ group stat-slots scripts/analyze_qvm_method_stat_slots.py
|
|
| 1233 |
report scripts/analyze_qvm_method_stat_updates.py docs/research/qvm-method-stat-updates.json
|
| 1234 |
edge docs/research/qvm-method-stat-updates.json scripts/test_qvm_method_stat_updates.py
|
| 1235 |
group stat-updates scripts/analyze_qvm_method_stat_updates.py
|
|
|
|
|
|
|
|
|
|
|
|
| 1233 |
report scripts/analyze_qvm_method_stat_updates.py docs/research/qvm-method-stat-updates.json
|
| 1234 |
edge docs/research/qvm-method-stat-updates.json scripts/test_qvm_method_stat_updates.py
|
| 1235 |
group stat-updates scripts/analyze_qvm_method_stat_updates.py
|
| 1236 |
+
report scripts/analyze_qvm_cross_client_clear.py docs/research/qvm-cross-client-clear.json
|
| 1237 |
+
edge docs/research/qvm-cross-client-clear.json scripts/test_qvm_cross_client_clear.py
|
| 1238 |
+
group record-clear scripts/analyze_qvm_cross_client_clear.py
|