nmarshall commited on
Commit
13f8349
·
1 Parent(s): fd8fde2

qvm: skipped target relink order

Browse files
docs/ASSET_PIPELINE_TODO.md CHANGED
@@ -562,3 +562,6 @@ Research progress: RE-626 [report](research/QVM_TRACE_CLASSIFY.md); remaining na
562
 
563
 
564
  Research progress: RE-627 [report](research/QVM_TRACE_RETRY.md); remaining native/content/runtime/platform scope stays open.
 
 
 
 
562
 
563
 
564
  Research progress: RE-627 [report](research/QVM_TRACE_RETRY.md); remaining native/content/runtime/platform scope stays open.
565
+
566
+
567
+ Research progress: RE-628 [report](research/QVM_TRACE_RELINK.md); remaining native/content/runtime/platform scope stays open.
docs/FINDINGS.md CHANGED
@@ -914,3 +914,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
914
 
915
 
916
  **RE-627 — Trace retry unlink stack and ten-attempt boundary:** Each retry captures unlink−32, appends the target pointer and increments count; the tenth target exits to restoration instead of issuing another trace. [Evidence](research/QVM_TRACE_RETRY.md).
 
 
 
 
914
 
915
 
916
  **RE-627 — Trace retry unlink stack and ten-attempt boundary:** Each retry captures unlink−32, appends the target pointer and increments count; the tenth target exits to restoration instead of issuing another trace. [Evidence](research/QVM_TRACE_RETRY.md).
917
+
918
+
919
+ **RE-628 — Skipped target relink ordering and duplicate entries:** The skipped-target cleanup issues native−31 in insertion order and preserves duplicate entries; empty lists issue no relink request. [Evidence](research/QVM_TRACE_RELINK.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -882,3 +882,6 @@ Research progress: RE-626 [report](research/QVM_TRACE_CLASSIFY.md); remaining na
882
 
883
 
884
  Research progress: RE-627 [report](research/QVM_TRACE_RETRY.md); remaining native/content/runtime/platform scope stays open.
 
 
 
 
882
 
883
 
884
  Research progress: RE-627 [report](research/QVM_TRACE_RETRY.md); remaining native/content/runtime/platform scope stays open.
885
+
886
+
887
+ Research progress: RE-628 [report](research/QVM_TRACE_RELINK.md); remaining native/content/runtime/platform scope stays open.
docs/RESEARCH_LEDGER.md CHANGED
@@ -812,3 +812,8 @@ Actual285840 now composes source allocation/event57/quantized direction/global R
812
  ## 2026-10-20 — RE-627 Trace retry unlink stack and ten-attempt boundary (separate task commit)
813
 
814
  Each retry captures unlink−32, appends the target pointer and increments count; the tenth target exits to restoration instead of issuing another trace. 30 count/target fixtures independently check stack writes, exact retry boundary and native call ABI. Full suite: 994 tests pass. Report regenerates byte-identically (48984 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
 
 
 
 
 
 
812
  ## 2026-10-20 — RE-627 Trace retry unlink stack and ten-attempt boundary (separate task commit)
813
 
814
  Each retry captures unlink−32, appends the target pointer and increments count; the tenth target exits to restoration instead of issuing another trace. 30 count/target fixtures independently check stack writes, exact retry boundary and native call ABI. Full suite: 994 tests pass. Report regenerates byte-identically (48984 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
815
+
816
+
817
+ ## 2026-10-20 — RE-628 Skipped target relink ordering and duplicate entries (separate task commit)
818
+
819
+ The skipped-target cleanup issues native−31 in insertion order and preserves duplicate entries; empty lists issue no relink request. Eight empty/reordered/duplicate/ten-entry cases independently verify pointer order, loop cursor and untouched list contents. Full suite: 997 tests pass. Report regenerates byte-identically (24991 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
docs/REVERSE_ENGINEERING_TODO.md CHANGED
@@ -925,3 +925,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
925
 
926
 
927
  - [x] RE-627 Trace retry unlink stack and ten-attempt boundary ([report](research/QVM_TRACE_RETRY.md)).
 
 
 
 
925
 
926
 
927
  - [x] RE-627 Trace retry unlink stack and ten-attempt boundary ([report](research/QVM_TRACE_RETRY.md)).
928
+
929
+
930
+ - [x] RE-628 Skipped target relink ordering and duplicate entries ([report](research/QVM_TRACE_RELINK.md)).
docs/research/QVM_TRACE_RELINK.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Skipped target relink ordering and duplicate entries
2
+
3
+ RE-628. Reproduce with `python3 scripts/analyze_qvm_trace_relink.py`; check with `python3 scripts/test_qvm_trace_relink.py`. The [machine report](qvm-trace-relink.json) retains source identity and bounded fixtures.
4
+
5
+ Actual292299–292325 initializes the list cursor and issues one captured native−31 per local56+4×index entry through local52. There is no sorting, reverse traversal or deduplication. Explicit fixtures cover zero, one, reordered pairs, repeated pointers and ten entries. The source list remains intact, and the final cursor equals count. These are source call-order findings; captured native requests do not establish engine relink effects or prove repeated targets are legal live collision outcomes. Candidate bound restoration and shooter rewind restoration are later parts of291641.
6
+
7
+ No original executable/full QVM/native collision/physics/rendering executes. Native responses and legal input domains are supplied or unverified where stated; full runtime/macOS/Linux Rust/Bevy/Solari gameplay remains open.
docs/research/README.md CHANGED
@@ -483,3 +483,6 @@ The extension collector adds five focused tests for native tail calls, command-r
483
 
484
 
485
  [RE-627: Trace retry unlink stack and ten-attempt boundary](QVM_TRACE_RETRY.md). Reproduce with `python3 scripts/analyze_qvm_trace_retry.py`; check with `python3 scripts/test_qvm_trace_retry.py`.
 
 
 
 
483
 
484
 
485
  [RE-627: Trace retry unlink stack and ten-attempt boundary](QVM_TRACE_RETRY.md). Reproduce with `python3 scripts/analyze_qvm_trace_retry.py`; check with `python3 scripts/test_qvm_trace_retry.py`.
486
+
487
+
488
+ [RE-628: Skipped target relink ordering and duplicate entries](QVM_TRACE_RELINK.md). Reproduce with `python3 scripts/analyze_qvm_trace_relink.py`; check with `python3 scripts/test_qvm_trace_relink.py`.
docs/research/qvm-trace-relink.json ADDED
@@ -0,0 +1,1104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Actual292299\u2013292325 with native\u221231 requests captured only. Counts0..10 and duplicate source pointers explicit; native state and legality of repeated skipped targets unverified. Candidate bounds/shooter restoration follow later.",
3
+ "probes": [
4
+ {
5
+ "count": 0,
6
+ "cursor": 0,
7
+ "execution": {
8
+ "byte_writes": [],
9
+ "calls": [],
10
+ "children": [],
11
+ "return": null,
12
+ "trace": null,
13
+ "trace_length": 10,
14
+ "trace_sha256": "0664663dec2b74e33c40d95eadba01e57950efb22cf5768a2835718ab1ec3755"
15
+ },
16
+ "final_stack": [],
17
+ "requests": [],
18
+ "stack": []
19
+ },
20
+ {
21
+ "count": 1,
22
+ "cursor": 1,
23
+ "execution": {
24
+ "byte_writes": [],
25
+ "calls": [
26
+ {
27
+ "args": {
28
+ "8": 34148568
29
+ },
30
+ "instruction": 292313,
31
+ "target": -31
32
+ }
33
+ ],
34
+ "children": [
35
+ {
36
+ "call": {
37
+ "args": {
38
+ "8": 34148568
39
+ },
40
+ "instruction": 292313,
41
+ "target": -31
42
+ },
43
+ "effect": {
44
+ "arguments": {
45
+ "8": 34148568
46
+ },
47
+ "native_effect_not_executed": true
48
+ }
49
+ }
50
+ ],
51
+ "return": null,
52
+ "trace": null,
53
+ "trace_length": 32,
54
+ "trace_sha256": "229ace7061c8e586105fde224ad4f33efb42119c92de39fca7a32a236f1ea038"
55
+ },
56
+ "final_stack": [
57
+ 34148568
58
+ ],
59
+ "requests": [
60
+ {
61
+ "arguments": {
62
+ "8": 34148568
63
+ },
64
+ "native_effect_not_executed": true
65
+ }
66
+ ],
67
+ "stack": [
68
+ 34148568
69
+ ]
70
+ },
71
+ {
72
+ "count": 2,
73
+ "cursor": 2,
74
+ "execution": {
75
+ "byte_writes": [],
76
+ "calls": [
77
+ {
78
+ "args": {
79
+ "8": 34148568
80
+ },
81
+ "instruction": 292313,
82
+ "target": -31
83
+ },
84
+ {
85
+ "args": {
86
+ "8": 34149448
87
+ },
88
+ "instruction": 292313,
89
+ "target": -31
90
+ }
91
+ ],
92
+ "children": [
93
+ {
94
+ "call": {
95
+ "args": {
96
+ "8": 34148568
97
+ },
98
+ "instruction": 292313,
99
+ "target": -31
100
+ },
101
+ "effect": {
102
+ "arguments": {
103
+ "8": 34148568
104
+ },
105
+ "native_effect_not_executed": true
106
+ }
107
+ },
108
+ {
109
+ "call": {
110
+ "args": {
111
+ "8": 34149448
112
+ },
113
+ "instruction": 292313,
114
+ "target": -31
115
+ },
116
+ "effect": {
117
+ "arguments": {
118
+ "8": 34149448
119
+ },
120
+ "native_effect_not_executed": true
121
+ }
122
+ }
123
+ ],
124
+ "return": null,
125
+ "trace": null,
126
+ "trace_length": 54,
127
+ "trace_sha256": "34b0d2723a101e771d630f07b157407a429644cdafba45e7fc5c0a296eb9d602"
128
+ },
129
+ "final_stack": [
130
+ 34148568,
131
+ 34149448
132
+ ],
133
+ "requests": [
134
+ {
135
+ "arguments": {
136
+ "8": 34148568
137
+ },
138
+ "native_effect_not_executed": true
139
+ },
140
+ {
141
+ "arguments": {
142
+ "8": 34149448
143
+ },
144
+ "native_effect_not_executed": true
145
+ }
146
+ ],
147
+ "stack": [
148
+ 34148568,
149
+ 34149448
150
+ ]
151
+ },
152
+ {
153
+ "count": 2,
154
+ "cursor": 2,
155
+ "execution": {
156
+ "byte_writes": [],
157
+ "calls": [
158
+ {
159
+ "args": {
160
+ "8": 34149448
161
+ },
162
+ "instruction": 292313,
163
+ "target": -31
164
+ },
165
+ {
166
+ "args": {
167
+ "8": 34148568
168
+ },
169
+ "instruction": 292313,
170
+ "target": -31
171
+ }
172
+ ],
173
+ "children": [
174
+ {
175
+ "call": {
176
+ "args": {
177
+ "8": 34149448
178
+ },
179
+ "instruction": 292313,
180
+ "target": -31
181
+ },
182
+ "effect": {
183
+ "arguments": {
184
+ "8": 34149448
185
+ },
186
+ "native_effect_not_executed": true
187
+ }
188
+ },
189
+ {
190
+ "call": {
191
+ "args": {
192
+ "8": 34148568
193
+ },
194
+ "instruction": 292313,
195
+ "target": -31
196
+ },
197
+ "effect": {
198
+ "arguments": {
199
+ "8": 34148568
200
+ },
201
+ "native_effect_not_executed": true
202
+ }
203
+ }
204
+ ],
205
+ "return": null,
206
+ "trace": null,
207
+ "trace_length": 54,
208
+ "trace_sha256": "34b0d2723a101e771d630f07b157407a429644cdafba45e7fc5c0a296eb9d602"
209
+ },
210
+ "final_stack": [
211
+ 34149448,
212
+ 34148568
213
+ ],
214
+ "requests": [
215
+ {
216
+ "arguments": {
217
+ "8": 34149448
218
+ },
219
+ "native_effect_not_executed": true
220
+ },
221
+ {
222
+ "arguments": {
223
+ "8": 34148568
224
+ },
225
+ "native_effect_not_executed": true
226
+ }
227
+ ],
228
+ "stack": [
229
+ 34149448,
230
+ 34148568
231
+ ]
232
+ },
233
+ {
234
+ "count": 2,
235
+ "cursor": 2,
236
+ "execution": {
237
+ "byte_writes": [],
238
+ "calls": [
239
+ {
240
+ "args": {
241
+ "8": 34148568
242
+ },
243
+ "instruction": 292313,
244
+ "target": -31
245
+ },
246
+ {
247
+ "args": {
248
+ "8": 34148568
249
+ },
250
+ "instruction": 292313,
251
+ "target": -31
252
+ }
253
+ ],
254
+ "children": [
255
+ {
256
+ "call": {
257
+ "args": {
258
+ "8": 34148568
259
+ },
260
+ "instruction": 292313,
261
+ "target": -31
262
+ },
263
+ "effect": {
264
+ "arguments": {
265
+ "8": 34148568
266
+ },
267
+ "native_effect_not_executed": true
268
+ }
269
+ },
270
+ {
271
+ "call": {
272
+ "args": {
273
+ "8": 34148568
274
+ },
275
+ "instruction": 292313,
276
+ "target": -31
277
+ },
278
+ "effect": {
279
+ "arguments": {
280
+ "8": 34148568
281
+ },
282
+ "native_effect_not_executed": true
283
+ }
284
+ }
285
+ ],
286
+ "return": null,
287
+ "trace": null,
288
+ "trace_length": 54,
289
+ "trace_sha256": "34b0d2723a101e771d630f07b157407a429644cdafba45e7fc5c0a296eb9d602"
290
+ },
291
+ "final_stack": [
292
+ 34148568,
293
+ 34148568
294
+ ],
295
+ "requests": [
296
+ {
297
+ "arguments": {
298
+ "8": 34148568
299
+ },
300
+ "native_effect_not_executed": true
301
+ },
302
+ {
303
+ "arguments": {
304
+ "8": 34148568
305
+ },
306
+ "native_effect_not_executed": true
307
+ }
308
+ ],
309
+ "stack": [
310
+ 34148568,
311
+ 34148568
312
+ ]
313
+ },
314
+ {
315
+ "count": 3,
316
+ "cursor": 3,
317
+ "execution": {
318
+ "byte_writes": [],
319
+ "calls": [
320
+ {
321
+ "args": {
322
+ "8": 34148568
323
+ },
324
+ "instruction": 292313,
325
+ "target": -31
326
+ },
327
+ {
328
+ "args": {
329
+ "8": 34149448
330
+ },
331
+ "instruction": 292313,
332
+ "target": -31
333
+ },
334
+ {
335
+ "args": {
336
+ "8": 34148568
337
+ },
338
+ "instruction": 292313,
339
+ "target": -31
340
+ }
341
+ ],
342
+ "children": [
343
+ {
344
+ "call": {
345
+ "args": {
346
+ "8": 34148568
347
+ },
348
+ "instruction": 292313,
349
+ "target": -31
350
+ },
351
+ "effect": {
352
+ "arguments": {
353
+ "8": 34148568
354
+ },
355
+ "native_effect_not_executed": true
356
+ }
357
+ },
358
+ {
359
+ "call": {
360
+ "args": {
361
+ "8": 34149448
362
+ },
363
+ "instruction": 292313,
364
+ "target": -31
365
+ },
366
+ "effect": {
367
+ "arguments": {
368
+ "8": 34149448
369
+ },
370
+ "native_effect_not_executed": true
371
+ }
372
+ },
373
+ {
374
+ "call": {
375
+ "args": {
376
+ "8": 34148568
377
+ },
378
+ "instruction": 292313,
379
+ "target": -31
380
+ },
381
+ "effect": {
382
+ "arguments": {
383
+ "8": 34148568
384
+ },
385
+ "native_effect_not_executed": true
386
+ }
387
+ }
388
+ ],
389
+ "return": null,
390
+ "trace": null,
391
+ "trace_length": 76,
392
+ "trace_sha256": "237bf9aa38f1c0fccae17caa112f20569517a6a10135520e63525701284620d3"
393
+ },
394
+ "final_stack": [
395
+ 34148568,
396
+ 34149448,
397
+ 34148568
398
+ ],
399
+ "requests": [
400
+ {
401
+ "arguments": {
402
+ "8": 34148568
403
+ },
404
+ "native_effect_not_executed": true
405
+ },
406
+ {
407
+ "arguments": {
408
+ "8": 34149448
409
+ },
410
+ "native_effect_not_executed": true
411
+ },
412
+ {
413
+ "arguments": {
414
+ "8": 34148568
415
+ },
416
+ "native_effect_not_executed": true
417
+ }
418
+ ],
419
+ "stack": [
420
+ 34148568,
421
+ 34149448,
422
+ 34148568
423
+ ]
424
+ },
425
+ {
426
+ "count": 10,
427
+ "cursor": 10,
428
+ "execution": {
429
+ "byte_writes": [],
430
+ "calls": [
431
+ {
432
+ "args": {
433
+ "8": 34147688
434
+ },
435
+ "instruction": 292313,
436
+ "target": -31
437
+ },
438
+ {
439
+ "args": {
440
+ "8": 34148568
441
+ },
442
+ "instruction": 292313,
443
+ "target": -31
444
+ },
445
+ {
446
+ "args": {
447
+ "8": 34149448
448
+ },
449
+ "instruction": 292313,
450
+ "target": -31
451
+ },
452
+ {
453
+ "args": {
454
+ "8": 34150328
455
+ },
456
+ "instruction": 292313,
457
+ "target": -31
458
+ },
459
+ {
460
+ "args": {
461
+ "8": 34151208
462
+ },
463
+ "instruction": 292313,
464
+ "target": -31
465
+ },
466
+ {
467
+ "args": {
468
+ "8": 34152088
469
+ },
470
+ "instruction": 292313,
471
+ "target": -31
472
+ },
473
+ {
474
+ "args": {
475
+ "8": 34152968
476
+ },
477
+ "instruction": 292313,
478
+ "target": -31
479
+ },
480
+ {
481
+ "args": {
482
+ "8": 34153848
483
+ },
484
+ "instruction": 292313,
485
+ "target": -31
486
+ },
487
+ {
488
+ "args": {
489
+ "8": 34154728
490
+ },
491
+ "instruction": 292313,
492
+ "target": -31
493
+ },
494
+ {
495
+ "args": {
496
+ "8": 34155608
497
+ },
498
+ "instruction": 292313,
499
+ "target": -31
500
+ }
501
+ ],
502
+ "children": [
503
+ {
504
+ "call": {
505
+ "args": {
506
+ "8": 34147688
507
+ },
508
+ "instruction": 292313,
509
+ "target": -31
510
+ },
511
+ "effect": {
512
+ "arguments": {
513
+ "8": 34147688
514
+ },
515
+ "native_effect_not_executed": true
516
+ }
517
+ },
518
+ {
519
+ "call": {
520
+ "args": {
521
+ "8": 34148568
522
+ },
523
+ "instruction": 292313,
524
+ "target": -31
525
+ },
526
+ "effect": {
527
+ "arguments": {
528
+ "8": 34148568
529
+ },
530
+ "native_effect_not_executed": true
531
+ }
532
+ },
533
+ {
534
+ "call": {
535
+ "args": {
536
+ "8": 34149448
537
+ },
538
+ "instruction": 292313,
539
+ "target": -31
540
+ },
541
+ "effect": {
542
+ "arguments": {
543
+ "8": 34149448
544
+ },
545
+ "native_effect_not_executed": true
546
+ }
547
+ },
548
+ {
549
+ "call": {
550
+ "args": {
551
+ "8": 34150328
552
+ },
553
+ "instruction": 292313,
554
+ "target": -31
555
+ },
556
+ "effect": {
557
+ "arguments": {
558
+ "8": 34150328
559
+ },
560
+ "native_effect_not_executed": true
561
+ }
562
+ },
563
+ {
564
+ "call": {
565
+ "args": {
566
+ "8": 34151208
567
+ },
568
+ "instruction": 292313,
569
+ "target": -31
570
+ },
571
+ "effect": {
572
+ "arguments": {
573
+ "8": 34151208
574
+ },
575
+ "native_effect_not_executed": true
576
+ }
577
+ },
578
+ {
579
+ "call": {
580
+ "args": {
581
+ "8": 34152088
582
+ },
583
+ "instruction": 292313,
584
+ "target": -31
585
+ },
586
+ "effect": {
587
+ "arguments": {
588
+ "8": 34152088
589
+ },
590
+ "native_effect_not_executed": true
591
+ }
592
+ },
593
+ {
594
+ "call": {
595
+ "args": {
596
+ "8": 34152968
597
+ },
598
+ "instruction": 292313,
599
+ "target": -31
600
+ },
601
+ "effect": {
602
+ "arguments": {
603
+ "8": 34152968
604
+ },
605
+ "native_effect_not_executed": true
606
+ }
607
+ },
608
+ {
609
+ "call": {
610
+ "args": {
611
+ "8": 34153848
612
+ },
613
+ "instruction": 292313,
614
+ "target": -31
615
+ },
616
+ "effect": {
617
+ "arguments": {
618
+ "8": 34153848
619
+ },
620
+ "native_effect_not_executed": true
621
+ }
622
+ },
623
+ {
624
+ "call": {
625
+ "args": {
626
+ "8": 34154728
627
+ },
628
+ "instruction": 292313,
629
+ "target": -31
630
+ },
631
+ "effect": {
632
+ "arguments": {
633
+ "8": 34154728
634
+ },
635
+ "native_effect_not_executed": true
636
+ }
637
+ },
638
+ {
639
+ "call": {
640
+ "args": {
641
+ "8": 34155608
642
+ },
643
+ "instruction": 292313,
644
+ "target": -31
645
+ },
646
+ "effect": {
647
+ "arguments": {
648
+ "8": 34155608
649
+ },
650
+ "native_effect_not_executed": true
651
+ }
652
+ }
653
+ ],
654
+ "return": null,
655
+ "trace": null,
656
+ "trace_length": 230,
657
+ "trace_sha256": "068c3a5f57a9c8ebcf26763eb10e57b00020a57226ba2cd7a68e46ac4433d7c7"
658
+ },
659
+ "final_stack": [
660
+ 34147688,
661
+ 34148568,
662
+ 34149448,
663
+ 34150328,
664
+ 34151208,
665
+ 34152088,
666
+ 34152968,
667
+ 34153848,
668
+ 34154728,
669
+ 34155608
670
+ ],
671
+ "requests": [
672
+ {
673
+ "arguments": {
674
+ "8": 34147688
675
+ },
676
+ "native_effect_not_executed": true
677
+ },
678
+ {
679
+ "arguments": {
680
+ "8": 34148568
681
+ },
682
+ "native_effect_not_executed": true
683
+ },
684
+ {
685
+ "arguments": {
686
+ "8": 34149448
687
+ },
688
+ "native_effect_not_executed": true
689
+ },
690
+ {
691
+ "arguments": {
692
+ "8": 34150328
693
+ },
694
+ "native_effect_not_executed": true
695
+ },
696
+ {
697
+ "arguments": {
698
+ "8": 34151208
699
+ },
700
+ "native_effect_not_executed": true
701
+ },
702
+ {
703
+ "arguments": {
704
+ "8": 34152088
705
+ },
706
+ "native_effect_not_executed": true
707
+ },
708
+ {
709
+ "arguments": {
710
+ "8": 34152968
711
+ },
712
+ "native_effect_not_executed": true
713
+ },
714
+ {
715
+ "arguments": {
716
+ "8": 34153848
717
+ },
718
+ "native_effect_not_executed": true
719
+ },
720
+ {
721
+ "arguments": {
722
+ "8": 34154728
723
+ },
724
+ "native_effect_not_executed": true
725
+ },
726
+ {
727
+ "arguments": {
728
+ "8": 34155608
729
+ },
730
+ "native_effect_not_executed": true
731
+ }
732
+ ],
733
+ "stack": [
734
+ 34147688,
735
+ 34148568,
736
+ 34149448,
737
+ 34150328,
738
+ 34151208,
739
+ 34152088,
740
+ 34152968,
741
+ 34153848,
742
+ 34154728,
743
+ 34155608
744
+ ]
745
+ },
746
+ {
747
+ "count": 10,
748
+ "cursor": 10,
749
+ "execution": {
750
+ "byte_writes": [],
751
+ "calls": [
752
+ {
753
+ "args": {
754
+ "8": 34148568
755
+ },
756
+ "instruction": 292313,
757
+ "target": -31
758
+ },
759
+ {
760
+ "args": {
761
+ "8": 34148568
762
+ },
763
+ "instruction": 292313,
764
+ "target": -31
765
+ },
766
+ {
767
+ "args": {
768
+ "8": 34148568
769
+ },
770
+ "instruction": 292313,
771
+ "target": -31
772
+ },
773
+ {
774
+ "args": {
775
+ "8": 34148568
776
+ },
777
+ "instruction": 292313,
778
+ "target": -31
779
+ },
780
+ {
781
+ "args": {
782
+ "8": 34148568
783
+ },
784
+ "instruction": 292313,
785
+ "target": -31
786
+ },
787
+ {
788
+ "args": {
789
+ "8": 34148568
790
+ },
791
+ "instruction": 292313,
792
+ "target": -31
793
+ },
794
+ {
795
+ "args": {
796
+ "8": 34148568
797
+ },
798
+ "instruction": 292313,
799
+ "target": -31
800
+ },
801
+ {
802
+ "args": {
803
+ "8": 34148568
804
+ },
805
+ "instruction": 292313,
806
+ "target": -31
807
+ },
808
+ {
809
+ "args": {
810
+ "8": 34148568
811
+ },
812
+ "instruction": 292313,
813
+ "target": -31
814
+ },
815
+ {
816
+ "args": {
817
+ "8": 34148568
818
+ },
819
+ "instruction": 292313,
820
+ "target": -31
821
+ }
822
+ ],
823
+ "children": [
824
+ {
825
+ "call": {
826
+ "args": {
827
+ "8": 34148568
828
+ },
829
+ "instruction": 292313,
830
+ "target": -31
831
+ },
832
+ "effect": {
833
+ "arguments": {
834
+ "8": 34148568
835
+ },
836
+ "native_effect_not_executed": true
837
+ }
838
+ },
839
+ {
840
+ "call": {
841
+ "args": {
842
+ "8": 34148568
843
+ },
844
+ "instruction": 292313,
845
+ "target": -31
846
+ },
847
+ "effect": {
848
+ "arguments": {
849
+ "8": 34148568
850
+ },
851
+ "native_effect_not_executed": true
852
+ }
853
+ },
854
+ {
855
+ "call": {
856
+ "args": {
857
+ "8": 34148568
858
+ },
859
+ "instruction": 292313,
860
+ "target": -31
861
+ },
862
+ "effect": {
863
+ "arguments": {
864
+ "8": 34148568
865
+ },
866
+ "native_effect_not_executed": true
867
+ }
868
+ },
869
+ {
870
+ "call": {
871
+ "args": {
872
+ "8": 34148568
873
+ },
874
+ "instruction": 292313,
875
+ "target": -31
876
+ },
877
+ "effect": {
878
+ "arguments": {
879
+ "8": 34148568
880
+ },
881
+ "native_effect_not_executed": true
882
+ }
883
+ },
884
+ {
885
+ "call": {
886
+ "args": {
887
+ "8": 34148568
888
+ },
889
+ "instruction": 292313,
890
+ "target": -31
891
+ },
892
+ "effect": {
893
+ "arguments": {
894
+ "8": 34148568
895
+ },
896
+ "native_effect_not_executed": true
897
+ }
898
+ },
899
+ {
900
+ "call": {
901
+ "args": {
902
+ "8": 34148568
903
+ },
904
+ "instruction": 292313,
905
+ "target": -31
906
+ },
907
+ "effect": {
908
+ "arguments": {
909
+ "8": 34148568
910
+ },
911
+ "native_effect_not_executed": true
912
+ }
913
+ },
914
+ {
915
+ "call": {
916
+ "args": {
917
+ "8": 34148568
918
+ },
919
+ "instruction": 292313,
920
+ "target": -31
921
+ },
922
+ "effect": {
923
+ "arguments": {
924
+ "8": 34148568
925
+ },
926
+ "native_effect_not_executed": true
927
+ }
928
+ },
929
+ {
930
+ "call": {
931
+ "args": {
932
+ "8": 34148568
933
+ },
934
+ "instruction": 292313,
935
+ "target": -31
936
+ },
937
+ "effect": {
938
+ "arguments": {
939
+ "8": 34148568
940
+ },
941
+ "native_effect_not_executed": true
942
+ }
943
+ },
944
+ {
945
+ "call": {
946
+ "args": {
947
+ "8": 34148568
948
+ },
949
+ "instruction": 292313,
950
+ "target": -31
951
+ },
952
+ "effect": {
953
+ "arguments": {
954
+ "8": 34148568
955
+ },
956
+ "native_effect_not_executed": true
957
+ }
958
+ },
959
+ {
960
+ "call": {
961
+ "args": {
962
+ "8": 34148568
963
+ },
964
+ "instruction": 292313,
965
+ "target": -31
966
+ },
967
+ "effect": {
968
+ "arguments": {
969
+ "8": 34148568
970
+ },
971
+ "native_effect_not_executed": true
972
+ }
973
+ }
974
+ ],
975
+ "return": null,
976
+ "trace": null,
977
+ "trace_length": 230,
978
+ "trace_sha256": "068c3a5f57a9c8ebcf26763eb10e57b00020a57226ba2cd7a68e46ac4433d7c7"
979
+ },
980
+ "final_stack": [
981
+ 34148568,
982
+ 34148568,
983
+ 34148568,
984
+ 34148568,
985
+ 34148568,
986
+ 34148568,
987
+ 34148568,
988
+ 34148568,
989
+ 34148568,
990
+ 34148568
991
+ ],
992
+ "requests": [
993
+ {
994
+ "arguments": {
995
+ "8": 34148568
996
+ },
997
+ "native_effect_not_executed": true
998
+ },
999
+ {
1000
+ "arguments": {
1001
+ "8": 34148568
1002
+ },
1003
+ "native_effect_not_executed": true
1004
+ },
1005
+ {
1006
+ "arguments": {
1007
+ "8": 34148568
1008
+ },
1009
+ "native_effect_not_executed": true
1010
+ },
1011
+ {
1012
+ "arguments": {
1013
+ "8": 34148568
1014
+ },
1015
+ "native_effect_not_executed": true
1016
+ },
1017
+ {
1018
+ "arguments": {
1019
+ "8": 34148568
1020
+ },
1021
+ "native_effect_not_executed": true
1022
+ },
1023
+ {
1024
+ "arguments": {
1025
+ "8": 34148568
1026
+ },
1027
+ "native_effect_not_executed": true
1028
+ },
1029
+ {
1030
+ "arguments": {
1031
+ "8": 34148568
1032
+ },
1033
+ "native_effect_not_executed": true
1034
+ },
1035
+ {
1036
+ "arguments": {
1037
+ "8": 34148568
1038
+ },
1039
+ "native_effect_not_executed": true
1040
+ },
1041
+ {
1042
+ "arguments": {
1043
+ "8": 34148568
1044
+ },
1045
+ "native_effect_not_executed": true
1046
+ },
1047
+ {
1048
+ "arguments": {
1049
+ "8": 34148568
1050
+ },
1051
+ "native_effect_not_executed": true
1052
+ }
1053
+ ],
1054
+ "stack": [
1055
+ 34148568,
1056
+ 34148568,
1057
+ 34148568,
1058
+ 34148568,
1059
+ 34148568,
1060
+ 34148568,
1061
+ 34148568,
1062
+ 34148568,
1063
+ 34148568,
1064
+ 34148568
1065
+ ]
1066
+ }
1067
+ ],
1068
+ "sha256": "a589351dfe517470a1b121dd2164714987d9e4577bf00c6486e1540035d7a79d",
1069
+ "source": {
1070
+ "archive": "zUrT43_qvm.pk3",
1071
+ "archive_sha256": "b59bf0c5bedf11d50e0edd220da7eade96de40601e98ae14c54c819047df0796",
1072
+ "member": {
1073
+ "bytes": 983300,
1074
+ "comment_hex": "",
1075
+ "compressed_bytes": 246560,
1076
+ "compression": 8,
1077
+ "crc32": "98ea1768",
1078
+ "create_system": 0,
1079
+ "create_version": 63,
1080
+ "date_time": [
1081
+ 2018,
1082
+ 6,
1083
+ 18,
1084
+ 22,
1085
+ 11,
1086
+ 50
1087
+ ],
1088
+ "directory": false,
1089
+ "entry_index": 2,
1090
+ "external_attr": 32,
1091
+ "extra_hex": "0a0020000000000001001800d1e24e974007d40116dcbf962f1fd20116dcbf962f1fd201",
1092
+ "extract_version": 20,
1093
+ "flags": 0,
1094
+ "header_offset": 221309,
1095
+ "internal_attr": 0,
1096
+ "occurrence": 0,
1097
+ "output": "assets/extracted/zUrT43_qvm.pk3/members/000002/vm/qagame.qvm",
1098
+ "path": "vm/qagame.qvm",
1099
+ "sha256": "a589351dfe517470a1b121dd2164714987d9e4577bf00c6486e1540035d7a79d",
1100
+ "type": "member",
1101
+ "volume": 0
1102
+ }
1103
+ }
1104
+ }
scripts/analyze_qvm_trace_relink.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Skipped-target relinking preserves source order and duplicate entries."""
3
+ from pathlib import Path
4
+ from qvm_research_support import source,execute
5
+ from analyze_qvm_shot_trace_request import LOCAL
6
+ from analyze_qvm_entity_init import POOL,STRIDE
7
+ from analyze_qvm import write_json
8
+
9
+ def relink(ins,m):
10
+ m=dict(m);count=m[LOCAL+52];before=[m[LOCAL+56+4*j]&0xffffffff for j in range(count)];requests=[]
11
+ def link(i,m,a,c):e={'arguments':a,'native_effect_not_executed':True};requests.append(e);return m,c,0,e
12
+ m,_,e=execute(ins,292299,292326,m,(0,0,0),LOCAL,{-31:link});return m,{'count':count,'stack':before,'final_stack':[m[LOCAL+56+4*j]&0xffffffff for j in range(count)],'cursor':m[LOCAL+44],'requests':requests,'execution':e}
13
+
14
+ def main():
15
+ q,raw,h,ins=source();rows=[]
16
+ for indexes in [[],[65],[65,66],[66,65],[65,65],[65,66,65],list(range(64,74)),[65]*10]:
17
+ m={LOCAL+52:len(indexes)};m.update({LOCAL+56+4*j:POOL+i*STRIDE for j,i in enumerate(indexes)});rows.append(relink(ins,m)[1])
18
+ write_json(Path('docs/research/qvm-trace-relink.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Actual292299–292325 with native−31 requests captured only. Counts0..10 and duplicate source pointers explicit; native state and legality of repeated skipped targets unverified. Candidate bounds/shooter restoration follow later.'})
19
+ if __name__=='__main__':main()
scripts/test_qvm_trace_relink.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json,unittest
2
+ from pathlib import Path
3
+ class TraceRelinkTests(unittest.TestCase):
4
+ @classmethod
5
+ def setUpClass(cls):cls.r=json.loads(Path('docs/research/qvm-trace-relink.json').read_text())
6
+ def test_independent_source_order_and_cursor(self):
7
+ self.assertEqual(len(self.r['probes']),8)
8
+ for p in self.r['probes']:self.assertEqual([r['arguments']['8'] for r in p['requests']],p['stack']);self.assertEqual(p['cursor'],p['count']);self.assertEqual(p['stack'],p['final_stack'])
9
+ def test_no_deduplication(self):
10
+ p=self.r['probes'][-1];self.assertEqual(len(p['requests']),10);self.assertEqual(len(set(r['arguments']['8'] for r in p['requests'])),1)
11
+ def test_empty_stack_and_native_only(self):
12
+ self.assertEqual(self.r['probes'][0]['execution']['calls'],[])
13
+ for p in self.r['probes']:self.assertEqual([c['target'] for c in p['execution']['calls']],[-31]*p['count']);self.assertTrue(all(r['native_effect_not_executed'] for r in p['requests']))
14
+ if __name__=='__main__':unittest.main()