qvm: resolve full defuse effect feedback
Browse files- docs/FINDINGS.md +2 -0
- docs/PROVISIONAL_TODO.md +2 -0
- docs/RESEARCH_LEDGER.md +4 -0
- docs/REVERSE_ENGINEERING_TODO.md +2 -0
- docs/research/QVM_EFFECT_DEFUSE_COMPLETE.md +5 -0
- docs/research/README.md +2 -0
- docs/research/qvm-effect-defuse-complete.json +0 -0
- scripts/analyze_qvm_effect_defuse_complete.py +12 -0
- scripts/qvm_defuse_support.py +2 -2
- scripts/qvm_effect_feedback_oracle.py +4 -0
- scripts/qvm_effect_feedback_support.py +10 -0
- scripts/test_qvm_effect_defuse_complete.py +13 -0
- xtask/checks.tsv +4 -0
docs/FINDINGS.md
CHANGED
|
@@ -2003,3 +2003,5 @@ RE-1029: Rust executes the existing score policy and indexed counter update for
|
|
| 2003 |
RE-1030: Sixteen source cases execute defuse start with actual277695/278138 event construction and193620/33715 team radio. Event83 type/class/hash/time and snapped origin are materialized before caller payload/flags and radio routing. Marker state and commands reflect supplied/failed location text. Negative fractional origins snap toward zero. Allocation, native linking and sends remain supplied/captured; this is not direct sound playback. [Evidence](research/QVM_EFFECT_DEFUSE_BEGIN.md).
|
| 2004 |
|
| 2005 |
RE-1031: Rust composes the recovered event constructor and team-radio policies across16 source cases. Metadata, snapped origins, caller event flags and radio commands/marker state match actual source bodies. Explicit allocate/link/radio order replaces the historical sound tag. Tests verify origin snapping and unchanged score/counters, plus rollback of prior start writes on an unsupported origin. Base allocation, linking, location and sending remain boundaries. [Evidence](research/RUST_EFFECT_DEFUSE_BEGIN.md).
|
|
|
|
|
|
|
|
|
| 2003 |
RE-1030: Sixteen source cases execute defuse start with actual277695/278138 event construction and193620/33715 team radio. Event83 type/class/hash/time and snapped origin are materialized before caller payload/flags and radio routing. Marker state and commands reflect supplied/failed location text. Negative fractional origins snap toward zero. Allocation, native linking and sends remain supplied/captured; this is not direct sound playback. [Evidence](research/QVM_EFFECT_DEFUSE_BEGIN.md).
|
| 2004 |
|
| 2005 |
RE-1031: Rust composes the recovered event constructor and team-radio policies across16 source cases. Metadata, snapped origins, caller event flags and radio commands/marker state match actual source bodies. Explicit allocate/link/radio order replaces the historical sound tag. Tests verify origin snapping and unchanged score/counters, plus rollback of prior start writes on an unsupported origin. Base allocation, linking, location and sending remain boundaries. [Evidence](research/RUST_EFFECT_DEFUSE_BEGIN.md).
|
| 2006 |
+
|
| 2007 |
+
RE-1032: Forty-eight coherent source cases execute full defuse gates/lookup/distance with actual constructor, team-radio, score and counter bodies. Reports compare event records, command plans, marker deadlines, player/team scores and counters alongside defuse state. Paused scoring, inactive gates, decoy bombs and missing-bomb boundary are covered. Base allocation, location/formatting and native link/send/ranking/log remain supplied/modeled/captured. No teleport or five-point award is inferred. [Evidence](research/QVM_EFFECT_DEFUSE_COMPLETE.md).
|
docs/PROVISIONAL_TODO.md
CHANGED
|
@@ -2063,3 +2063,5 @@ RE-974–983 completed routing, command rewrite, inactivity, movement-parameter
|
|
| 2063 |
- [x] RE-1030 Resolve defuse start event construction and radio feedback ([evidence](research/QVM_EFFECT_DEFUSE_BEGIN.md)).
|
| 2064 |
|
| 2065 |
- [x] RE-1031 Port resolved defuse event and radio feedback ([evidence](research/RUST_EFFECT_DEFUSE_BEGIN.md)).
|
|
|
|
|
|
|
|
|
| 2063 |
- [x] RE-1030 Resolve defuse start event construction and radio feedback ([evidence](research/QVM_EFFECT_DEFUSE_BEGIN.md)).
|
| 2064 |
|
| 2065 |
- [x] RE-1031 Port resolved defuse event and radio feedback ([evidence](research/RUST_EFFECT_DEFUSE_BEGIN.md)).
|
| 2066 |
+
|
| 2067 |
+
- [x] RE-1032 Resolve full defuse callback effect feedback ([evidence](research/QVM_EFFECT_DEFUSE_COMPLETE.md)).
|
docs/RESEARCH_LEDGER.md
CHANGED
|
@@ -2799,3 +2799,7 @@ Sixteen source cases execute defuse start with actual277695/278138 event constru
|
|
| 2799 |
## 2026-10-29 — RE-1031 Port resolved defuse event and radio feedback
|
| 2800 |
|
| 2801 |
Rust composes the recovered event constructor and team-radio policies across16 source cases. Metadata, snapped origins, caller event flags and radio commands/marker state match actual source bodies. Explicit allocate/link/radio order replaces the historical sound tag. Tests verify origin snapping and unchanged score/counters, plus rollback of prior start writes on an unsupported origin. Base allocation, linking, location and sending remain boundaries. Focused `cargo xtask test-group rust-effect-defuse-begin` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2799 |
## 2026-10-29 — RE-1031 Port resolved defuse event and radio feedback
|
| 2800 |
|
| 2801 |
Rust composes the recovered event constructor and team-radio policies across16 source cases. Metadata, snapped origins, caller event flags and radio commands/marker state match actual source bodies. Explicit allocate/link/radio order replaces the historical sound tag. Tests verify origin snapping and unchanged score/counters, plus rollback of prior start writes on an unsupported origin. Base allocation, linking, location and sending remain boundaries. Focused `cargo xtask test-group rust-effect-defuse-begin` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
|
| 2802 |
+
|
| 2803 |
+
## 2026-10-29 — RE-1032 Resolve full defuse callback effect feedback
|
| 2804 |
+
|
| 2805 |
+
Forty-eight coherent source cases execute full defuse gates/lookup/distance with actual constructor, team-radio, score and counter bodies. Reports compare event records, command plans, marker deadlines, player/team scores and counters alongside defuse state. Paused scoring, inactive gates, decoy bombs and missing-bomb boundary are covered. Base allocation, location/formatting and native link/send/ranking/log remain supplied/modeled/captured. No teleport or five-point award is inferred. Focused `cargo xtask test-group qvm-effect-defuse-complete` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
|
docs/REVERSE_ENGINEERING_TODO.md
CHANGED
|
@@ -2100,3 +2100,5 @@ RE-974–983 recover routing, command rewriting, inactivity and composed setup t
|
|
| 2100 |
- [x] RE-1030 Resolve defuse start event construction and radio feedback ([evidence](research/QVM_EFFECT_DEFUSE_BEGIN.md)).
|
| 2101 |
|
| 2102 |
- [x] RE-1031 Port resolved defuse event and radio feedback ([evidence](research/RUST_EFFECT_DEFUSE_BEGIN.md)).
|
|
|
|
|
|
|
|
|
| 2100 |
- [x] RE-1030 Resolve defuse start event construction and radio feedback ([evidence](research/QVM_EFFECT_DEFUSE_BEGIN.md)).
|
| 2101 |
|
| 2102 |
- [x] RE-1031 Port resolved defuse event and radio feedback ([evidence](research/RUST_EFFECT_DEFUSE_BEGIN.md)).
|
| 2103 |
+
|
| 2104 |
+
- [x] RE-1032 Resolve full defuse callback effect feedback ([evidence](research/QVM_EFFECT_DEFUSE_COMPLETE.md)).
|
docs/research/QVM_EFFECT_DEFUSE_COMPLETE.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Resolve full defuse callback effect feedback
|
| 2 |
+
|
| 3 |
+
RE-1032. Focused validation: `cargo xtask test-group qvm-effect-defuse-complete`. [Machine report](qvm-effect-defuse-complete.json).
|
| 4 |
+
|
| 5 |
+
Forty-eight coherent source cases execute full defuse gates/lookup/distance with actual constructor, team-radio, score and counter bodies. Reports compare event records, command plans, marker deadlines, player/team scores and counters alongside defuse state. Paused scoring, inactive gates, decoy bombs and missing-bomb boundary are covered. Base allocation, location/formatting and native link/send/ranking/log remain supplied/modeled/captured. No teleport or five-point award is inferred.
|
docs/research/README.md
CHANGED
|
@@ -1631,3 +1631,5 @@ The extension collector adds five focused tests for native tail calls, command-r
|
|
| 1631 |
- [RE-1030: Resolve defuse start event construction and radio feedback](QVM_EFFECT_DEFUSE_BEGIN.md).
|
| 1632 |
|
| 1633 |
- [RE-1031: Port resolved defuse event and radio feedback](RUST_EFFECT_DEFUSE_BEGIN.md).
|
|
|
|
|
|
|
|
|
| 1631 |
- [RE-1030: Resolve defuse start event construction and radio feedback](QVM_EFFECT_DEFUSE_BEGIN.md).
|
| 1632 |
|
| 1633 |
- [RE-1031: Port resolved defuse event and radio feedback](RUST_EFFECT_DEFUSE_BEGIN.md).
|
| 1634 |
+
|
| 1635 |
+
- [RE-1032: Resolve full defuse callback effect feedback](QVM_EFFECT_DEFUSE_COMPLETE.md).
|
docs/research/qvm-effect-defuse-complete.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
scripts/analyze_qvm_effect_defuse_complete.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Verified original movement-context source contract."""
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from analyze_qvm import write_json
|
| 4 |
+
from qvm_research_support import source
|
| 5 |
+
from qvm_effect_feedback_support import seed,complete,complete_fixtures
|
| 6 |
+
|
| 7 |
+
def main():
|
| 8 |
+
q,raw,h,ins=source();probes=[]
|
| 9 |
+
for a in complete_fixtures():
|
| 10 |
+
m,b=seed(raw,h,a);m,p,b=complete(ins,m,b,a);p['input']=a;probes.append(p)
|
| 11 |
+
write_json(Path('docs/research/qvm-effect-defuse-complete.json'),dict(source=q['source'],sha256=q['sha256'],probes=probes,limits='Complete153419 with actual class/distance,277695/278138 constructor,193620/33715 radio,205260 score and283463 counter. Base allocation/location/formatting supplied or modeled; native links/sends/ranking/log remain captured.'))
|
| 12 |
+
if __name__=='__main__':main()
|
scripts/qvm_defuse_support.py
CHANGED
|
@@ -106,7 +106,7 @@ def full_seed(m,b,a):
|
|
| 106 |
if a['bomb_first']==3:m[BOMB+540]=0
|
| 107 |
if a['bomb_missing']:m[BOMB+540]=0;m[BOMB+880+540]=0
|
| 108 |
|
| 109 |
-
def full_run(ins,m,b,a):
|
| 110 |
events=[];lookups=[];distances=[]
|
| 111 |
def lookup(i,m,args,bs):
|
| 112 |
assert args[8]==0 and (args[12]&0xffffffff)==HASH
|
|
@@ -117,7 +117,7 @@ def full_run(ins,m,b,a):
|
|
| 117 |
m,value,p,b=run(i,m,65655,65728,40,args,dict(bs),{-107:sqrt},base=ROOT+0x100000)
|
| 118 |
distances.append(value&0xffffffff);return m,value,{'actual_source_child':65655}
|
| 119 |
m,b=frame_args(m,b,{BASE+100:ENTITY if a['entity'] else 0})
|
| 120 |
-
m,p=resume(ins,153420,154088,m,BASE,boundaries=(153612,154087),handlers={**handlers(events),276433:lookup,65655:distance},byte_inputs=b,repeated_calls=True,sync_child_words=True,coherent_memory=True,byte_handlers=True,capture_byte_memory=True,limit=32768)
|
| 121 |
return m,dict(**view(m,a),events=events,lookups=lookups,distances=distances,missing=p['stop']==153612,execution={k:p[k] for k in ['stop','trace_length','trace_sha256']}),p['byte_memory']
|
| 122 |
def full(ins,m,b,a):full_seed(m,b,a);return full_run(ins,m,b,a)
|
| 123 |
|
|
|
|
| 106 |
if a['bomb_first']==3:m[BOMB+540]=0
|
| 107 |
if a['bomb_missing']:m[BOMB+540]=0;m[BOMB+880+540]=0
|
| 108 |
|
| 109 |
+
def full_run(ins,m,b,a,overrides=None):
|
| 110 |
events=[];lookups=[];distances=[]
|
| 111 |
def lookup(i,m,args,bs):
|
| 112 |
assert args[8]==0 and (args[12]&0xffffffff)==HASH
|
|
|
|
| 117 |
m,value,p,b=run(i,m,65655,65728,40,args,dict(bs),{-107:sqrt},base=ROOT+0x100000)
|
| 118 |
distances.append(value&0xffffffff);return m,value,{'actual_source_child':65655}
|
| 119 |
m,b=frame_args(m,b,{BASE+100:ENTITY if a['entity'] else 0})
|
| 120 |
+
m,p=resume(ins,153420,154088,m,BASE,boundaries=(153612,154087),handlers={**handlers(events),**(overrides or {}),276433:lookup,65655:distance},byte_inputs=b,repeated_calls=True,sync_child_words=True,coherent_memory=True,byte_handlers=True,capture_byte_memory=True,limit=32768)
|
| 121 |
return m,dict(**view(m,a),events=events,lookups=lookups,distances=distances,missing=p['stop']==153612,execution={k:p[k] for k in ['stop','trace_length','trace_sha256']}),p['byte_memory']
|
| 122 |
def full(ins,m,b,a):full_seed(m,b,a);return full_run(ins,m,b,a)
|
| 123 |
|
scripts/qvm_effect_feedback_oracle.py
CHANGED
|
@@ -55,3 +55,7 @@ def finish(a):
|
|
| 55 |
def begin(a):
|
| 56 |
from qvm_defuse_oracle import begin
|
| 57 |
return resolve(a,begin(a))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
def begin(a):
|
| 56 |
from qvm_defuse_oracle import begin
|
| 57 |
return resolve(a,begin(a))
|
| 58 |
+
|
| 59 |
+
def complete(a):
|
| 60 |
+
from qvm_defuse_oracle import full
|
| 61 |
+
return resolve(a,full(a))
|
scripts/qvm_effect_feedback_support.py
CHANGED
|
@@ -124,3 +124,13 @@ def begin_fixtures():
|
|
| 124 |
from itertools import product
|
| 125 |
return [dict(defaults(),flags=flags,paused=0,constructed=1,marker=marker,success=success,payload=b'Bomb site'.hex(),origin=[1.9,-1.9,-0.] if marker else [-1.5,3.75,2.]) for flags,marker,success in product([0x80008060,0x80008040,0x80000000,0xffffffff],[0,1],[0,1])]
|
| 126 |
def begin(ins,m,b,a):return resolved_fragment(ins,m,b,a,153774)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
from itertools import product
|
| 125 |
return [dict(defaults(),flags=flags,paused=0,constructed=1,marker=marker,success=success,payload=b'Bomb site'.hex(),origin=[1.9,-1.9,-0.] if marker else [-1.5,3.75,2.]) for flags,marker,success in product([0x80008060,0x80008040,0x80000000,0xffffffff],[0,1],[0,1])]
|
| 126 |
def begin(ins,m,b,a):return resolved_fragment(ins,m,b,a,153774)
|
| 127 |
+
|
| 128 |
+
def complete_fixtures():
|
| 129 |
+
from qvm_defuse_support import full_fixtures
|
| 130 |
+
return [dict(a,paused=paused,constructed=1,marker=1,success=1,payload=b'Bomb site'.hex(),origin=[30. if a['bomb_first'] else a['distance'],0.,0.]) for a in full_fixtures() if a['profile'] in [0,1,2,3,5,16,23,26] for paused in [0,1]]
|
| 131 |
+
|
| 132 |
+
def complete(ins,m,b,a):
|
| 133 |
+
full_seed(m,b,a);feedback_seed(m,b,a,full=True)
|
| 134 |
+
for j in range(max(3,a['count'])):m[POOL+880*j+520]=CPOOL+6336*j
|
| 135 |
+
events=[];radios=[];m,p,b=full_run(ins,m,b,a,overrides=resolved_handlers(events,radios,a))
|
| 136 |
+
p.update(feedback_view(m,radios,a,events));return m,p,b
|
scripts/test_qvm_effect_defuse_complete.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json,unittest
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from qvm_effect_feedback_oracle import complete
|
| 4 |
+
class OriginalTests(unittest.TestCase):
|
| 5 |
+
def test_original_contract(self):
|
| 6 |
+
rows=json.loads(Path('docs/research/qvm-effect-defuse-complete.json').read_text())['probes'];self.assertEqual(len(rows),48)
|
| 7 |
+
for p in rows:
|
| 8 |
+
with self.subTest(input=p['input']):
|
| 9 |
+
for k,v in complete(p['input']).items():self.assertEqual(p[k],v,k)
|
| 10 |
+
def test_fixture_identity_and_trace(self):
|
| 11 |
+
r=json.loads(Path('docs/research/qvm-effect-defuse-complete.json').read_text());self.assertEqual(len(r['sha256']),64)
|
| 12 |
+
self.assertTrue(all(p['execution']['trace_length']>0 for p in r['probes']))
|
| 13 |
+
if __name__=='__main__':unittest.main()
|
xtask/checks.tsv
CHANGED
|
@@ -4478,3 +4478,7 @@ edge crates/urt-gameplay/src/bin/urt-effect-feedback.rs scripts/analyze_rust_eff
|
|
| 4478 |
edge crates/urt-gameplay/src/score.rs scripts/analyze_rust_effect_defuse_begin.py
|
| 4479 |
edge crates/urt-gameplay/src/transition.rs scripts/analyze_rust_effect_defuse_begin.py
|
| 4480 |
edge crates/urt-gameplay/src/defuse.rs scripts/analyze_rust_effect_defuse_begin.py
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4478 |
edge crates/urt-gameplay/src/score.rs scripts/analyze_rust_effect_defuse_begin.py
|
| 4479 |
edge crates/urt-gameplay/src/transition.rs scripts/analyze_rust_effect_defuse_begin.py
|
| 4480 |
edge crates/urt-gameplay/src/defuse.rs scripts/analyze_rust_effect_defuse_begin.py
|
| 4481 |
+
report scripts/analyze_qvm_effect_defuse_complete.py docs/research/qvm-effect-defuse-complete.json
|
| 4482 |
+
edge docs/research/qvm-effect-defuse-complete.json scripts/test_qvm_effect_defuse_complete.py
|
| 4483 |
+
group qvm-effect-defuse-complete scripts/analyze_qvm_effect_defuse_complete.py
|
| 4484 |
+
edge scripts/analyze_qvm_effect_defuse_complete.py scripts/analyze_qvm_resumer_audit.py
|