nmarshall commited on
Commit
3ae56cb
·
1 Parent(s): bcdf90a

qvm: recover method stat slots

Browse files
docs/ASSET_PIPELINE_TODO.md CHANGED
@@ -907,3 +907,6 @@ Research progress: RE-747 [report](research/QVM_SCORE_UPDATE.md); original asset
907
 
908
 
909
  Research progress: RE-748 [report](research/QVM_CLIENT_NOTIFICATIONS.md); original assets unchanged.
 
 
 
 
907
 
908
 
909
  Research progress: RE-748 [report](research/QVM_CLIENT_NOTIFICATIONS.md); original assets unchanged.
910
+
911
+
912
+ Research progress: RE-749 [report](research/QVM_METHOD_STAT_SLOTS.md); original assets unchanged.
docs/FINDINGS.md CHANGED
@@ -1253,3 +1253,6 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
1253
 
1254
 
1255
  **RE-748 — Reset and pair notification gates and connected recipients:** 6369 and6439 dispatch only to client state2, after pointer/in-use/client gates; their recipient callbacks remain explicit. [Evidence](research/QVM_CLIENT_NOTIFICATIONS.md).
 
 
 
 
1253
 
1254
 
1255
  **RE-748 — Reset and pair notification gates and connected recipients:** 6369 and6439 dispatch only to client state2, after pointer/in-use/client gates; their recipient callbacks remain explicit. [Evidence](research/QVM_CLIENT_NOTIFICATIONS.md).
1256
+
1257
+
1258
+ **RE-749 — Complete method to statistic slot classification:** 278733 maps19 selected methods into statistic slots0..18 using the original jump table; all other tested methods return-1. [Evidence](research/QVM_METHOD_STAT_SLOTS.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -1245,3 +1245,6 @@ Research progress: RE-747 [report](research/QVM_SCORE_UPDATE.md); full native/pl
1245
 
1246
 
1247
  Research progress: RE-748 [report](research/QVM_CLIENT_NOTIFICATIONS.md); full native/platform/game scope remains open.
 
 
 
 
1245
 
1246
 
1247
  Research progress: RE-748 [report](research/QVM_CLIENT_NOTIFICATIONS.md); full native/platform/game scope remains open.
1248
+
1249
+
1250
+ Research progress: RE-749 [report](research/QVM_METHOD_STAT_SLOTS.md); full native/platform/game scope remains open.
docs/RESEARCH_LEDGER.md CHANGED
@@ -1390,3 +1390,8 @@ Exactly ten task commits follow baseline `e1f7eb5a`. Each task passed focused `c
1390
  ## 2026-10-21 — RE-748 Reset and pair notification gates and connected recipients
1391
 
1392
  6369 and6439 dispatch only to client state2, after pointer/in-use/client gates; their recipient callbacks remain explicit. Focused `cargo xtask test-group notifications` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 42744 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
 
 
 
 
 
 
1390
  ## 2026-10-21 — RE-748 Reset and pair notification gates and connected recipients
1391
 
1392
  6369 and6439 dispatch only to client state2, after pointer/in-use/client gates; their recipient callbacks remain explicit. Focused `cargo xtask test-group notifications` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 42744 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
1393
+
1394
+
1395
+ ## 2026-10-21 — RE-749 Complete method to statistic slot classification
1396
+
1397
+ 278733 maps19 selected methods into statistic slots0..18 using the original jump table; all other tested methods return-1. Focused `cargo xtask test-group stat-slots` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 19282 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
@@ -1288,3 +1288,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
1288
 
1289
 
1290
  - [x] RE-748 Reset and pair notification gates and connected recipients ([report](research/QVM_CLIENT_NOTIFICATIONS.md)).
 
 
 
 
1288
 
1289
 
1290
  - [x] RE-748 Reset and pair notification gates and connected recipients ([report](research/QVM_CLIENT_NOTIFICATIONS.md)).
1291
+
1292
+
1293
+ - [x] RE-749 Complete method to statistic slot classification ([report](research/QVM_METHOD_STAT_SLOTS.md)).
docs/research/QVM_METHOD_STAT_SLOTS.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Complete method to statistic slot classification
2
+
3
+ RE-749. Reproduce with `python3 scripts/analyze_qvm_method_stat_slots.py`; validate with `cargo xtask test-group stat-slots`. See the [machine report](qvm-method-stat-slots.json).
4
+
5
+ Recovered complete278733 with original table31348, covering every method0..49 and signed extremes. An independent explicit mapping verifies all19 slots and fallback branches. These are numeric stat slots; semantic weapon naming and counter/notification behavior are separate work.
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
@@ -843,3 +843,6 @@ The extension collector adds five focused tests for native tail calls, command-r
843
 
844
 
845
  [RE-748: Reset and pair notification gates and connected recipients](QVM_CLIENT_NOTIFICATIONS.md).
 
 
 
 
843
 
844
 
845
  [RE-748: Reset and pair notification gates and connected recipients](QVM_CLIENT_NOTIFICATIONS.md).
846
+
847
+
848
+ [RE-749: Complete method to statistic slot classification](QVM_METHOD_STAT_SLOTS.md).
docs/research/qvm-method-stat-slots.json ADDED
@@ -0,0 +1,783 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Complete278733 using original31348 dispatch table. Numeric slots0..18; unsupported methods return-1. No semantic weapon labels, stat mutations, native or rendering work.",
3
+ "probes": [
4
+ {
5
+ "execution": {
6
+ "byte_writes": [],
7
+ "calls": [],
8
+ "children": [],
9
+ "return": -1,
10
+ "stop": 278833,
11
+ "trace": null,
12
+ "trace_length": 10,
13
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
14
+ },
15
+ "method": -2147483648,
16
+ "slot": -1
17
+ },
18
+ {
19
+ "execution": {
20
+ "byte_writes": [],
21
+ "calls": [],
22
+ "children": [],
23
+ "return": -1,
24
+ "stop": 278833,
25
+ "trace": null,
26
+ "trace_length": 10,
27
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
28
+ },
29
+ "method": -1,
30
+ "slot": -1
31
+ },
32
+ {
33
+ "execution": {
34
+ "byte_writes": [],
35
+ "calls": [],
36
+ "children": [],
37
+ "return": -1,
38
+ "stop": 278833,
39
+ "trace": null,
40
+ "trace_length": 10,
41
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
42
+ },
43
+ "method": 0,
44
+ "slot": -1
45
+ },
46
+ {
47
+ "execution": {
48
+ "byte_writes": [],
49
+ "calls": [],
50
+ "children": [],
51
+ "return": -1,
52
+ "stop": 278833,
53
+ "trace": null,
54
+ "trace_length": 10,
55
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
56
+ },
57
+ "method": 1,
58
+ "slot": -1
59
+ },
60
+ {
61
+ "execution": {
62
+ "byte_writes": [],
63
+ "calls": [],
64
+ "children": [],
65
+ "return": -1,
66
+ "stop": 278833,
67
+ "trace": null,
68
+ "trace_length": 10,
69
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
70
+ },
71
+ "method": 2,
72
+ "slot": -1
73
+ },
74
+ {
75
+ "execution": {
76
+ "byte_writes": [],
77
+ "calls": [],
78
+ "children": [],
79
+ "return": -1,
80
+ "stop": 278833,
81
+ "trace": null,
82
+ "trace_length": 10,
83
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
84
+ },
85
+ "method": 3,
86
+ "slot": -1
87
+ },
88
+ {
89
+ "execution": {
90
+ "byte_writes": [],
91
+ "calls": [],
92
+ "children": [],
93
+ "return": -1,
94
+ "stop": 278833,
95
+ "trace": null,
96
+ "trace_length": 10,
97
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
98
+ },
99
+ "method": 4,
100
+ "slot": -1
101
+ },
102
+ {
103
+ "execution": {
104
+ "byte_writes": [],
105
+ "calls": [],
106
+ "children": [],
107
+ "return": -1,
108
+ "stop": 278833,
109
+ "trace": null,
110
+ "trace_length": 10,
111
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
112
+ },
113
+ "method": 5,
114
+ "slot": -1
115
+ },
116
+ {
117
+ "execution": {
118
+ "byte_writes": [],
119
+ "calls": [],
120
+ "children": [],
121
+ "return": -1,
122
+ "stop": 278833,
123
+ "trace": null,
124
+ "trace_length": 10,
125
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
126
+ },
127
+ "method": 6,
128
+ "slot": -1
129
+ },
130
+ {
131
+ "execution": {
132
+ "byte_writes": [],
133
+ "calls": [],
134
+ "children": [],
135
+ "return": -1,
136
+ "stop": 278833,
137
+ "trace": null,
138
+ "trace_length": 10,
139
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
140
+ },
141
+ "method": 7,
142
+ "slot": -1
143
+ },
144
+ {
145
+ "execution": {
146
+ "byte_writes": [],
147
+ "calls": [],
148
+ "children": [],
149
+ "return": -1,
150
+ "stop": 278833,
151
+ "trace": null,
152
+ "trace_length": 10,
153
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
154
+ },
155
+ "method": 8,
156
+ "slot": -1
157
+ },
158
+ {
159
+ "execution": {
160
+ "byte_writes": [],
161
+ "calls": [],
162
+ "children": [],
163
+ "return": -1,
164
+ "stop": 278833,
165
+ "trace": null,
166
+ "trace_length": 10,
167
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
168
+ },
169
+ "method": 9,
170
+ "slot": -1
171
+ },
172
+ {
173
+ "execution": {
174
+ "byte_writes": [],
175
+ "calls": [],
176
+ "children": [],
177
+ "return": -1,
178
+ "stop": 278833,
179
+ "trace": null,
180
+ "trace_length": 10,
181
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
182
+ },
183
+ "method": 10,
184
+ "slot": -1
185
+ },
186
+ {
187
+ "execution": {
188
+ "byte_writes": [],
189
+ "calls": [],
190
+ "children": [],
191
+ "return": -1,
192
+ "stop": 278833,
193
+ "trace": null,
194
+ "trace_length": 10,
195
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
196
+ },
197
+ "method": 11,
198
+ "slot": -1
199
+ },
200
+ {
201
+ "execution": {
202
+ "byte_writes": [],
203
+ "calls": [],
204
+ "children": [],
205
+ "return": -1,
206
+ "stop": 278833,
207
+ "trace": null,
208
+ "trace_length": 10,
209
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
210
+ },
211
+ "method": 12,
212
+ "slot": -1
213
+ },
214
+ {
215
+ "execution": {
216
+ "byte_writes": [],
217
+ "calls": [],
218
+ "children": [],
219
+ "return": -1,
220
+ "stop": 278833,
221
+ "trace": null,
222
+ "trace_length": 10,
223
+ "trace_sha256": "fdfdb1badd8ff8899319de70c74c9a81af02a633c0b3bc41533af23b34f551c6"
224
+ },
225
+ "method": 13,
226
+ "slot": -1
227
+ },
228
+ {
229
+ "execution": {
230
+ "byte_writes": [],
231
+ "calls": [],
232
+ "children": [],
233
+ "return": 9,
234
+ "stop": 278833,
235
+ "trace": null,
236
+ "trace_length": 22,
237
+ "trace_sha256": "dc3e00983ef175405f87d6fe8128c862058f4d6bd6e6ef0604c4c8b3679a8650"
238
+ },
239
+ "method": 14,
240
+ "slot": 9
241
+ },
242
+ {
243
+ "execution": {
244
+ "byte_writes": [],
245
+ "calls": [],
246
+ "children": [],
247
+ "return": 8,
248
+ "stop": 278833,
249
+ "trace": null,
250
+ "trace_length": 22,
251
+ "trace_sha256": "30a62a322d15e8ec3de02bcdfb93d73d7d81faa78cebecae48377be3bd1a7b11"
252
+ },
253
+ "method": 15,
254
+ "slot": 8
255
+ },
256
+ {
257
+ "execution": {
258
+ "byte_writes": [],
259
+ "calls": [],
260
+ "children": [],
261
+ "return": 11,
262
+ "stop": 278833,
263
+ "trace": null,
264
+ "trace_length": 22,
265
+ "trace_sha256": "47d9ae0a2cce8f5e9cb6ab971ebf935ca531f69180f7b46eb1299d9076d67346"
266
+ },
267
+ "method": 16,
268
+ "slot": 11
269
+ },
270
+ {
271
+ "execution": {
272
+ "byte_writes": [],
273
+ "calls": [],
274
+ "children": [],
275
+ "return": 5,
276
+ "stop": 278833,
277
+ "trace": null,
278
+ "trace_length": 22,
279
+ "trace_sha256": "9907f290087b532175a6c9ee3c88d6f458886ab8b92e6147c797579b4d1e19dc"
280
+ },
281
+ "method": 17,
282
+ "slot": 5
283
+ },
284
+ {
285
+ "execution": {
286
+ "byte_writes": [],
287
+ "calls": [],
288
+ "children": [],
289
+ "return": 4,
290
+ "stop": 278833,
291
+ "trace": null,
292
+ "trace_length": 22,
293
+ "trace_sha256": "0f68a1f56e70e74417d9fa5f095ab765eba3a3249a001f207ccf0b34c2592621"
294
+ },
295
+ "method": 18,
296
+ "slot": 4
297
+ },
298
+ {
299
+ "execution": {
300
+ "byte_writes": [],
301
+ "calls": [],
302
+ "children": [],
303
+ "return": 2,
304
+ "stop": 278833,
305
+ "trace": null,
306
+ "trace_length": 22,
307
+ "trace_sha256": "cc24b607569e673f48ee843acf1ede4739a7ad570d28f8f880f6b46a37f5e772"
308
+ },
309
+ "method": 19,
310
+ "slot": 2
311
+ },
312
+ {
313
+ "execution": {
314
+ "byte_writes": [],
315
+ "calls": [],
316
+ "children": [],
317
+ "return": 0,
318
+ "stop": 278833,
319
+ "trace": null,
320
+ "trace_length": 22,
321
+ "trace_sha256": "b025b68b06b61caccd4f3df2ac72a6a9ba5d8581bac9aecf89f482b648bae897"
322
+ },
323
+ "method": 20,
324
+ "slot": 0
325
+ },
326
+ {
327
+ "execution": {
328
+ "byte_writes": [],
329
+ "calls": [],
330
+ "children": [],
331
+ "return": 7,
332
+ "stop": 278833,
333
+ "trace": null,
334
+ "trace_length": 22,
335
+ "trace_sha256": "27469e5cfdab23d773443d1d01b1d7afac50a1fb2a155454f90d36411f403bf6"
336
+ },
337
+ "method": 21,
338
+ "slot": 7
339
+ },
340
+ {
341
+ "execution": {
342
+ "byte_writes": [],
343
+ "calls": [],
344
+ "children": [],
345
+ "return": -1,
346
+ "stop": 278833,
347
+ "trace": null,
348
+ "trace_length": 22,
349
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
350
+ },
351
+ "method": 22,
352
+ "slot": -1
353
+ },
354
+ {
355
+ "execution": {
356
+ "byte_writes": [],
357
+ "calls": [],
358
+ "children": [],
359
+ "return": -1,
360
+ "stop": 278833,
361
+ "trace": null,
362
+ "trace_length": 22,
363
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
364
+ },
365
+ "method": 23,
366
+ "slot": -1
367
+ },
368
+ {
369
+ "execution": {
370
+ "byte_writes": [],
371
+ "calls": [],
372
+ "children": [],
373
+ "return": -1,
374
+ "stop": 278833,
375
+ "trace": null,
376
+ "trace_length": 22,
377
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
378
+ },
379
+ "method": 24,
380
+ "slot": -1
381
+ },
382
+ {
383
+ "execution": {
384
+ "byte_writes": [],
385
+ "calls": [],
386
+ "children": [],
387
+ "return": -1,
388
+ "stop": 278833,
389
+ "trace": null,
390
+ "trace_length": 22,
391
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
392
+ },
393
+ "method": 25,
394
+ "slot": -1
395
+ },
396
+ {
397
+ "execution": {
398
+ "byte_writes": [],
399
+ "calls": [],
400
+ "children": [],
401
+ "return": -1,
402
+ "stop": 278833,
403
+ "trace": null,
404
+ "trace_length": 22,
405
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
406
+ },
407
+ "method": 26,
408
+ "slot": -1
409
+ },
410
+ {
411
+ "execution": {
412
+ "byte_writes": [],
413
+ "calls": [],
414
+ "children": [],
415
+ "return": -1,
416
+ "stop": 278833,
417
+ "trace": null,
418
+ "trace_length": 22,
419
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
420
+ },
421
+ "method": 27,
422
+ "slot": -1
423
+ },
424
+ {
425
+ "execution": {
426
+ "byte_writes": [],
427
+ "calls": [],
428
+ "children": [],
429
+ "return": 6,
430
+ "stop": 278833,
431
+ "trace": null,
432
+ "trace_length": 22,
433
+ "trace_sha256": "7f599842e74ad87805ebdc8072249f764c190d4d035b24421bc4a12cc4a36627"
434
+ },
435
+ "method": 28,
436
+ "slot": 6
437
+ },
438
+ {
439
+ "execution": {
440
+ "byte_writes": [],
441
+ "calls": [],
442
+ "children": [],
443
+ "return": -1,
444
+ "stop": 278833,
445
+ "trace": null,
446
+ "trace_length": 22,
447
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
448
+ },
449
+ "method": 29,
450
+ "slot": -1
451
+ },
452
+ {
453
+ "execution": {
454
+ "byte_writes": [],
455
+ "calls": [],
456
+ "children": [],
457
+ "return": 1,
458
+ "stop": 278833,
459
+ "trace": null,
460
+ "trace_length": 22,
461
+ "trace_sha256": "ee24166027a46d49e10a74978b511385a7198deeeb09630bd22d37a4f2c7cddf"
462
+ },
463
+ "method": 30,
464
+ "slot": 1
465
+ },
466
+ {
467
+ "execution": {
468
+ "byte_writes": [],
469
+ "calls": [],
470
+ "children": [],
471
+ "return": -1,
472
+ "stop": 278833,
473
+ "trace": null,
474
+ "trace_length": 22,
475
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
476
+ },
477
+ "method": 31,
478
+ "slot": -1
479
+ },
480
+ {
481
+ "execution": {
482
+ "byte_writes": [],
483
+ "calls": [],
484
+ "children": [],
485
+ "return": -1,
486
+ "stop": 278833,
487
+ "trace": null,
488
+ "trace_length": 22,
489
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
490
+ },
491
+ "method": 32,
492
+ "slot": -1
493
+ },
494
+ {
495
+ "execution": {
496
+ "byte_writes": [],
497
+ "calls": [],
498
+ "children": [],
499
+ "return": -1,
500
+ "stop": 278833,
501
+ "trace": null,
502
+ "trace_length": 22,
503
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
504
+ },
505
+ "method": 33,
506
+ "slot": -1
507
+ },
508
+ {
509
+ "execution": {
510
+ "byte_writes": [],
511
+ "calls": [],
512
+ "children": [],
513
+ "return": -1,
514
+ "stop": 278833,
515
+ "trace": null,
516
+ "trace_length": 22,
517
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
518
+ },
519
+ "method": 34,
520
+ "slot": -1
521
+ },
522
+ {
523
+ "execution": {
524
+ "byte_writes": [],
525
+ "calls": [],
526
+ "children": [],
527
+ "return": -1,
528
+ "stop": 278833,
529
+ "trace": null,
530
+ "trace_length": 22,
531
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
532
+ },
533
+ "method": 35,
534
+ "slot": -1
535
+ },
536
+ {
537
+ "execution": {
538
+ "byte_writes": [],
539
+ "calls": [],
540
+ "children": [],
541
+ "return": 10,
542
+ "stop": 278833,
543
+ "trace": null,
544
+ "trace_length": 22,
545
+ "trace_sha256": "6027825e417137a471f902d116539e2fd397e41b9b42c11d57c5f2ad20c6aa21"
546
+ },
547
+ "method": 36,
548
+ "slot": 10
549
+ },
550
+ {
551
+ "execution": {
552
+ "byte_writes": [],
553
+ "calls": [],
554
+ "children": [],
555
+ "return": -1,
556
+ "stop": 278833,
557
+ "trace": null,
558
+ "trace_length": 22,
559
+ "trace_sha256": "28d18357cf3f35211b26e650acf23426856aa4e6247e3a916ef14a3b049de878"
560
+ },
561
+ "method": 37,
562
+ "slot": -1
563
+ },
564
+ {
565
+ "execution": {
566
+ "byte_writes": [],
567
+ "calls": [],
568
+ "children": [],
569
+ "return": 3,
570
+ "stop": 278833,
571
+ "trace": null,
572
+ "trace_length": 22,
573
+ "trace_sha256": "d8d3392d0f29d38dbc33fcedd51a3e336788d906c7aa5bf7bc69bb7907bbf639"
574
+ },
575
+ "method": 38,
576
+ "slot": 3
577
+ },
578
+ {
579
+ "execution": {
580
+ "byte_writes": [],
581
+ "calls": [],
582
+ "children": [],
583
+ "return": 12,
584
+ "stop": 278833,
585
+ "trace": null,
586
+ "trace_length": 22,
587
+ "trace_sha256": "7b2e9f2c9d01badf2efbc3f345961c1f620b2f2ca83d28703e11c81c82df5441"
588
+ },
589
+ "method": 39,
590
+ "slot": 12
591
+ },
592
+ {
593
+ "execution": {
594
+ "byte_writes": [],
595
+ "calls": [],
596
+ "children": [],
597
+ "return": 13,
598
+ "stop": 278833,
599
+ "trace": null,
600
+ "trace_length": 22,
601
+ "trace_sha256": "a221149ec00ee7b48bae199397014774c98cb314c41a5a8aa8a359cc1a8948f4"
602
+ },
603
+ "method": 40,
604
+ "slot": 13
605
+ },
606
+ {
607
+ "execution": {
608
+ "byte_writes": [],
609
+ "calls": [],
610
+ "children": [],
611
+ "return": 14,
612
+ "stop": 278833,
613
+ "trace": null,
614
+ "trace_length": 22,
615
+ "trace_sha256": "6946c59c45d54c7ec2cea1f8b7d85c450b33904f73a012d0b6acb6fd86b5421b"
616
+ },
617
+ "method": 41,
618
+ "slot": 14
619
+ },
620
+ {
621
+ "execution": {
622
+ "byte_writes": [],
623
+ "calls": [],
624
+ "children": [],
625
+ "return": 15,
626
+ "stop": 278833,
627
+ "trace": null,
628
+ "trace_length": 22,
629
+ "trace_sha256": "b1493a88031952305292fa21d206a869492d10290024d384f08d44afa120a3dc"
630
+ },
631
+ "method": 42,
632
+ "slot": 15
633
+ },
634
+ {
635
+ "execution": {
636
+ "byte_writes": [],
637
+ "calls": [],
638
+ "children": [],
639
+ "return": 16,
640
+ "stop": 278833,
641
+ "trace": null,
642
+ "trace_length": 22,
643
+ "trace_sha256": "5391250203cb0bce32df6dd460883e06f45a5a202e9db6ff6fac906a7aca540a"
644
+ },
645
+ "method": 43,
646
+ "slot": 16
647
+ },
648
+ {
649
+ "execution": {
650
+ "byte_writes": [],
651
+ "calls": [],
652
+ "children": [],
653
+ "return": 17,
654
+ "stop": 278833,
655
+ "trace": null,
656
+ "trace_length": 22,
657
+ "trace_sha256": "34219e5991edfb2b76fd93475710f94d3e3c08fb66b1e45631da573a36a83211"
658
+ },
659
+ "method": 44,
660
+ "slot": 17
661
+ },
662
+ {
663
+ "execution": {
664
+ "byte_writes": [],
665
+ "calls": [],
666
+ "children": [],
667
+ "return": 18,
668
+ "stop": 278833,
669
+ "trace": null,
670
+ "trace_length": 22,
671
+ "trace_sha256": "da6afa8e1dd2e22fed3724a759fa6d294b60521aff1469712d9039626e0c7f0c"
672
+ },
673
+ "method": 45,
674
+ "slot": 18
675
+ },
676
+ {
677
+ "execution": {
678
+ "byte_writes": [],
679
+ "calls": [],
680
+ "children": [],
681
+ "return": -1,
682
+ "stop": 278833,
683
+ "trace": null,
684
+ "trace_length": 14,
685
+ "trace_sha256": "cd835aa48bb92fe71cfc4e3fbb7d1af9af3cd8ec19b245494a3839d0719346f8"
686
+ },
687
+ "method": 46,
688
+ "slot": -1
689
+ },
690
+ {
691
+ "execution": {
692
+ "byte_writes": [],
693
+ "calls": [],
694
+ "children": [],
695
+ "return": -1,
696
+ "stop": 278833,
697
+ "trace": null,
698
+ "trace_length": 14,
699
+ "trace_sha256": "cd835aa48bb92fe71cfc4e3fbb7d1af9af3cd8ec19b245494a3839d0719346f8"
700
+ },
701
+ "method": 47,
702
+ "slot": -1
703
+ },
704
+ {
705
+ "execution": {
706
+ "byte_writes": [],
707
+ "calls": [],
708
+ "children": [],
709
+ "return": -1,
710
+ "stop": 278833,
711
+ "trace": null,
712
+ "trace_length": 14,
713
+ "trace_sha256": "cd835aa48bb92fe71cfc4e3fbb7d1af9af3cd8ec19b245494a3839d0719346f8"
714
+ },
715
+ "method": 48,
716
+ "slot": -1
717
+ },
718
+ {
719
+ "execution": {
720
+ "byte_writes": [],
721
+ "calls": [],
722
+ "children": [],
723
+ "return": -1,
724
+ "stop": 278833,
725
+ "trace": null,
726
+ "trace_length": 14,
727
+ "trace_sha256": "cd835aa48bb92fe71cfc4e3fbb7d1af9af3cd8ec19b245494a3839d0719346f8"
728
+ },
729
+ "method": 49,
730
+ "slot": -1
731
+ },
732
+ {
733
+ "execution": {
734
+ "byte_writes": [],
735
+ "calls": [],
736
+ "children": [],
737
+ "return": -1,
738
+ "stop": 278833,
739
+ "trace": null,
740
+ "trace_length": 14,
741
+ "trace_sha256": "cd835aa48bb92fe71cfc4e3fbb7d1af9af3cd8ec19b245494a3839d0719346f8"
742
+ },
743
+ "method": 2147483647,
744
+ "slot": -1
745
+ }
746
+ ],
747
+ "sha256": "a589351dfe517470a1b121dd2164714987d9e4577bf00c6486e1540035d7a79d",
748
+ "source": {
749
+ "archive": "zUrT43_qvm.pk3",
750
+ "archive_sha256": "b59bf0c5bedf11d50e0edd220da7eade96de40601e98ae14c54c819047df0796",
751
+ "member": {
752
+ "bytes": 983300,
753
+ "comment_hex": "",
754
+ "compressed_bytes": 246560,
755
+ "compression": 8,
756
+ "crc32": "98ea1768",
757
+ "create_system": 0,
758
+ "create_version": 63,
759
+ "date_time": [
760
+ 2018,
761
+ 6,
762
+ 18,
763
+ 22,
764
+ 11,
765
+ 50
766
+ ],
767
+ "directory": false,
768
+ "entry_index": 2,
769
+ "external_attr": 32,
770
+ "extra_hex": "0a0020000000000001001800d1e24e974007d40116dcbf962f1fd20116dcbf962f1fd201",
771
+ "extract_version": 20,
772
+ "flags": 0,
773
+ "header_offset": 221309,
774
+ "internal_attr": 0,
775
+ "occurrence": 0,
776
+ "output": "assets/extracted/zUrT43_qvm.pk3/members/000002/vm/qagame.qvm",
777
+ "path": "vm/qagame.qvm",
778
+ "sha256": "a589351dfe517470a1b121dd2164714987d9e4577bf00c6486e1540035d7a79d",
779
+ "type": "member",
780
+ "volume": 0
781
+ }
782
+ }
783
+ }
scripts/analyze_qvm_method_stat_slots.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Original jump-table method-to-stat-slot mapping, including signed boundaries."""
3
+ from pathlib import Path
4
+ from qvm_research_support import source
5
+ from qvm_method_stats_support import method_seed,classify
6
+ from analyze_qvm import write_json
7
+
8
+ def main():
9
+ q,raw,h,ins=source();rows=[]
10
+ for method in [-2147483648,-1,*range(50),2147483647]:
11
+ _,_,p=classify(ins,method_seed(raw,h),{8:method});rows.append(p)
12
+ write_json(Path('docs/research/qvm-method-stat-slots.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Complete278733 using original31348 dispatch table. Numeric slots0..18; unsupported methods return-1. No semantic weapon labels, stat mutations, native or rendering work.'})
13
+ if __name__=='__main__':main()
scripts/qvm_method_stats_support.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Original278733 method-to-stat-slot dispatch, not semantic weapon naming."""
2
+ from qvm_health_effects_support import H
3
+ from qvm_research_support import constants
4
+ from qvm_trace_support import resume
5
+ M=H+0xe0000
6
+
7
+ def method_seed(raw,h):return constants(raw,h,range(31348+14*4,31348+46*4,4))
8
+
9
+ def classify(ins,m,args):
10
+ m[M+20]=args[8];m,e=resume(ins,278734,278833,m,M)
11
+ return m,e['return'],{'method':args[8],'slot':e['return'],'execution':e}
scripts/test_qvm_method_stat_slots.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json,unittest
2
+ from pathlib import Path
3
+ SLOTS={14:9,15:8,16:11,17:5,18:4,19:2,20:0,21:7,28:6,30:1,36:10,38:3,39:12,40:13,41:14,42:15,43:16,44:17,45:18}
4
+ class MethodStatSlotTests(unittest.TestCase):
5
+ @classmethod
6
+ def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-method-stat-slots.json').read_text())['probes']
7
+ def test_independent_explicit_mapping(self):
8
+ for p in self.ps:self.assertEqual(p['slot'],SLOTS.get(p['method'],-1))
9
+ def test_all_slots_and_signed_boundary_cases(self):
10
+ self.assertEqual(len(self.ps),53);self.assertEqual({p['slot'] for p in self.ps},set(range(-1,19)))
11
+ def test_no_children_and_actual_return(self):
12
+ for p in self.ps:self.assertEqual(p['execution']['calls'],[]);self.assertEqual(p['execution']['return'],p['slot'])
13
+ if __name__=='__main__':unittest.main()
xtask/checks.tsv CHANGED
@@ -1227,3 +1227,6 @@ group score scripts/analyze_qvm_score_update.py
1227
  report scripts/analyze_qvm_client_notifications.py docs/research/qvm-client-notifications.json
1228
  edge docs/research/qvm-client-notifications.json scripts/test_qvm_client_notifications.py
1229
  group notifications scripts/analyze_qvm_client_notifications.py
 
 
 
 
1227
  report scripts/analyze_qvm_client_notifications.py docs/research/qvm-client-notifications.json
1228
  edge docs/research/qvm-client-notifications.json scripts/test_qvm_client_notifications.py
1229
  group notifications scripts/analyze_qvm_client_notifications.py
1230
+ report scripts/analyze_qvm_method_stat_slots.py docs/research/qvm-method-stat-slots.json
1231
+ edge docs/research/qvm-method-stat-slots.json scripts/test_qvm_method_stat_slots.py
1232
+ group stat-slots scripts/analyze_qvm_method_stat_slots.py