nmarshall commited on
Commit
5a6dc15
·
1 Parent(s): 39edd9e

qvm: recover mode10 scoring

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