qvm: recover mode10 animations
Browse files- docs/ASSET_PIPELINE_TODO.md +4 -1
- docs/FINDINGS.md +4 -1
- docs/PROVISIONAL_TODO.md +4 -1
- docs/RESEARCH_LEDGER.md +5 -0
- docs/REVERSE_ENGINEERING_TODO.md +4 -1
- docs/research/QVM_MODE10_ANIMATION.md +7 -0
- docs/research/README.md +4 -1
- docs/research/qvm-mode10-animation.json +0 -0
- scripts/analyze_qvm_mode10_animation.py +18 -0
- scripts/test_qvm_mode10_animation.py +17 -0
- xtask/checks.tsv +3 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -876,4 +876,7 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 876 |
Research progress: RE-736 [report](research/QVM_PROTECTED_UPDATE.md); original assets unchanged.
|
| 877 |
|
| 878 |
|
| 879 |
-
Research progress: RE-737 [report](research/QVM_MODE10_ENTRY.md); original assets unchanged.
|
|
|
|
|
|
|
|
|
|
|
|
| 876 |
Research progress: RE-736 [report](research/QVM_PROTECTED_UPDATE.md); original assets unchanged.
|
| 877 |
|
| 878 |
|
| 879 |
+
Research progress: RE-737 [report](research/QVM_MODE10_ENTRY.md); original assets unchanged.
|
| 880 |
+
|
| 881 |
+
|
| 882 |
+
Research progress: RE-738 [report](research/QVM_MODE10_ANIMATION.md); original assets unchanged.
|
docs/FINDINGS.md
CHANGED
|
@@ -1222,4 +1222,7 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 1222 |
**RE-736 — Complete protected accumulator and completion callbacks:** 152386 consumes float32 accumulated heat, clamps negative progress, completes at32000 and copies resulting progress to a nonnull attacker. [Evidence](research/QVM_PROTECTED_UPDATE.md).
|
| 1223 |
|
| 1224 |
|
| 1225 |
-
**RE-737 — Mode10 interception gates and protected state publication:** 206128 exits outside mode10, state3 or blocked rounds; active entry publishes health50, meter15000 and protected bits with event106. [Evidence](research/QVM_MODE10_ENTRY.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1222 |
**RE-736 — Complete protected accumulator and completion callbacks:** 152386 consumes float32 accumulated heat, clamps negative progress, completes at32000 and copies resulting progress to a nonnull attacker. [Evidence](research/QVM_PROTECTED_UPDATE.md).
|
| 1223 |
|
| 1224 |
|
| 1225 |
+
**RE-737 — Mode10 interception gates and protected state publication:** 206128 exits outside mode10, state3 or blocked rounds; active entry publishes health50, meter15000 and protected bits with event106. [Evidence](research/QVM_MODE10_ENTRY.md).
|
| 1226 |
+
|
| 1227 |
+
|
| 1228 |
+
**RE-738 — Mode10 descriptor and stance animation dispatch:** Original weapon descriptor classes select animation65/66/67/72/78; class4 method22 special-cases66 and stance bit1 selects41/42. [Evidence](research/QVM_MODE10_ANIMATION.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1211,4 +1211,7 @@ RE-725–734 batch: [health, contact and Rust impulse findings](research/QVM_HEA
|
|
| 1211 |
Research progress: RE-736 [report](research/QVM_PROTECTED_UPDATE.md); full native/platform/game scope remains open.
|
| 1212 |
|
| 1213 |
|
| 1214 |
-
Research progress: RE-737 [report](research/QVM_MODE10_ENTRY.md); full native/platform/game scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1211 |
Research progress: RE-736 [report](research/QVM_PROTECTED_UPDATE.md); full native/platform/game scope remains open.
|
| 1212 |
|
| 1213 |
|
| 1214 |
+
Research progress: RE-737 [report](research/QVM_MODE10_ENTRY.md); full native/platform/game scope remains open.
|
| 1215 |
+
|
| 1216 |
+
|
| 1217 |
+
Research progress: RE-738 [report](research/QVM_MODE10_ANIMATION.md); full native/platform/game scope remains open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1331,3 +1331,8 @@ Exactly ten task commits follow1550ce07. Each task passed focused cargo xtask ch
|
|
| 1331 |
## 2026-10-21 — RE-737 Mode10 interception gates and protected state publication
|
| 1332 |
|
| 1333 |
206128 exits outside mode10, state3 or blocked rounds; active entry publishes health50, meter15000 and protected bits with event106. Focused `cargo xtask test-group mode10-entry` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 86046 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1331 |
## 2026-10-21 — RE-737 Mode10 interception gates and protected state publication
|
| 1332 |
|
| 1333 |
206128 exits outside mode10, state3 or blocked rounds; active entry publishes health50, meter15000 and protected bits with event106. Focused `cargo xtask test-group mode10-entry` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 86046 bytes. Full-suite validation is deferred to the tenth batch commit. No original assets, Rust runtime or shared VM evaluator changed.
|
| 1334 |
+
|
| 1335 |
+
|
| 1336 |
+
## 2026-10-21 — RE-738 Mode10 descriptor and stance animation dispatch
|
| 1337 |
+
|
| 1338 |
+
Original weapon descriptor classes select animation65/66/67/72/78; class4 method22 special-cases66 and stance bit1 selects41/42. Focused `cargo xtask test-group mode10-animation` passes (3 Python tests); selected reports regenerate twice byte-identically, with storage, links and whitespace guards. New report: 314561 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
|
@@ -1254,4 +1254,7 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1254 |
- [x] RE-736 Complete protected accumulator and completion callbacks ([report](research/QVM_PROTECTED_UPDATE.md)).
|
| 1255 |
|
| 1256 |
|
| 1257 |
-
- [x] RE-737 Mode10 interception gates and protected state publication ([report](research/QVM_MODE10_ENTRY.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1254 |
- [x] RE-736 Complete protected accumulator and completion callbacks ([report](research/QVM_PROTECTED_UPDATE.md)).
|
| 1255 |
|
| 1256 |
|
| 1257 |
+
- [x] RE-737 Mode10 interception gates and protected state publication ([report](research/QVM_MODE10_ENTRY.md)).
|
| 1258 |
+
|
| 1259 |
+
|
| 1260 |
+
- [x] RE-738 Mode10 descriptor and stance animation dispatch ([report](research/QVM_MODE10_ANIMATION.md)).
|
docs/research/QVM_MODE10_ANIMATION.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Mode10 descriptor and stance animation dispatch
|
| 2 |
+
|
| 3 |
+
RE-738. Reproduce with `python3 scripts/analyze_qvm_mode10_animation.py`; validate with `cargo xtask test-group mode10-animation`. See the [machine report](qvm-mode10-animation.json).
|
| 4 |
+
|
| 5 |
+
Recovered206415..206582 using31 original descriptor slots plus explicit absent/invalid-class overrides, covering every jump-table target. Weapon index comes from the selected client312 slot masked to255. Semantic animation names and mapping to model frame clips remain unverified; numeric dispatch and untouched state are checked independently.
|
| 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
|
@@ -812,4 +812,7 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 812 |
[RE-736: Complete protected accumulator and completion callbacks](QVM_PROTECTED_UPDATE.md).
|
| 813 |
|
| 814 |
|
| 815 |
-
[RE-737: Mode10 interception gates and protected state publication](QVM_MODE10_ENTRY.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 812 |
[RE-736: Complete protected accumulator and completion callbacks](QVM_PROTECTED_UPDATE.md).
|
| 813 |
|
| 814 |
|
| 815 |
+
[RE-737: Mode10 interception gates and protected state publication](QVM_MODE10_ENTRY.md).
|
| 816 |
+
|
| 817 |
+
|
| 818 |
+
[RE-738: Mode10 descriptor and stance animation dispatch](QVM_MODE10_ANIMATION.md).
|
docs/research/qvm-mode10-animation.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_mode10_animation.py
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""206415 animation dispatch from original descriptors plus explicit edge fixtures."""
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from qvm_research_support import source
|
| 5 |
+
from qvm_lifecycle_support import seed,probe
|
| 6 |
+
from analyze_qvm import write_json
|
| 7 |
+
|
| 8 |
+
def main():
|
| 9 |
+
q,raw,h,ins=source();rows=[]
|
| 10 |
+
cases=[dict(weapon=w,flags12=f) for w in range(31) for f in [0,1,8,9]]
|
| 11 |
+
cases += [dict(weapon=1,flags12=f,descriptor=c,descriptor_method=d) for c in [-1,3,5,7] for d in [1,22] for f in [0,1]]
|
| 12 |
+
for a in cases:
|
| 13 |
+
m=seed(raw,h,**a);w=a['weapon']
|
| 14 |
+
if 'descriptor' in a:m[4032+432*w]=a['descriptor'];m[4196+432*w]=a['descriptor_method']
|
| 15 |
+
descriptor={'class':m[4032+432*w],'method':m[4196+432*w]}
|
| 16 |
+
_,p=probe(ins,m,206415,206583);p.update(input=a,descriptor=descriptor);rows.append(p)
|
| 17 |
+
write_json(Path('docs/research/qvm-mode10-animation.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'206415..206582 original31 descriptor slots and explicit dispatch edge overrides. Numeric animations not assigned semantic names; no renderer/animation player runs.'})
|
| 18 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_mode10_animation.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
|
| 4 |
+
def animation(c,d):return {2:66,3:78,4:66 if d==22 else 72,6:65}.get(c,67)
|
| 5 |
+
class Mode10AnimationTests(unittest.TestCase):
|
| 6 |
+
@classmethod
|
| 7 |
+
def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-mode10-animation.json').read_text())['probes']
|
| 8 |
+
def test_independent_descriptor_dispatch_and_stance(self):
|
| 9 |
+
for p in self.ps:
|
| 10 |
+
c=dict(p['initial']['client']);c['84']=animation(p['descriptor']['class'],p['descriptor']['method']);c['76']=42 if p['input']['flags12']&1 else 41
|
| 11 |
+
self.assertEqual(p['final'],{**p['initial'],'client':c})
|
| 12 |
+
def test_original_and_explicit_edge_domains(self):
|
| 13 |
+
self.assertEqual(len(self.ps),140);self.assertEqual({p['descriptor']['class'] for p in self.ps},set(range(-1,8)))
|
| 14 |
+
self.assertEqual({p['final']['client']['84'] for p in self.ps},{65,66,67,72,78})
|
| 15 |
+
def test_no_children_and_exact_boundary(self):
|
| 16 |
+
for p in self.ps:self.assertEqual(p['execution']['stop'],206583);self.assertEqual(p['execution']['calls'],[])
|
| 17 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -1176,3 +1176,6 @@ group lifecycle scripts/analyze_qvm_protected_update.py
|
|
| 1176 |
report scripts/analyze_qvm_mode10_entry.py docs/research/qvm-mode10-entry.json
|
| 1177 |
edge docs/research/qvm-mode10-entry.json scripts/test_qvm_mode10_entry.py
|
| 1178 |
group mode10-entry scripts/analyze_qvm_mode10_entry.py
|
|
|
|
|
|
|
|
|
|
|
|
| 1176 |
report scripts/analyze_qvm_mode10_entry.py docs/research/qvm-mode10-entry.json
|
| 1177 |
edge docs/research/qvm-mode10-entry.json scripts/test_qvm_mode10_entry.py
|
| 1178 |
group mode10-entry scripts/analyze_qvm_mode10_entry.py
|
| 1179 |
+
report scripts/analyze_qvm_mode10_animation.py docs/research/qvm-mode10-animation.json
|
| 1180 |
+
edge docs/research/qvm-mode10-animation.json scripts/test_qvm_mode10_animation.py
|
| 1181 |
+
group mode10-animation scripts/analyze_qvm_mode10_animation.py
|