qvm: held item interruption and override
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_DAMAGE_INTERRUPT.md +7 -0
- docs/research/README.md +3 -0
- docs/research/qvm-damage-interrupt.json +0 -0
- scripts/analyze_qvm_damage_interrupt.py +17 -0
- scripts/test_qvm_damage_interrupt.py +20 -0
docs/ASSET_PIPELINE_TODO.md
CHANGED
|
@@ -793,3 +793,6 @@ Research progress: RE-708 [report](research/QVM_DAMAGE_ATTRIBUTION.md); remainin
|
|
| 793 |
|
| 794 |
|
| 795 |
Research progress: RE-709 [report](research/QVM_DAMAGE_LOCATION_FLAGS.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 793 |
|
| 794 |
|
| 795 |
Research progress: RE-709 [report](research/QVM_DAMAGE_LOCATION_FLAGS.md); remaining native/content/runtime/platform scope stays open.
|
| 796 |
+
|
| 797 |
+
|
| 798 |
+
Research progress: RE-710 [report](research/QVM_DAMAGE_INTERRUPT.md); remaining native/content/runtime/platform scope stays open.
|
docs/FINDINGS.md
CHANGED
|
@@ -1139,3 +1139,6 @@ Bounded qagame paths recover bomb-plant/inactivity correction requests, direct f
|
|
| 1139 |
|
| 1140 |
|
| 1141 |
**RE-709 — Damage location jump table and client flags:** The original32796 jump table ORs client192 bit4 for locations1/2, bit1 for3/4/7/8, and bit2 for5/6/9–14; signed out-of-range locations bypass it. [Evidence](research/QVM_DAMAGE_LOCATION_FLAGS.md).
|
|
|
|
|
|
|
|
|
|
|
|
| 1139 |
|
| 1140 |
|
| 1141 |
**RE-709 — Damage location jump table and client flags:** The original32796 jump table ORs client192 bit4 for locations1/2, bit1 for3/4/7/8, and bit2 for5/6/9–14; signed out-of-range locations bypass it. [Evidence](research/QVM_DAMAGE_LOCATION_FLAGS.md).
|
| 1142 |
+
|
| 1143 |
+
|
| 1144 |
+
**RE-710 — Held-item deadline and final factor override:** Held item low-byte14 at factor≥0.2 or23 at factor≥0.5 writes client6304=time+200 for nonleg locations; global34066516 returns1 after side effects. [Evidence](research/QVM_DAMAGE_INTERRUPT.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -1128,3 +1128,6 @@ Research progress: RE-708 [report](research/QVM_DAMAGE_ATTRIBUTION.md); remainin
|
|
| 1128 |
|
| 1129 |
|
| 1130 |
Research progress: RE-709 [report](research/QVM_DAMAGE_LOCATION_FLAGS.md); remaining native/content/runtime/platform scope stays open.
|
|
|
|
|
|
|
|
|
|
|
|
| 1128 |
|
| 1129 |
|
| 1130 |
Research progress: RE-709 [report](research/QVM_DAMAGE_LOCATION_FLAGS.md); remaining native/content/runtime/platform scope stays open.
|
| 1131 |
+
|
| 1132 |
+
|
| 1133 |
+
Research progress: RE-710 [report](research/QVM_DAMAGE_INTERRUPT.md); remaining native/content/runtime/platform scope stays open.
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -1187,3 +1187,8 @@ Active wounds record attacker pointer at target836 and weapon at client4300; cou
|
|
| 1187 |
## 2026-10-21 — RE-709 Damage location jump table and client flags (separate task commit)
|
| 1188 |
|
| 1189 |
The original32796 jump table ORs client192 bit4 for locations1/2, bit1 for3/4/7/8, and bit2 for5/6/9–14; signed out-of-range locations bypass it. 133 location/initial-flag fixtures verify every original branch target, signed bypass and preservation of unrelated fields. Full suite: 1287 tests pass. Report regenerates byte-identically (195933 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1187 |
## 2026-10-21 — RE-709 Damage location jump table and client flags (separate task commit)
|
| 1188 |
|
| 1189 |
The original32796 jump table ORs client192 bit4 for locations1/2, bit1 for3/4/7/8, and bit2 for5/6/9–14; signed out-of-range locations bypass it. 133 location/initial-flag fixtures verify every original branch target, signed bypass and preservation of unrelated fields. Full suite: 1287 tests pass. Report regenerates byte-identically (195933 bytes). Storage/filter, links and whitespace checks pass. No assets/Rust runtime/shared VM evaluator changed; native/reference/legal/full platform scope remains open.
|
| 1190 |
+
|
| 1191 |
+
|
| 1192 |
+
## 2026-10-21 — RE-710 Held-item deadline and final factor override (separate task commit)
|
| 1193 |
+
|
| 1194 |
+
Held item low-byte14 at factor≥0.2 or23 at factor≥0.5 writes client6304=time+200 for nonleg locations; global34066516 returns1 after side effects. 167 item/threshold/location/override/client/clock fixtures pass independent float32, low-byte and signed-wrap oracles. Full suite: 1291 tests pass. Report regenerates byte-identically (252605 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
|
@@ -1171,3 +1171,6 @@ Purpose: turn the supplied installation into an evidence-backed specification of
|
|
| 1171 |
|
| 1172 |
|
| 1173 |
- [x] RE-709 Damage location jump table and client flags ([report](research/QVM_DAMAGE_LOCATION_FLAGS.md)).
|
|
|
|
|
|
|
|
|
|
|
|
| 1171 |
|
| 1172 |
|
| 1173 |
- [x] RE-709 Damage location jump table and client flags ([report](research/QVM_DAMAGE_LOCATION_FLAGS.md)).
|
| 1174 |
+
|
| 1175 |
+
|
| 1176 |
+
- [x] RE-710 Held-item deadline and final factor override ([report](research/QVM_DAMAGE_INTERRUPT.md)).
|
docs/research/QVM_DAMAGE_INTERRUPT.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Held-item deadline and final factor override
|
| 2 |
+
|
| 3 |
+
RE-710. Reproduce with `python3 scripts/analyze_qvm_damage_interrupt.py`; check with `python3 scripts/test_qvm_damage_interrupt.py`. The [machine report](qvm-damage-interrupt.json) retains source identity and bounded fixtures.
|
| 4 |
+
|
| 5 |
+
Actual290374–290490 reads the active held-slot index client144 and low byte of client312+4×index. Item14 requires factor at least float32(0.2); item23 requires at least0.5. Locations11–14 suppress the client6304=time+200 write. Null clients bypass held reads. Deadline behavior is structurally recovered; its gameplay interpretation remains provisional. Global34066516 nonzero overrides the return to float32(1) only after these effects, leaving local factor and earlier effects intact. Explicit near-overflow clock fixtures expose32-bit wrap without asserting legal server clock domains. No health damage or external calls occur.
|
| 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
|
@@ -729,3 +729,6 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 729 |
|
| 730 |
|
| 731 |
[RE-709: Damage location jump table and client flags](QVM_DAMAGE_LOCATION_FLAGS.md). Reproduce with `python3 scripts/analyze_qvm_damage_location_flags.py`; check with `python3 scripts/test_qvm_damage_location_flags.py`.
|
|
|
|
|
|
|
|
|
|
|
|
| 729 |
|
| 730 |
|
| 731 |
[RE-709: Damage location jump table and client flags](QVM_DAMAGE_LOCATION_FLAGS.md). Reproduce with `python3 scripts/analyze_qvm_damage_location_flags.py`; check with `python3 scripts/test_qvm_damage_location_flags.py`.
|
| 732 |
+
|
| 733 |
+
|
| 734 |
+
[RE-710: Held-item deadline and final factor override](QVM_DAMAGE_INTERRUPT.md). Reproduce with `python3 scripts/analyze_qvm_damage_interrupt.py`; check with `python3 scripts/test_qvm_damage_interrupt.py`.
|
docs/research/qvm-damage-interrupt.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_damage_interrupt.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Held-item interruption deadlines and final damage-factor override."""
|
| 3 |
+
import itertools
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from qvm_research_support import source
|
| 6 |
+
from qvm_damage_support import seed,run
|
| 7 |
+
from analyze_qvm import write_json
|
| 8 |
+
|
| 9 |
+
def main():
|
| 10 |
+
q,raw,h,ins=source();rows=[]
|
| 11 |
+
cases=[dict(held=held,factor=factor,location=loc,override=override) for held,factor,loc,override in itertools.product([0,14,23,0xaa000e,0xaa0017],[0.19999,0.2,0.49999,0.5],[1,10,11,14],[0,1])]
|
| 12 |
+
cases += [dict(client=False,held=held,factor=1,override=override) for held,override in itertools.product([14,23],[0,1])]
|
| 13 |
+
cases += [dict(held=14,factor=0.2,now=now) for now in [-200,0,2147483600]]
|
| 14 |
+
for a in cases:
|
| 15 |
+
_,p=run(ins,seed(raw,h,**a),290374,290491);p['input']=a;rows.append(p)
|
| 16 |
+
write_json(Path('docs/research/qvm-damage-interrupt.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Actual290374..290490 with supplied factor/client/held inventory and clock. Deadline purpose is inferred; final override does not retroactively undo side effects.'})
|
| 17 |
+
if __name__=='__main__':main()
|
scripts/test_qvm_damage_interrupt.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from test_qvm_ground import word,f,n
|
| 4 |
+
class DamageInterruptTests(unittest.TestCase):
|
| 5 |
+
@classmethod
|
| 6 |
+
def setUpClass(cls):cls.ps=json.loads(Path('docs/research/qvm-damage-interrupt.json').read_text())['probes']
|
| 7 |
+
def test_exact_threshold_item_mask_and_location_gates(self):
|
| 8 |
+
for p in self.ps:
|
| 9 |
+
a=p['input'];item=a['held']&255;v=f(a['factor']);active=a.get('client',True) and ((item==14 and v>=n(1045220557)) or (item==23 and v>=0.5)) and a.get('location',3) not in (11,12,13,14)
|
| 10 |
+
self.assertEqual(p['final']['client']['6304'],(a.get('now',5000)+200)&0xffffffff if active else 123)
|
| 11 |
+
def test_return_override_does_not_replace_local_factor(self):
|
| 12 |
+
for p in self.ps:
|
| 13 |
+
a=p['input'];self.assertEqual(p['execution']['return']&0xffffffff,word(1 if a.get('override',0) else a['factor']));self.assertEqual(p['final']['locals']['20'],word(a['factor']))
|
| 14 |
+
def test_signed_deadline_wrap(self):
|
| 15 |
+
p=next(p for p in self.ps if p['input'].get('now')==2147483600);self.assertEqual(p['final']['client']['6304'],2147483800)
|
| 16 |
+
def test_no_calls_or_other_tracked_state_changes(self):
|
| 17 |
+
self.assertEqual(len(self.ps),167)
|
| 18 |
+
for p in self.ps:
|
| 19 |
+
a=dict(p['initial']['client']);b=dict(p['final']['client']);a.pop('6304');b.pop('6304');self.assertEqual(a,b);self.assertEqual(p['execution']['calls'],[])
|
| 20 |
+
if __name__=='__main__':unittest.main()
|