qvm: recover mode10 scoring
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_MODE10_SCORING.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-mode10-scoring.json +0 -0
- scripts/analyze_qvm_mode10_scoring.py +18 -0
- scripts/test_qvm_mode10_scoring.py +29 -0
- xtask/checks.tsv +3 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -883,3 +883,6 @@ Research progress: RE-738 [report](research/QVM_MODE10_ANIMATION.md); original a
|
|
| 883 |
|
| 884 |
|
| 885 |
Research progress: RE-739 [report](research/QVM_MODE10_OBITUARY.md); original assets unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
| 883 |
|
| 884 |
|
| 885 |
Research progress: RE-739 [report](research/QVM_MODE10_OBITUARY.md); original assets unchanged.
|
| 886 |
+
|
| 887 |
+
|
| 888 |
+
Research progress: RE-740 [report](research/QVM_MODE10_SCORING.md); original assets unchanged.
|
docs/FINDINGS.md
CHANGED
|
@@ -1229,3 +1229,6 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 1229 |
|
| 1230 |
|
| 1231 |
**RE-739 — Mode10 inventory reset and obituary publication:** Interception clears ten inventory/timer fields and emits obituary28 with bounded method-name lookup and conditional attacker-health disclosure. [Evidence](research/QVM_MODE10_OBITUARY.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1229 |
|
| 1230 |
|
| 1231 |
**RE-739 — Mode10 inventory reset and obituary publication:** Interception clears ten inventory/timer fields and emits obituary28 with bounded method-name lookup and conditional attacker-health disclosure. [Evidence](research/QVM_MODE10_OBITUARY.md).
|
| 1232 |
+
|
| 1233 |
+
|
| 1234 |
+
**RE-740 — Mode10 team scoring penalties and lifecycle notifications:** Interception increments victim/team counters, requests score+1 and same-team -2, and applies a strict greater-than2000ms repeat-penalty gate before notifications. [Evidence](research/QVM_MODE10_SCORING.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1218,3 +1218,6 @@ Research progress: RE-738 [report](research/QVM_MODE10_ANIMATION.md); full nativ
|
|
| 1218 |
|
| 1219 |
|
| 1220 |
Research progress: RE-739 [report](research/QVM_MODE10_OBITUARY.md); full native/platform/game scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1218 |
|
| 1219 |
|
| 1220 |
Research progress: RE-739 [report](research/QVM_MODE10_OBITUARY.md); full native/platform/game scope remains open.
|
| 1221 |
+
|
| 1222 |
+
|
| 1223 |
+
Research progress: RE-740 [report](research/QVM_MODE10_SCORING.md); full native/platform/game scope remains open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1341,3 +1341,8 @@ Original weapon descriptor classes select animation65/66/67/72/78; class4 method
|
|
| 1341 |
## 2026-10-21 — RE-739 Mode10 inventory reset and obituary publication
|
| 1342 |
|
| 1343 |
Interception clears ten inventory/timer fields and emits obituary28 with bounded method-name lookup and conditional attacker-health disclosure. Focused `cargo xtask test-group mode10-obituary` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 97197 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1341 |
## 2026-10-21 — RE-739 Mode10 inventory reset and obituary publication
|
| 1342 |
|
| 1343 |
Interception clears ten inventory/timer fields and emits obituary28 with bounded method-name lookup and conditional attacker-health disclosure. Focused `cargo xtask test-group mode10-obituary` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 97197 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
| 1344 |
+
|
| 1345 |
+
|
| 1346 |
+
## 2026-10-21 — RE-740 Mode10 team scoring penalties and lifecycle notifications
|
| 1347 |
+
|
| 1348 |
+
Interception increments victim/team counters, requests score+1 and same-team -2, and applies a strict greater-than2000ms repeat-penalty gate before notifications. Focused `cargo xtask test-group mode10-scoring` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 903870 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
|
@@ -1261,3 +1261,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1261 |
|
| 1262 |
|
| 1263 |
- [x] RE-739 Mode10 inventory reset and obituary publication ([report](research/QVM_MODE10_OBITUARY.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1261 |
|
| 1262 |
|
| 1263 |
- [x] RE-739 Mode10 inventory reset and obituary publication ([report](research/QVM_MODE10_OBITUARY.md)).
|
| 1264 |
+
|
| 1265 |
+
|
| 1266 |
+
- [x] RE-740 Mode10 team scoring penalties and lifecycle notifications ([report](research/QVM_MODE10_SCORING.md)).
|
docs/research/QVM_MODE10_SCORING.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Mode10 team scoring penalties and lifecycle notifications
|
| 2 |
+
|
| 3 |
+
RE-740. Reproduce with `python3 scripts/analyze_qvm_mode10_scoring.py`; validate with `cargo xtask test-group mode10-scoring`. See the [machine report](qvm-mode10-scoring.json).
|
| 4 |
+
|
| 5 |
+
Recovered206845..207153 with actual33715 mode predicate and136 fixtures around cooldown/strike thresholds, teams, method34 and attacker flag8/client gates. Distinct warning/limit command paths preserve original arguments. Score, formatting, commands and lifecycle notification children remain captured; their internal side effects are not attributed to this contract.
|
| 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
|
@@ -819,3 +819,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 819 |
|
| 820 |
|
| 821 |
[RE-739: Mode10 inventory reset and obituary publication](QVM_MODE10_OBITUARY.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 819 |
|
| 820 |
|
| 821 |
[RE-739: Mode10 inventory reset and obituary publication](QVM_MODE10_OBITUARY.md).
|
| 822 |
+
|
| 823 |
+
|
| 824 |
+
[RE-740: Mode10 team scoring penalties and lifecycle notifications](QVM_MODE10_SCORING.md).
|
docs/research/qvm-mode10-scoring.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_mode10_scoring.py
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""206845 counters, team penalties and downstream callback requests."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source
|
| 6 |
+
from qvm_lifecycle_support import seed,probe,ATTACKER
|
| 7 |
+
from analyze_qvm import write_json
|
| 8 |
+
|
| 9 |
+
def main():
|
| 10 |
+
q,raw,h,ins=source();rows=[]
|
| 11 |
+
cases=[dict(team=t,attacker_team=at,last=last,strikes=s) for t,at,last,s in itertools.product([1,2,3],[1,2],[7999,8000,8001],[0,1,2,3])]
|
| 12 |
+
cases += [dict(mode=m,method=d,penalty=p,attacker_flags=f,attacker_client=cl) for m,d,p,f,cl in itertools.product([3,9,10,11],[12,34],[0,1],[0,8],[False,True])]
|
| 13 |
+
for a in cases:
|
| 14 |
+
m=seed(raw,h,**a)
|
| 15 |
+
if not a.get('attacker_client',True):m[ATTACKER+520]=0
|
| 16 |
+
_,p=probe(ins,m,206845,207154);p['input']=a;rows.append(p)
|
| 17 |
+
write_json(Path('docs/research/qvm-mode10-scoring.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'206845..207153; actual33715 team-mode predicate. Score205260, callback6439/278834/285486, server command traps and formatter70458 captured. No live score/command effect executed.'})
|
| 18 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_mode10_scoring.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from qvm_lifecycle_support import ATTACKER
|
| 4 |
+
|
| 5 |
+
def score_expected(p):
|
| 6 |
+
a=p['input'];r={**p['initial'],'client':dict(p['initial']['client']),'entity':dict(p['initial']['entity']),'attacker':dict(p['initial']['attacker']),'team_counts':list(p['initial']['team_counts'])};r['client']['280']+=1;r['entity']['720']=ATTACKER;t=a.get('team',1)
|
| 7 |
+
if t in (1,2):r['team_counts'][t-1]+=1
|
| 8 |
+
mode=a.get('mode',10);same=mode>=3 and mode not in (9,11) and a.get('attacker_client',True) and t==a.get('attacker_team',1)
|
| 9 |
+
penalty=same and a.get('penalty',1)==1 and a.get('method',12)!=34 and not a.get('attacker_flags',0)&8 and 10000-a.get('last',0)>2000
|
| 10 |
+
targets=[205260]+([205260] if same else [])
|
| 11 |
+
if penalty:
|
| 12 |
+
if not a.get('strikes',0):r['attacker']['768']=10000
|
| 13 |
+
r['attacker']['764']+=1;targets+=([-17,70458,-18] if r['attacker']['764']>=3 else [-18])
|
| 14 |
+
targets += [6439,278834,285486]
|
| 15 |
+
return r,targets
|
| 16 |
+
class Mode10ScoringTests(unittest.TestCase):
|
| 17 |
+
@classmethod
|
| 18 |
+
def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-mode10-scoring.json').read_text())['probes']
|
| 19 |
+
def test_independent_counters_cooldown_and_penalty_matrix(self):
|
| 20 |
+
for p in self.ps:
|
| 21 |
+
r,targets=score_expected(p);self.assertEqual(p['final'],r,p['input']);self.assertEqual([c['target'] for c in p['effects']['requests']],targets,p['input'])
|
| 22 |
+
def test_score_requests_and_final_callbacks(self):
|
| 23 |
+
for p in self.ps:
|
| 24 |
+
req=p['effects']['requests'];scores=[r['arguments']['16'] for r in req if r['target']==205260];self.assertIn(scores,[[1],[1,-2]])
|
| 25 |
+
self.assertEqual(req[-2]['arguments'],{'8':7,'12':p['input'].get('method',12),'16':65});self.assertEqual(req[-1]['arguments'],{'8':65})
|
| 26 |
+
def test_boundary_and_fixture_coverage(self):
|
| 27 |
+
self.assertEqual(len(self.ps),136)
|
| 28 |
+
for p in self.ps:self.assertEqual(p['execution']['stop'],207154);self.assertEqual(p['events'],[])
|
| 29 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -1182,3 +1182,6 @@ group mode10-animation scripts/analyze_qvm_mode10_animation.py
|
|
| 1182 |
report scripts/analyze_qvm_mode10_obituary.py docs/research/qvm-mode10-obituary.json
|
| 1183 |
edge docs/research/qvm-mode10-obituary.json scripts/test_qvm_mode10_obituary.py
|
| 1184 |
group mode10-obituary scripts/analyze_qvm_mode10_obituary.py
|
|
|
|
|
|
|
|
|
|
|
|
| 1182 |
report scripts/analyze_qvm_mode10_obituary.py docs/research/qvm-mode10-obituary.json
|
| 1183 |
edge docs/research/qvm-mode10-obituary.json scripts/test_qvm_mode10_obituary.py
|
| 1184 |
group mode10-obituary scripts/analyze_qvm_mode10_obituary.py
|
| 1185 |
+
report scripts/analyze_qvm_mode10_scoring.py docs/research/qvm-mode10-scoring.json
|
| 1186 |
+
edge docs/research/qvm-mode10-scoring.json scripts/test_qvm_mode10_scoring.py
|
| 1187 |
+
group mode10-scoring scripts/analyze_qvm_mode10_scoring.py
|