nmarshall commited on
Commit
9334b03
·
1 Parent(s): 2c45626

qvm: resolve full defuse effect feedback

Browse files
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