qvm: resolve interception child effects
Browse files- docs/ASSET_PIPELINE_TODO.md +3 -0
- docs/FINDINGS.md +3 -0
- docs/PROVISIONAL_TODO.md +3 -0
- docs/RESEARCH_LEDGER.md +7 -0
- docs/REVERSE_ENGINEERING_TODO.md +3 -0
- docs/research/QVM_MODE10_RESOLVED.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-mode10-resolved.json +0 -0
- scripts/analyze_qvm_mode10_resolved.py +17 -0
- scripts/qvm_record_clear_support.py +1 -1
- scripts/test_qvm_mode10_resolved.py +28 -0
- xtask/checks.tsv +3 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -919,3 +919,6 @@ Research progress: RE-751 [report](research/QVM_CROSS_CLIENT_CLEAR.md); original
|
|
| 919 |
|
| 920 |
|
| 921 |
Research progress: RE-752 [report](research/QVM_PROTECTED_RESOLVED.md); original assets unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
| 919 |
|
| 920 |
|
| 921 |
Research progress: RE-752 [report](research/QVM_PROTECTED_RESOLVED.md); original assets unchanged.
|
| 922 |
+
|
| 923 |
+
|
| 924 |
+
Research progress: RE-753 [report](research/QVM_MODE10_RESOLVED.md); original assets unchanged.
|
docs/FINDINGS.md
CHANGED
|
@@ -1265,3 +1265,6 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 1265 |
|
| 1266 |
|
| 1267 |
**RE-752 — Protected completion with actual scoring and recipient dispatch:** 152386 completion now executes actual205260 score mutation and6369 connected-recipient dispatch while retaining explicit rank/callback/event boundaries. [Evidence](research/QVM_PROTECTED_RESOLVED.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1265 |
|
| 1266 |
|
| 1267 |
**RE-752 — Protected completion with actual scoring and recipient dispatch:** 152386 completion now executes actual205260 score mutation and6369 connected-recipient dispatch while retaining explicit rank/callback/event boundaries. [Evidence](research/QVM_PROTECTED_RESOLVED.md).
|
| 1268 |
+
|
| 1269 |
+
|
| 1270 |
+
**RE-753 — Complete interception with actual score statistics and record clearing:** 206128 now composes actual scoring, recipient dispatch, method counters and cross-client clearing for valid pool ID aliases. [Evidence](research/QVM_MODE10_RESOLVED.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1257,3 +1257,6 @@ Research progress: RE-751 [report](research/QVM_CROSS_CLIENT_CLEAR.md); full nat
|
|
| 1257 |
|
| 1258 |
|
| 1259 |
Research progress: RE-752 [report](research/QVM_PROTECTED_RESOLVED.md); full native/platform/game scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1257 |
|
| 1258 |
|
| 1259 |
Research progress: RE-752 [report](research/QVM_PROTECTED_RESOLVED.md); full native/platform/game scope remains open.
|
| 1260 |
+
|
| 1261 |
+
|
| 1262 |
+
Research progress: RE-753 [report](research/QVM_MODE10_RESOLVED.md); full native/platform/game scope remains open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1410,3 +1410,10 @@ Exactly ten task commits follow baseline `e1f7eb5a`. Each task passed focused `c
|
|
| 1410 |
## 2026-10-21 — RE-752 Protected completion with actual scoring and recipient dispatch
|
| 1411 |
|
| 1412 |
152386 completion now executes actual205260 score mutation and6369 connected-recipient dispatch while retaining explicit rank/callback/event boundaries. Focused `cargo xtask test-group resolved-protected` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 153157 bytes. Full-suite validation is deferred to the tenth batch commit. Optional lifecycle child resolvers added; default source contracts retained. Original assets, Rust runtime and shared VM evaluator unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1410 |
## 2026-10-21 — RE-752 Protected completion with actual scoring and recipient dispatch
|
| 1411 |
|
| 1412 |
152386 completion now executes actual205260 score mutation and6369 connected-recipient dispatch while retaining explicit rank/callback/event boundaries. Focused `cargo xtask test-group resolved-protected` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 153157 bytes. Full-suite validation is deferred to the tenth batch commit. Optional lifecycle child resolvers added; default source contracts retained. Original assets, Rust runtime and shared VM evaluator unchanged.
|
| 1413 |
+
|
| 1414 |
+
|
| 1415 |
+
## 2026-10-21 — RE-753 Complete interception with actual score statistics and record clearing
|
| 1416 |
+
|
| 1417 |
+
206128 now composes actual scoring, recipient dispatch, method counters and cross-client clearing for valid pool ID aliases. Focused `cargo xtask test-group resolved-mode10` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 597687 bytes. Full-suite validation is deferred to the tenth batch commit. Optional lifecycle resolvers and reusable clear snapshot address ownership changed. Default reports and actual child fixtures require focused shared-health regression; original assets and shared VM evaluator unchanged.
|
| 1418 |
+
|
| 1419 |
+
Additional RE-753 shared-health regression: `cargo xtask test-group health` passes92 Python tests with deterministic report regeneration. Prior tracked source/Rust reports remain unchanged; no full suite ran.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -1300,3 +1300,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1300 |
|
| 1301 |
|
| 1302 |
- [x] RE-752 Protected completion with actual scoring and recipient dispatch ([report](research/QVM_PROTECTED_RESOLVED.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1300 |
|
| 1301 |
|
| 1302 |
- [x] RE-752 Protected completion with actual scoring and recipient dispatch ([report](research/QVM_PROTECTED_RESOLVED.md)).
|
| 1303 |
+
|
| 1304 |
+
|
| 1305 |
+
- [x] RE-753 Complete interception with actual score statistics and record clearing ([report](research/QVM_MODE10_RESOLVED.md)).
|
docs/research/QVM_MODE10_RESOLVED.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Complete interception with actual score statistics and record clearing
|
| 2 |
+
|
| 3 |
+
RE-753. Reproduce with `python3 scripts/analyze_qvm_mode10_resolved.py`; validate with `cargo xtask test-group resolved-mode10`. See the [machine report](qvm-mode10-resolved.json).
|
| 4 |
+
|
| 5 |
+
Recovered child composition across28 method/team/paused/entry/in-use fixtures. Independent oracles verify root state, score deltas, counter offsets, notification recipients and exact clear footprints. Generalized clear snapshots to actual entity client pointers while preserving prior fixtures. Ranking, recipient callback internals, stat aggregation/reporting, logs, commands and original event allocation remain explicit unresolved boundaries.
|
| 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
|
@@ -855,3 +855,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 855 |
|
| 856 |
|
| 857 |
[RE-752: Protected completion with actual scoring and recipient dispatch](QVM_PROTECTED_RESOLVED.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 855 |
|
| 856 |
|
| 857 |
[RE-752: Protected completion with actual scoring and recipient dispatch](QVM_PROTECTED_RESOLVED.md).
|
| 858 |
+
|
| 859 |
+
|
| 860 |
+
[RE-753: Complete interception with actual score statistics and record clearing](QVM_MODE10_RESOLVED.md).
|
docs/research/qvm-mode10-resolved.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_mode10_resolved.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Complete206128 with actual scoring/dispatch/stat/record-reset children."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source
|
| 6 |
+
from qvm_resolved_lifecycle_support import seed,extra,resolvers
|
| 7 |
+
from qvm_lifecycle_support import probe
|
| 8 |
+
from analyze_qvm import write_json
|
| 9 |
+
|
| 10 |
+
def main():
|
| 11 |
+
q,raw,h,ins=source();rows=[]
|
| 12 |
+
cases=[dict(method=d,attacker_team=t,paused=p) for d,t,p in itertools.product([12,20,22,25,34,48],[1,2],[0,1])]
|
| 13 |
+
cases += [dict(method=20,mode=3),dict(method=20,state=3),dict(method=20,blocked=1),dict(method=20,active=0)]
|
| 14 |
+
for a in cases:
|
| 15 |
+
m=seed(raw,h,**a);before=extra(m);m,p=probe(ins,m,206129,207154,resolvers=resolvers());p.update(input=a,extra_initial=before,extra_final=extra(m));rows.append(p)
|
| 16 |
+
write_json(Path('docs/research/qvm-mode10-resolved.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Complete206128 with actual205260/6439/278834/285486 and nested278733/33715. Ranking5864, recipient180087, aggregate/report279720/279586/285227/283622, logs/commands and event allocation remain captured/supplied. Finite nonnull original-pool ID1/2 aliases only.'})
|
| 17 |
+
if __name__=='__main__':main()
|
scripts/qvm_record_clear_support.py
CHANGED
|
@@ -15,7 +15,7 @@ def seed(**a):
|
|
| 15 |
return m
|
| 16 |
|
| 17 |
def clear(ins,m,args):
|
| 18 |
-
m[R+40]=args[8];addresses=sorted(
|
| 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}
|
|
|
|
| 15 |
return m
|
| 16 |
|
| 17 |
def clear(ins,m,args):
|
| 18 |
+
m[R+40]=args[8];addresses=sorted({c+2520+8*j+4*k for slot in range(64) for c in [m[POOL+880*slot+520]] if c for j in range(65) for k in [0,1]});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_mode10_resolved.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_mode10_complete import complete_expected
|
| 4 |
+
from test_qvm_method_stat_updates import expected as stats_expected
|
| 5 |
+
from qvm_record_clear_support import RPOOL
|
| 6 |
+
from qvm_lifecycle_support import CLIENT,A_CLIENT,TARGET,ATTACKER
|
| 7 |
+
from qvm_notification_support import POOL
|
| 8 |
+
class ResolvedMode10Tests(unittest.TestCase):
|
| 9 |
+
@classmethod
|
| 10 |
+
def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-mode10-resolved.json').read_text())['probes']
|
| 11 |
+
def test_root_state_and_independent_scores_matrix(self):
|
| 12 |
+
for p in self.ps:
|
| 13 |
+
a=p['input'];r,_=complete_expected(p,(0,1));self.assertEqual(p['final'],r,a);active=a.get('mode',10)==10 and a.get('state',0)!=3 and not a.get('blocked',0);same=a.get('attacker_team',1)==1;delta=0 if a.get('paused',0) else 1-2*same
|
| 14 |
+
e={**p['extra_initial'],'scores':[7,11+delta] if active else [7,11],'pair1':[[0,0],[0,0]] if active else [[11,21],[11,21]]};self.assertEqual(p['extra_final'],e,a)
|
| 15 |
+
def test_actual_stat_counter_and_record_clear_children(self):
|
| 16 |
+
for p in self.ps:
|
| 17 |
+
a=p['input'];children={c['call']['target']:c['effect'] for c in p['execution']['children']}
|
| 18 |
+
if 278834 not in children:continue
|
| 19 |
+
stats=children[278834];changes,calls=stats_expected({'method':a.get('method',12),'self':False,'initial':5});self.assertEqual(stats['changes'],changes,a);self.assertEqual([c['target'] for c in stats['requests']],calls)
|
| 20 |
+
clear=children[285486];self.assertEqual(clear['changes'],[{'address':c+2528+4*k,'before':11+10*k,'after':0} for c in [CLIENT,A_CLIENT] for k in [0,1]])
|
| 21 |
+
def test_actual_notification_and_unresolved_leaf_boundaries(self):
|
| 22 |
+
self.assertEqual(len(self.ps),28)
|
| 23 |
+
for p in self.ps:
|
| 24 |
+
a=p['input'];children={c['call']['target']:c['effect'] for c in p['execution']['children']}
|
| 25 |
+
if 6439 in children:self.assertEqual([r['arguments'] for r in children[6439]['requests']],[{'8':TARGET,'12':ATTACKER,'16':POOL+880*j} for j in [1,2]] if a.get('active',1) else [])
|
| 26 |
+
self.assertEqual(p['execution']['stop'],207154)
|
| 27 |
+
self.assertFalse({205260,6439,278834,285486}&{r['target'] for r in p['effects']['requests']})
|
| 28 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -1239,3 +1239,6 @@ group record-clear scripts/analyze_qvm_cross_client_clear.py
|
|
| 1239 |
report scripts/analyze_qvm_protected_resolved.py docs/research/qvm-protected-resolved.json
|
| 1240 |
edge docs/research/qvm-protected-resolved.json scripts/test_qvm_protected_resolved.py
|
| 1241 |
group resolved-protected scripts/analyze_qvm_protected_resolved.py
|
|
|
|
|
|
|
|
|
|
|
|
| 1239 |
report scripts/analyze_qvm_protected_resolved.py docs/research/qvm-protected-resolved.json
|
| 1240 |
edge docs/research/qvm-protected-resolved.json scripts/test_qvm_protected_resolved.py
|
| 1241 |
group resolved-protected scripts/analyze_qvm_protected_resolved.py
|
| 1242 |
+
report scripts/analyze_qvm_mode10_resolved.py docs/research/qvm-mode10-resolved.json
|
| 1243 |
+
edge docs/research/qvm-mode10-resolved.json scripts/test_qvm_mode10_resolved.py
|
| 1244 |
+
group resolved-mode10 scripts/analyze_qvm_mode10_resolved.py
|