nmarshall commited on
Commit
855e955
·
1 Parent(s): f4ec049

gameplay: port team radio routing feedback

Browse files
crates/urt-gameplay/src/bin/urt-effect-feedback.rs CHANGED
@@ -26,6 +26,58 @@ fn main() {
26
  list(&c)
27
  );
28
  }
 
29
  _ => panic!("unknown contract"),
30
  }
31
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  list(&c)
27
  );
28
  }
29
+ "radio" => println!("{}", radio(&w)),
30
  _ => panic!("unknown contract"),
31
  }
32
  }
33
+
34
+ fn commands(v: &[(usize, Vec<u8>)]) -> String {
35
+ v.iter()
36
+ .map(|(slot, text)| format!(r#"{{"slot":{},"text":"{}"}}"#, slot, hex(text)))
37
+ .collect::<Vec<_>>()
38
+ .join(",")
39
+ }
40
+ fn radio(w: &[u32]) -> String {
41
+ assert!(w.len() >= 13);
42
+ let n = w[12] as usize;
43
+ assert_eq!(w.len(), 13 + n + 2 * (w[4] as usize).max(3));
44
+ let clients = w[13 + n..]
45
+ .chunks_exact(2)
46
+ .map(|c| RadioClient {
47
+ connection: c[0],
48
+ team: c[1],
49
+ })
50
+ .collect::<Vec<_>>();
51
+ let mut marker = if w[7] != 0 {
52
+ Some(RadioMarker {
53
+ deadline: 17,
54
+ active: 18,
55
+ })
56
+ } else {
57
+ None
58
+ };
59
+ let o = team_radio(
60
+ &mut marker,
61
+ &clients,
62
+ &RadioInput {
63
+ follow: w[1],
64
+ health: w[2],
65
+ team: w[3],
66
+ slot: 2,
67
+ mode: w[0],
68
+ count: w[4] as usize,
69
+ tick: w[8],
70
+ code: w[9],
71
+ success: w[10] != 0,
72
+ payload: w[13..13 + n].iter().map(|v| *v as u8).collect(),
73
+ },
74
+ )
75
+ .unwrap();
76
+ let m = marker.map(|v| [v.deadline, v.active]).unwrap_or([17, 18]);
77
+ format!(
78
+ r#"{{"commands":[{}],"getter_calls":{},"marker":{}}}"#,
79
+ commands(&o.commands),
80
+ o.getter_calls,
81
+ list(&m)
82
+ )
83
+ }
crates/urt-gameplay/src/effect_feedback.rs CHANGED
@@ -26,3 +26,158 @@ mod counter_tests {
26
  assert_eq!(c, old);
27
  }
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  assert_eq!(c, old);
27
  }
28
  }
29
+
30
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
31
+ pub struct RadioClient {
32
+ pub connection: u32,
33
+ pub team: u32,
34
+ }
35
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
36
+ pub struct RadioMarker {
37
+ pub deadline: u32,
38
+ pub active: u32,
39
+ }
40
+ #[derive(Clone, Debug, PartialEq, Eq)]
41
+ pub struct RadioInput {
42
+ pub follow: u32,
43
+ pub health: u32,
44
+ pub team: u32,
45
+ pub slot: i32,
46
+ pub mode: u32,
47
+ pub count: usize,
48
+ pub tick: u32,
49
+ pub code: u32,
50
+ pub success: bool,
51
+ pub payload: Vec<u8>,
52
+ }
53
+ #[derive(Clone, Debug, Default, PartialEq, Eq)]
54
+ pub struct RadioOutcome {
55
+ pub commands: Vec<(usize, Vec<u8>)>,
56
+ pub getter_calls: u32,
57
+ }
58
+ /// Original193620 routing with supplied268637 text. Fixed rsay formatting keeps
59
+ /// payload bytes unchanged, including quotes; native sends are returned plans.
60
+ pub fn team_radio(
61
+ marker: &mut Option<RadioMarker>,
62
+ clients: &[RadioClient],
63
+ input: &RadioInput,
64
+ ) -> Result<RadioOutcome, Error> {
65
+ let mut out = RadioOutcome::default();
66
+ if input.follow != 0 || input.health as i32 <= 0 || input.team == 3 {
67
+ return Ok(out);
68
+ }
69
+ if !(0..64).contains(&input.slot)
70
+ || input.count > 64
71
+ || input.count > clients.len()
72
+ || input.payload.len() >= 150
73
+ || input.payload.contains(&0)
74
+ {
75
+ return Err(Error::InvalidInput);
76
+ }
77
+ out.getter_calls = 1;
78
+ let mode = input.mode as i32;
79
+ let team_mode = mode >= 3 && mode != 9 && mode != 11;
80
+ let mut text = format!("rsay {} -1 {} \"", input.slot, input.code as i32).into_bytes();
81
+ if input.success {
82
+ text.extend(&input.payload);
83
+ }
84
+ text.push(b'"');
85
+ for (j, c) in clients[..input.count].iter().enumerate() {
86
+ if c.connection == 2 && (team_mode || mode == 9) && c.team == input.team {
87
+ out.commands.push((j, text.clone()));
88
+ }
89
+ }
90
+ if !out.commands.is_empty() {
91
+ if let Some(marker) = marker {
92
+ marker.deadline = input.tick.wrapping_add(3500);
93
+ marker.active = 1;
94
+ }
95
+ }
96
+ Ok(out)
97
+ }
98
+ #[cfg(test)]
99
+ mod radio_tests {
100
+ use super::*;
101
+ fn input() -> RadioInput {
102
+ RadioInput {
103
+ follow: 0,
104
+ health: 1,
105
+ team: 1,
106
+ slot: 2,
107
+ mode: 9,
108
+ count: 3,
109
+ tick: u32::MAX,
110
+ code: 7,
111
+ success: true,
112
+ payload: b"P\"q".to_vec(),
113
+ }
114
+ }
115
+ #[test]
116
+ fn mode9_routes_only_connected_teammates_and_wraps_marker() {
117
+ let c = [
118
+ RadioClient {
119
+ connection: 2,
120
+ team: 1,
121
+ },
122
+ RadioClient {
123
+ connection: 2,
124
+ team: 2,
125
+ },
126
+ RadioClient {
127
+ connection: 1,
128
+ team: 1,
129
+ },
130
+ ];
131
+ let mut m = Some(RadioMarker {
132
+ deadline: 17,
133
+ active: 18,
134
+ });
135
+ let o = team_radio(&mut m, &c, &input()).unwrap();
136
+ assert_eq!(o.commands, vec![(0, b"rsay 2 -1 7 \"P\"q\"".to_vec())]);
137
+ assert_eq!(
138
+ m,
139
+ Some(RadioMarker {
140
+ deadline: 3499,
141
+ active: 1
142
+ })
143
+ );
144
+ }
145
+ #[test]
146
+ fn no_recipients_and_invalid_payload_preserve_marker() {
147
+ let c = [RadioClient {
148
+ connection: 2,
149
+ team: 1,
150
+ }; 3];
151
+ let mut m = Some(RadioMarker {
152
+ deadline: 17,
153
+ active: 18,
154
+ });
155
+ let old = m;
156
+ assert!(
157
+ team_radio(
158
+ &mut m,
159
+ &c,
160
+ &RadioInput {
161
+ mode: 11,
162
+ ..input()
163
+ }
164
+ )
165
+ .unwrap()
166
+ .commands
167
+ .is_empty()
168
+ );
169
+ assert_eq!(m, old);
170
+ assert!(
171
+ team_radio(
172
+ &mut m,
173
+ &c,
174
+ &RadioInput {
175
+ payload: vec![1; 150],
176
+ ..input()
177
+ }
178
+ )
179
+ .is_err()
180
+ );
181
+ assert_eq!(m, old);
182
+ }
183
+ }
docs/FINDINGS.md CHANGED
@@ -1993,3 +1993,5 @@ RE-1024: Twelve original-QVM cases prove283463 increments exactly client3036+4*i
1993
  RE-1025: Rust implements caller-indexed wrapping counter increments across12 source cases. Index5 increases one word by1, not five score points; invalid indices preserve the supplied window. Historical enum/report tags remain compatible but now carry explicit score/radio/counter semantic corrections. True counter-enum ownership and larger state lifecycle remain open. [Evidence](research/RUST_EFFECT_COUNTER.md).
1994
 
1995
  RE-1026: Thirty-four original-QVM scenarios recover193620 with actual mode classifier33715. Live non-following non-spectator sender obtains supplied location text, then sends rsay sender/-1/type/text to connected same-team recipients in team modes or mode9. Mode11 and signed negative modes do not route. Sender marker84 becomes tick+3500 and marker204 becomes1 only when a command is sent. Empty/quoted payloads, failed text lookup, zero/64 counts and wrap are covered. Native sending and location lookup remain boundaries; fixed formatter is modeled. [Evidence](research/QVM_EFFECT_RADIO.md).
 
 
 
1993
  RE-1025: Rust implements caller-indexed wrapping counter increments across12 source cases. Index5 increases one word by1, not five score points; invalid indices preserve the supplied window. Historical enum/report tags remain compatible but now carry explicit score/radio/counter semantic corrections. True counter-enum ownership and larger state lifecycle remain open. [Evidence](research/RUST_EFFECT_COUNTER.md).
1994
 
1995
  RE-1026: Thirty-four original-QVM scenarios recover193620 with actual mode classifier33715. Live non-following non-spectator sender obtains supplied location text, then sends rsay sender/-1/type/text to connected same-team recipients in team modes or mode9. Mode11 and signed negative modes do not route. Sender marker84 becomes tick+3500 and marker204 becomes1 only when a command is sent. Empty/quoted payloads, failed text lookup, zero/64 counts and wrap are covered. Native sending and location lookup remain boundaries; fixed formatter is modeled. [Evidence](research/QVM_EFFECT_RADIO.md).
1996
+
1997
+ RE-1027: Rust matches34 source team-radio scenarios, including the mode9 exception, mode11/signed exclusions, failed location text, raw quote preservation and64-recipient tables. Only actual sends update an existing marker; empty routing leaves it unchanged. Tests cover connected same-team routing, wrapped marker deadlines and invalid payload atomicity. Text location and native network sends remain boundaries. [Evidence](research/RUST_EFFECT_RADIO.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -2053,3 +2053,5 @@ RE-974–983 completed routing, command rewrite, inactivity, movement-parameter
2053
  - [x] RE-1025 Port indexed objective counters and label compatibility notes ([evidence](research/RUST_EFFECT_COUNTER.md)).
2054
 
2055
  - [x] RE-1026 Recover team radio routing and marker state ([evidence](research/QVM_EFFECT_RADIO.md)).
 
 
 
2053
  - [x] RE-1025 Port indexed objective counters and label compatibility notes ([evidence](research/RUST_EFFECT_COUNTER.md)).
2054
 
2055
  - [x] RE-1026 Recover team radio routing and marker state ([evidence](research/QVM_EFFECT_RADIO.md)).
2056
+
2057
+ - [x] RE-1027 Port team radio command planning and marker feedback ([evidence](research/RUST_EFFECT_RADIO.md)).
docs/RESEARCH_LEDGER.md CHANGED
@@ -2779,3 +2779,7 @@ Rust implements caller-indexed wrapping counter increments across12 source cases
2779
  ## 2026-10-29 — RE-1026 Recover team radio routing and marker state
2780
 
2781
  Thirty-four original-QVM scenarios recover193620 with actual mode classifier33715. Live non-following non-spectator sender obtains supplied location text, then sends rsay sender/-1/type/text to connected same-team recipients in team modes or mode9. Mode11 and signed negative modes do not route. Sender marker84 becomes tick+3500 and marker204 becomes1 only when a command is sent. Empty/quoted payloads, failed text lookup, zero/64 counts and wrap are covered. Native sending and location lookup remain boundaries; fixed formatter is modeled. Focused `cargo xtask test-group qvm-effect-radio` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
 
 
 
 
 
2779
  ## 2026-10-29 — RE-1026 Recover team radio routing and marker state
2780
 
2781
  Thirty-four original-QVM scenarios recover193620 with actual mode classifier33715. Live non-following non-spectator sender obtains supplied location text, then sends rsay sender/-1/type/text to connected same-team recipients in team modes or mode9. Mode11 and signed negative modes do not route. Sender marker84 becomes tick+3500 and marker204 becomes1 only when a command is sent. Empty/quoted payloads, failed text lookup, zero/64 counts and wrap are covered. Native sending and location lookup remain boundaries; fixed formatter is modeled. Focused `cargo xtask test-group qvm-effect-radio` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
2782
+
2783
+ ## 2026-10-29 — RE-1027 Port team radio command planning and marker feedback
2784
+
2785
+ Rust matches34 source team-radio scenarios, including the mode9 exception, mode11/signed exclusions, failed location text, raw quote preservation and64-recipient tables. Only actual sends update an existing marker; empty routing leaves it unchanged. Tests cover connected same-team routing, wrapped marker deadlines and invalid payload atomicity. Text location and native network sends remain boundaries. Focused `cargo xtask test-group rust-effect-radio` 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
@@ -2090,3 +2090,5 @@ RE-974–983 recover routing, command rewriting, inactivity and composed setup t
2090
  - [x] RE-1025 Port indexed objective counters and label compatibility notes ([evidence](research/RUST_EFFECT_COUNTER.md)).
2091
 
2092
  - [x] RE-1026 Recover team radio routing and marker state ([evidence](research/QVM_EFFECT_RADIO.md)).
 
 
 
2090
  - [x] RE-1025 Port indexed objective counters and label compatibility notes ([evidence](research/RUST_EFFECT_COUNTER.md)).
2091
 
2092
  - [x] RE-1026 Recover team radio routing and marker state ([evidence](research/QVM_EFFECT_RADIO.md)).
2093
+
2094
+ - [x] RE-1027 Port team radio command planning and marker feedback ([evidence](research/RUST_EFFECT_RADIO.md)).
docs/research/README.md CHANGED
@@ -1621,3 +1621,5 @@ The extension collector adds five focused tests for native tail calls, command-r
1621
  - [RE-1025: Port indexed objective counters and label compatibility notes](RUST_EFFECT_COUNTER.md).
1622
 
1623
  - [RE-1026: Recover team radio routing and marker state](QVM_EFFECT_RADIO.md).
 
 
 
1621
  - [RE-1025: Port indexed objective counters and label compatibility notes](RUST_EFFECT_COUNTER.md).
1622
 
1623
  - [RE-1026: Recover team radio routing and marker state](QVM_EFFECT_RADIO.md).
1624
+
1625
+ - [RE-1027: Port team radio command planning and marker feedback](RUST_EFFECT_RADIO.md).
docs/research/RUST_EFFECT_RADIO.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Port team radio command planning and marker feedback
2
+
3
+ RE-1027. Focused validation: `cargo xtask test-group rust-effect-radio`. [Machine report](rust-effect-radio.json).
4
+
5
+ Rust matches34 source team-radio scenarios, including the mode9 exception, mode11/signed exclusions, failed location text, raw quote preservation and64-recipient tables. Only actual sends update an existing marker; empty routing leaves it unchanged. Tests cover connected same-team routing, wrapped marker deadlines and invalid payload atomicity. Text location and native network sends remain boundaries.
docs/research/rust-effect-radio.json ADDED
@@ -0,0 +1,1371 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Finite source/Rust contract parity; native time/file/network replies remain supplied or captured.",
3
+ "probes": [
4
+ {
5
+ "rust": {
6
+ "commands": [
7
+ {
8
+ "slot": 0,
9
+ "text": "727361792032202d312037202222"
10
+ },
11
+ {
12
+ "slot": 2,
13
+ "text": "727361792032202d312037202222"
14
+ }
15
+ ],
16
+ "getter_calls": 1,
17
+ "marker": [
18
+ 13500,
19
+ 1
20
+ ]
21
+ },
22
+ "source": {
23
+ "commands": [
24
+ {
25
+ "slot": 0,
26
+ "text": "727361792032202d312037202222"
27
+ },
28
+ {
29
+ "slot": 2,
30
+ "text": "727361792032202d312037202222"
31
+ }
32
+ ],
33
+ "getter_calls": 1,
34
+ "marker": [
35
+ 13500,
36
+ 1
37
+ ]
38
+ }
39
+ },
40
+ {
41
+ "rust": {
42
+ "commands": [
43
+ {
44
+ "slot": 0,
45
+ "text": "727361792032202d3120372022426f6d62207369746522"
46
+ },
47
+ {
48
+ "slot": 2,
49
+ "text": "727361792032202d3120372022426f6d62207369746522"
50
+ }
51
+ ],
52
+ "getter_calls": 1,
53
+ "marker": [
54
+ 13500,
55
+ 1
56
+ ]
57
+ },
58
+ "source": {
59
+ "commands": [
60
+ {
61
+ "slot": 0,
62
+ "text": "727361792032202d3120372022426f6d62207369746522"
63
+ },
64
+ {
65
+ "slot": 2,
66
+ "text": "727361792032202d3120372022426f6d62207369746522"
67
+ }
68
+ ],
69
+ "getter_calls": 1,
70
+ "marker": [
71
+ 13500,
72
+ 1
73
+ ]
74
+ }
75
+ },
76
+ {
77
+ "rust": {
78
+ "commands": [],
79
+ "getter_calls": 0,
80
+ "marker": [
81
+ 17,
82
+ 18
83
+ ]
84
+ },
85
+ "source": {
86
+ "commands": [],
87
+ "getter_calls": 0,
88
+ "marker": [
89
+ 17,
90
+ 18
91
+ ]
92
+ }
93
+ },
94
+ {
95
+ "rust": {
96
+ "commands": [],
97
+ "getter_calls": 0,
98
+ "marker": [
99
+ 17,
100
+ 18
101
+ ]
102
+ },
103
+ "source": {
104
+ "commands": [],
105
+ "getter_calls": 0,
106
+ "marker": [
107
+ 17,
108
+ 18
109
+ ]
110
+ }
111
+ },
112
+ {
113
+ "rust": {
114
+ "commands": [],
115
+ "getter_calls": 0,
116
+ "marker": [
117
+ 17,
118
+ 18
119
+ ]
120
+ },
121
+ "source": {
122
+ "commands": [],
123
+ "getter_calls": 0,
124
+ "marker": [
125
+ 17,
126
+ 18
127
+ ]
128
+ }
129
+ },
130
+ {
131
+ "rust": {
132
+ "commands": [],
133
+ "getter_calls": 0,
134
+ "marker": [
135
+ 17,
136
+ 18
137
+ ]
138
+ },
139
+ "source": {
140
+ "commands": [],
141
+ "getter_calls": 0,
142
+ "marker": [
143
+ 17,
144
+ 18
145
+ ]
146
+ }
147
+ },
148
+ {
149
+ "rust": {
150
+ "commands": [],
151
+ "getter_calls": 0,
152
+ "marker": [
153
+ 17,
154
+ 18
155
+ ]
156
+ },
157
+ "source": {
158
+ "commands": [],
159
+ "getter_calls": 0,
160
+ "marker": [
161
+ 17,
162
+ 18
163
+ ]
164
+ }
165
+ },
166
+ {
167
+ "rust": {
168
+ "commands": [],
169
+ "getter_calls": 0,
170
+ "marker": [
171
+ 17,
172
+ 18
173
+ ]
174
+ },
175
+ "source": {
176
+ "commands": [],
177
+ "getter_calls": 0,
178
+ "marker": [
179
+ 17,
180
+ 18
181
+ ]
182
+ }
183
+ },
184
+ {
185
+ "rust": {
186
+ "commands": [],
187
+ "getter_calls": 0,
188
+ "marker": [
189
+ 17,
190
+ 18
191
+ ]
192
+ },
193
+ "source": {
194
+ "commands": [],
195
+ "getter_calls": 0,
196
+ "marker": [
197
+ 17,
198
+ 18
199
+ ]
200
+ }
201
+ },
202
+ {
203
+ "rust": {
204
+ "commands": [],
205
+ "getter_calls": 0,
206
+ "marker": [
207
+ 17,
208
+ 18
209
+ ]
210
+ },
211
+ "source": {
212
+ "commands": [],
213
+ "getter_calls": 0,
214
+ "marker": [
215
+ 17,
216
+ 18
217
+ ]
218
+ }
219
+ },
220
+ {
221
+ "rust": {
222
+ "commands": [],
223
+ "getter_calls": 1,
224
+ "marker": [
225
+ 17,
226
+ 18
227
+ ]
228
+ },
229
+ "source": {
230
+ "commands": [],
231
+ "getter_calls": 1,
232
+ "marker": [
233
+ 17,
234
+ 18
235
+ ]
236
+ }
237
+ },
238
+ {
239
+ "rust": {
240
+ "commands": [],
241
+ "getter_calls": 1,
242
+ "marker": [
243
+ 17,
244
+ 18
245
+ ]
246
+ },
247
+ "source": {
248
+ "commands": [],
249
+ "getter_calls": 1,
250
+ "marker": [
251
+ 17,
252
+ 18
253
+ ]
254
+ }
255
+ },
256
+ {
257
+ "rust": {
258
+ "commands": [
259
+ {
260
+ "slot": 0,
261
+ "text": "727361792032202d312037202222"
262
+ },
263
+ {
264
+ "slot": 2,
265
+ "text": "727361792032202d312037202222"
266
+ }
267
+ ],
268
+ "getter_calls": 1,
269
+ "marker": [
270
+ 13500,
271
+ 1
272
+ ]
273
+ },
274
+ "source": {
275
+ "commands": [
276
+ {
277
+ "slot": 0,
278
+ "text": "727361792032202d312037202222"
279
+ },
280
+ {
281
+ "slot": 2,
282
+ "text": "727361792032202d312037202222"
283
+ }
284
+ ],
285
+ "getter_calls": 1,
286
+ "marker": [
287
+ 13500,
288
+ 1
289
+ ]
290
+ }
291
+ },
292
+ {
293
+ "rust": {
294
+ "commands": [
295
+ {
296
+ "slot": 0,
297
+ "text": "727361792032202d3120372022426f6d62207369746522"
298
+ },
299
+ {
300
+ "slot": 2,
301
+ "text": "727361792032202d3120372022426f6d62207369746522"
302
+ }
303
+ ],
304
+ "getter_calls": 1,
305
+ "marker": [
306
+ 13500,
307
+ 1
308
+ ]
309
+ },
310
+ "source": {
311
+ "commands": [
312
+ {
313
+ "slot": 0,
314
+ "text": "727361792032202d3120372022426f6d62207369746522"
315
+ },
316
+ {
317
+ "slot": 2,
318
+ "text": "727361792032202d3120372022426f6d62207369746522"
319
+ }
320
+ ],
321
+ "getter_calls": 1,
322
+ "marker": [
323
+ 13500,
324
+ 1
325
+ ]
326
+ }
327
+ },
328
+ {
329
+ "rust": {
330
+ "commands": [
331
+ {
332
+ "slot": 0,
333
+ "text": "727361792032202d312037202222"
334
+ },
335
+ {
336
+ "slot": 2,
337
+ "text": "727361792032202d312037202222"
338
+ }
339
+ ],
340
+ "getter_calls": 1,
341
+ "marker": [
342
+ 13500,
343
+ 1
344
+ ]
345
+ },
346
+ "source": {
347
+ "commands": [
348
+ {
349
+ "slot": 0,
350
+ "text": "727361792032202d312037202222"
351
+ },
352
+ {
353
+ "slot": 2,
354
+ "text": "727361792032202d312037202222"
355
+ }
356
+ ],
357
+ "getter_calls": 1,
358
+ "marker": [
359
+ 13500,
360
+ 1
361
+ ]
362
+ }
363
+ },
364
+ {
365
+ "rust": {
366
+ "commands": [
367
+ {
368
+ "slot": 0,
369
+ "text": "727361792032202d312037202250227122"
370
+ },
371
+ {
372
+ "slot": 2,
373
+ "text": "727361792032202d312037202250227122"
374
+ }
375
+ ],
376
+ "getter_calls": 1,
377
+ "marker": [
378
+ 13500,
379
+ 1
380
+ ]
381
+ },
382
+ "source": {
383
+ "commands": [
384
+ {
385
+ "slot": 0,
386
+ "text": "727361792032202d312037202250227122"
387
+ },
388
+ {
389
+ "slot": 2,
390
+ "text": "727361792032202d312037202250227122"
391
+ }
392
+ ],
393
+ "getter_calls": 1,
394
+ "marker": [
395
+ 13500,
396
+ 1
397
+ ]
398
+ }
399
+ },
400
+ {
401
+ "rust": {
402
+ "commands": [],
403
+ "getter_calls": 1,
404
+ "marker": [
405
+ 17,
406
+ 18
407
+ ]
408
+ },
409
+ "source": {
410
+ "commands": [],
411
+ "getter_calls": 1,
412
+ "marker": [
413
+ 17,
414
+ 18
415
+ ]
416
+ }
417
+ },
418
+ {
419
+ "rust": {
420
+ "commands": [],
421
+ "getter_calls": 1,
422
+ "marker": [
423
+ 17,
424
+ 18
425
+ ]
426
+ },
427
+ "source": {
428
+ "commands": [],
429
+ "getter_calls": 1,
430
+ "marker": [
431
+ 17,
432
+ 18
433
+ ]
434
+ }
435
+ },
436
+ {
437
+ "rust": {
438
+ "commands": [],
439
+ "getter_calls": 1,
440
+ "marker": [
441
+ 17,
442
+ 18
443
+ ]
444
+ },
445
+ "source": {
446
+ "commands": [],
447
+ "getter_calls": 1,
448
+ "marker": [
449
+ 17,
450
+ 18
451
+ ]
452
+ }
453
+ },
454
+ {
455
+ "rust": {
456
+ "commands": [],
457
+ "getter_calls": 1,
458
+ "marker": [
459
+ 17,
460
+ 18
461
+ ]
462
+ },
463
+ "source": {
464
+ "commands": [],
465
+ "getter_calls": 1,
466
+ "marker": [
467
+ 17,
468
+ 18
469
+ ]
470
+ }
471
+ },
472
+ {
473
+ "rust": {
474
+ "commands": [
475
+ {
476
+ "slot": 1,
477
+ "text": "727361792032202d312037202222"
478
+ },
479
+ {
480
+ "slot": 2,
481
+ "text": "727361792032202d312037202222"
482
+ }
483
+ ],
484
+ "getter_calls": 1,
485
+ "marker": [
486
+ 13500,
487
+ 1
488
+ ]
489
+ },
490
+ "source": {
491
+ "commands": [
492
+ {
493
+ "slot": 1,
494
+ "text": "727361792032202d312037202222"
495
+ },
496
+ {
497
+ "slot": 2,
498
+ "text": "727361792032202d312037202222"
499
+ }
500
+ ],
501
+ "getter_calls": 1,
502
+ "marker": [
503
+ 13500,
504
+ 1
505
+ ]
506
+ }
507
+ },
508
+ {
509
+ "rust": {
510
+ "commands": [
511
+ {
512
+ "slot": 1,
513
+ "text": "727361792032202d3120372022426f6d62207369746522"
514
+ },
515
+ {
516
+ "slot": 2,
517
+ "text": "727361792032202d3120372022426f6d62207369746522"
518
+ }
519
+ ],
520
+ "getter_calls": 1,
521
+ "marker": [
522
+ 13500,
523
+ 1
524
+ ]
525
+ },
526
+ "source": {
527
+ "commands": [
528
+ {
529
+ "slot": 1,
530
+ "text": "727361792032202d3120372022426f6d62207369746522"
531
+ },
532
+ {
533
+ "slot": 2,
534
+ "text": "727361792032202d3120372022426f6d62207369746522"
535
+ }
536
+ ],
537
+ "getter_calls": 1,
538
+ "marker": [
539
+ 13500,
540
+ 1
541
+ ]
542
+ }
543
+ },
544
+ {
545
+ "rust": {
546
+ "commands": [],
547
+ "getter_calls": 1,
548
+ "marker": [
549
+ 17,
550
+ 18
551
+ ]
552
+ },
553
+ "source": {
554
+ "commands": [],
555
+ "getter_calls": 1,
556
+ "marker": [
557
+ 17,
558
+ 18
559
+ ]
560
+ }
561
+ },
562
+ {
563
+ "rust": {
564
+ "commands": [],
565
+ "getter_calls": 1,
566
+ "marker": [
567
+ 17,
568
+ 18
569
+ ]
570
+ },
571
+ "source": {
572
+ "commands": [],
573
+ "getter_calls": 1,
574
+ "marker": [
575
+ 17,
576
+ 18
577
+ ]
578
+ }
579
+ },
580
+ {
581
+ "rust": {
582
+ "commands": [
583
+ {
584
+ "slot": 0,
585
+ "text": "727361792032202d312037202222"
586
+ },
587
+ {
588
+ "slot": 2,
589
+ "text": "727361792032202d312037202222"
590
+ },
591
+ {
592
+ "slot": 4,
593
+ "text": "727361792032202d312037202222"
594
+ },
595
+ {
596
+ "slot": 6,
597
+ "text": "727361792032202d312037202222"
598
+ },
599
+ {
600
+ "slot": 8,
601
+ "text": "727361792032202d312037202222"
602
+ },
603
+ {
604
+ "slot": 10,
605
+ "text": "727361792032202d312037202222"
606
+ },
607
+ {
608
+ "slot": 12,
609
+ "text": "727361792032202d312037202222"
610
+ },
611
+ {
612
+ "slot": 14,
613
+ "text": "727361792032202d312037202222"
614
+ },
615
+ {
616
+ "slot": 16,
617
+ "text": "727361792032202d312037202222"
618
+ },
619
+ {
620
+ "slot": 18,
621
+ "text": "727361792032202d312037202222"
622
+ },
623
+ {
624
+ "slot": 20,
625
+ "text": "727361792032202d312037202222"
626
+ },
627
+ {
628
+ "slot": 22,
629
+ "text": "727361792032202d312037202222"
630
+ },
631
+ {
632
+ "slot": 24,
633
+ "text": "727361792032202d312037202222"
634
+ },
635
+ {
636
+ "slot": 26,
637
+ "text": "727361792032202d312037202222"
638
+ },
639
+ {
640
+ "slot": 28,
641
+ "text": "727361792032202d312037202222"
642
+ },
643
+ {
644
+ "slot": 30,
645
+ "text": "727361792032202d312037202222"
646
+ },
647
+ {
648
+ "slot": 32,
649
+ "text": "727361792032202d312037202222"
650
+ },
651
+ {
652
+ "slot": 34,
653
+ "text": "727361792032202d312037202222"
654
+ },
655
+ {
656
+ "slot": 36,
657
+ "text": "727361792032202d312037202222"
658
+ },
659
+ {
660
+ "slot": 38,
661
+ "text": "727361792032202d312037202222"
662
+ },
663
+ {
664
+ "slot": 40,
665
+ "text": "727361792032202d312037202222"
666
+ },
667
+ {
668
+ "slot": 42,
669
+ "text": "727361792032202d312037202222"
670
+ },
671
+ {
672
+ "slot": 44,
673
+ "text": "727361792032202d312037202222"
674
+ },
675
+ {
676
+ "slot": 46,
677
+ "text": "727361792032202d312037202222"
678
+ },
679
+ {
680
+ "slot": 48,
681
+ "text": "727361792032202d312037202222"
682
+ },
683
+ {
684
+ "slot": 50,
685
+ "text": "727361792032202d312037202222"
686
+ },
687
+ {
688
+ "slot": 52,
689
+ "text": "727361792032202d312037202222"
690
+ },
691
+ {
692
+ "slot": 54,
693
+ "text": "727361792032202d312037202222"
694
+ },
695
+ {
696
+ "slot": 56,
697
+ "text": "727361792032202d312037202222"
698
+ },
699
+ {
700
+ "slot": 58,
701
+ "text": "727361792032202d312037202222"
702
+ },
703
+ {
704
+ "slot": 60,
705
+ "text": "727361792032202d312037202222"
706
+ },
707
+ {
708
+ "slot": 62,
709
+ "text": "727361792032202d312037202222"
710
+ }
711
+ ],
712
+ "getter_calls": 1,
713
+ "marker": [
714
+ 13500,
715
+ 1
716
+ ]
717
+ },
718
+ "source": {
719
+ "commands": [
720
+ {
721
+ "slot": 0,
722
+ "text": "727361792032202d312037202222"
723
+ },
724
+ {
725
+ "slot": 2,
726
+ "text": "727361792032202d312037202222"
727
+ },
728
+ {
729
+ "slot": 4,
730
+ "text": "727361792032202d312037202222"
731
+ },
732
+ {
733
+ "slot": 6,
734
+ "text": "727361792032202d312037202222"
735
+ },
736
+ {
737
+ "slot": 8,
738
+ "text": "727361792032202d312037202222"
739
+ },
740
+ {
741
+ "slot": 10,
742
+ "text": "727361792032202d312037202222"
743
+ },
744
+ {
745
+ "slot": 12,
746
+ "text": "727361792032202d312037202222"
747
+ },
748
+ {
749
+ "slot": 14,
750
+ "text": "727361792032202d312037202222"
751
+ },
752
+ {
753
+ "slot": 16,
754
+ "text": "727361792032202d312037202222"
755
+ },
756
+ {
757
+ "slot": 18,
758
+ "text": "727361792032202d312037202222"
759
+ },
760
+ {
761
+ "slot": 20,
762
+ "text": "727361792032202d312037202222"
763
+ },
764
+ {
765
+ "slot": 22,
766
+ "text": "727361792032202d312037202222"
767
+ },
768
+ {
769
+ "slot": 24,
770
+ "text": "727361792032202d312037202222"
771
+ },
772
+ {
773
+ "slot": 26,
774
+ "text": "727361792032202d312037202222"
775
+ },
776
+ {
777
+ "slot": 28,
778
+ "text": "727361792032202d312037202222"
779
+ },
780
+ {
781
+ "slot": 30,
782
+ "text": "727361792032202d312037202222"
783
+ },
784
+ {
785
+ "slot": 32,
786
+ "text": "727361792032202d312037202222"
787
+ },
788
+ {
789
+ "slot": 34,
790
+ "text": "727361792032202d312037202222"
791
+ },
792
+ {
793
+ "slot": 36,
794
+ "text": "727361792032202d312037202222"
795
+ },
796
+ {
797
+ "slot": 38,
798
+ "text": "727361792032202d312037202222"
799
+ },
800
+ {
801
+ "slot": 40,
802
+ "text": "727361792032202d312037202222"
803
+ },
804
+ {
805
+ "slot": 42,
806
+ "text": "727361792032202d312037202222"
807
+ },
808
+ {
809
+ "slot": 44,
810
+ "text": "727361792032202d312037202222"
811
+ },
812
+ {
813
+ "slot": 46,
814
+ "text": "727361792032202d312037202222"
815
+ },
816
+ {
817
+ "slot": 48,
818
+ "text": "727361792032202d312037202222"
819
+ },
820
+ {
821
+ "slot": 50,
822
+ "text": "727361792032202d312037202222"
823
+ },
824
+ {
825
+ "slot": 52,
826
+ "text": "727361792032202d312037202222"
827
+ },
828
+ {
829
+ "slot": 54,
830
+ "text": "727361792032202d312037202222"
831
+ },
832
+ {
833
+ "slot": 56,
834
+ "text": "727361792032202d312037202222"
835
+ },
836
+ {
837
+ "slot": 58,
838
+ "text": "727361792032202d312037202222"
839
+ },
840
+ {
841
+ "slot": 60,
842
+ "text": "727361792032202d312037202222"
843
+ },
844
+ {
845
+ "slot": 62,
846
+ "text": "727361792032202d312037202222"
847
+ }
848
+ ],
849
+ "getter_calls": 1,
850
+ "marker": [
851
+ 13500,
852
+ 1
853
+ ]
854
+ }
855
+ },
856
+ {
857
+ "rust": {
858
+ "commands": [
859
+ {
860
+ "slot": 0,
861
+ "text": "727361792032202d3120372022426f6d62207369746522"
862
+ },
863
+ {
864
+ "slot": 2,
865
+ "text": "727361792032202d3120372022426f6d62207369746522"
866
+ },
867
+ {
868
+ "slot": 4,
869
+ "text": "727361792032202d3120372022426f6d62207369746522"
870
+ },
871
+ {
872
+ "slot": 6,
873
+ "text": "727361792032202d3120372022426f6d62207369746522"
874
+ },
875
+ {
876
+ "slot": 8,
877
+ "text": "727361792032202d3120372022426f6d62207369746522"
878
+ },
879
+ {
880
+ "slot": 10,
881
+ "text": "727361792032202d3120372022426f6d62207369746522"
882
+ },
883
+ {
884
+ "slot": 12,
885
+ "text": "727361792032202d3120372022426f6d62207369746522"
886
+ },
887
+ {
888
+ "slot": 14,
889
+ "text": "727361792032202d3120372022426f6d62207369746522"
890
+ },
891
+ {
892
+ "slot": 16,
893
+ "text": "727361792032202d3120372022426f6d62207369746522"
894
+ },
895
+ {
896
+ "slot": 18,
897
+ "text": "727361792032202d3120372022426f6d62207369746522"
898
+ },
899
+ {
900
+ "slot": 20,
901
+ "text": "727361792032202d3120372022426f6d62207369746522"
902
+ },
903
+ {
904
+ "slot": 22,
905
+ "text": "727361792032202d3120372022426f6d62207369746522"
906
+ },
907
+ {
908
+ "slot": 24,
909
+ "text": "727361792032202d3120372022426f6d62207369746522"
910
+ },
911
+ {
912
+ "slot": 26,
913
+ "text": "727361792032202d3120372022426f6d62207369746522"
914
+ },
915
+ {
916
+ "slot": 28,
917
+ "text": "727361792032202d3120372022426f6d62207369746522"
918
+ },
919
+ {
920
+ "slot": 30,
921
+ "text": "727361792032202d3120372022426f6d62207369746522"
922
+ },
923
+ {
924
+ "slot": 32,
925
+ "text": "727361792032202d3120372022426f6d62207369746522"
926
+ },
927
+ {
928
+ "slot": 34,
929
+ "text": "727361792032202d3120372022426f6d62207369746522"
930
+ },
931
+ {
932
+ "slot": 36,
933
+ "text": "727361792032202d3120372022426f6d62207369746522"
934
+ },
935
+ {
936
+ "slot": 38,
937
+ "text": "727361792032202d3120372022426f6d62207369746522"
938
+ },
939
+ {
940
+ "slot": 40,
941
+ "text": "727361792032202d3120372022426f6d62207369746522"
942
+ },
943
+ {
944
+ "slot": 42,
945
+ "text": "727361792032202d3120372022426f6d62207369746522"
946
+ },
947
+ {
948
+ "slot": 44,
949
+ "text": "727361792032202d3120372022426f6d62207369746522"
950
+ },
951
+ {
952
+ "slot": 46,
953
+ "text": "727361792032202d3120372022426f6d62207369746522"
954
+ },
955
+ {
956
+ "slot": 48,
957
+ "text": "727361792032202d3120372022426f6d62207369746522"
958
+ },
959
+ {
960
+ "slot": 50,
961
+ "text": "727361792032202d3120372022426f6d62207369746522"
962
+ },
963
+ {
964
+ "slot": 52,
965
+ "text": "727361792032202d3120372022426f6d62207369746522"
966
+ },
967
+ {
968
+ "slot": 54,
969
+ "text": "727361792032202d3120372022426f6d62207369746522"
970
+ },
971
+ {
972
+ "slot": 56,
973
+ "text": "727361792032202d3120372022426f6d62207369746522"
974
+ },
975
+ {
976
+ "slot": 58,
977
+ "text": "727361792032202d3120372022426f6d62207369746522"
978
+ },
979
+ {
980
+ "slot": 60,
981
+ "text": "727361792032202d3120372022426f6d62207369746522"
982
+ },
983
+ {
984
+ "slot": 62,
985
+ "text": "727361792032202d3120372022426f6d62207369746522"
986
+ }
987
+ ],
988
+ "getter_calls": 1,
989
+ "marker": [
990
+ 13500,
991
+ 1
992
+ ]
993
+ },
994
+ "source": {
995
+ "commands": [
996
+ {
997
+ "slot": 0,
998
+ "text": "727361792032202d3120372022426f6d62207369746522"
999
+ },
1000
+ {
1001
+ "slot": 2,
1002
+ "text": "727361792032202d3120372022426f6d62207369746522"
1003
+ },
1004
+ {
1005
+ "slot": 4,
1006
+ "text": "727361792032202d3120372022426f6d62207369746522"
1007
+ },
1008
+ {
1009
+ "slot": 6,
1010
+ "text": "727361792032202d3120372022426f6d62207369746522"
1011
+ },
1012
+ {
1013
+ "slot": 8,
1014
+ "text": "727361792032202d3120372022426f6d62207369746522"
1015
+ },
1016
+ {
1017
+ "slot": 10,
1018
+ "text": "727361792032202d3120372022426f6d62207369746522"
1019
+ },
1020
+ {
1021
+ "slot": 12,
1022
+ "text": "727361792032202d3120372022426f6d62207369746522"
1023
+ },
1024
+ {
1025
+ "slot": 14,
1026
+ "text": "727361792032202d3120372022426f6d62207369746522"
1027
+ },
1028
+ {
1029
+ "slot": 16,
1030
+ "text": "727361792032202d3120372022426f6d62207369746522"
1031
+ },
1032
+ {
1033
+ "slot": 18,
1034
+ "text": "727361792032202d3120372022426f6d62207369746522"
1035
+ },
1036
+ {
1037
+ "slot": 20,
1038
+ "text": "727361792032202d3120372022426f6d62207369746522"
1039
+ },
1040
+ {
1041
+ "slot": 22,
1042
+ "text": "727361792032202d3120372022426f6d62207369746522"
1043
+ },
1044
+ {
1045
+ "slot": 24,
1046
+ "text": "727361792032202d3120372022426f6d62207369746522"
1047
+ },
1048
+ {
1049
+ "slot": 26,
1050
+ "text": "727361792032202d3120372022426f6d62207369746522"
1051
+ },
1052
+ {
1053
+ "slot": 28,
1054
+ "text": "727361792032202d3120372022426f6d62207369746522"
1055
+ },
1056
+ {
1057
+ "slot": 30,
1058
+ "text": "727361792032202d3120372022426f6d62207369746522"
1059
+ },
1060
+ {
1061
+ "slot": 32,
1062
+ "text": "727361792032202d3120372022426f6d62207369746522"
1063
+ },
1064
+ {
1065
+ "slot": 34,
1066
+ "text": "727361792032202d3120372022426f6d62207369746522"
1067
+ },
1068
+ {
1069
+ "slot": 36,
1070
+ "text": "727361792032202d3120372022426f6d62207369746522"
1071
+ },
1072
+ {
1073
+ "slot": 38,
1074
+ "text": "727361792032202d3120372022426f6d62207369746522"
1075
+ },
1076
+ {
1077
+ "slot": 40,
1078
+ "text": "727361792032202d3120372022426f6d62207369746522"
1079
+ },
1080
+ {
1081
+ "slot": 42,
1082
+ "text": "727361792032202d3120372022426f6d62207369746522"
1083
+ },
1084
+ {
1085
+ "slot": 44,
1086
+ "text": "727361792032202d3120372022426f6d62207369746522"
1087
+ },
1088
+ {
1089
+ "slot": 46,
1090
+ "text": "727361792032202d3120372022426f6d62207369746522"
1091
+ },
1092
+ {
1093
+ "slot": 48,
1094
+ "text": "727361792032202d3120372022426f6d62207369746522"
1095
+ },
1096
+ {
1097
+ "slot": 50,
1098
+ "text": "727361792032202d3120372022426f6d62207369746522"
1099
+ },
1100
+ {
1101
+ "slot": 52,
1102
+ "text": "727361792032202d3120372022426f6d62207369746522"
1103
+ },
1104
+ {
1105
+ "slot": 54,
1106
+ "text": "727361792032202d3120372022426f6d62207369746522"
1107
+ },
1108
+ {
1109
+ "slot": 56,
1110
+ "text": "727361792032202d3120372022426f6d62207369746522"
1111
+ },
1112
+ {
1113
+ "slot": 58,
1114
+ "text": "727361792032202d3120372022426f6d62207369746522"
1115
+ },
1116
+ {
1117
+ "slot": 60,
1118
+ "text": "727361792032202d3120372022426f6d62207369746522"
1119
+ },
1120
+ {
1121
+ "slot": 62,
1122
+ "text": "727361792032202d3120372022426f6d62207369746522"
1123
+ }
1124
+ ],
1125
+ "getter_calls": 1,
1126
+ "marker": [
1127
+ 13500,
1128
+ 1
1129
+ ]
1130
+ }
1131
+ },
1132
+ {
1133
+ "rust": {
1134
+ "commands": [],
1135
+ "getter_calls": 1,
1136
+ "marker": [
1137
+ 17,
1138
+ 18
1139
+ ]
1140
+ },
1141
+ "source": {
1142
+ "commands": [],
1143
+ "getter_calls": 1,
1144
+ "marker": [
1145
+ 17,
1146
+ 18
1147
+ ]
1148
+ }
1149
+ },
1150
+ {
1151
+ "rust": {
1152
+ "commands": [],
1153
+ "getter_calls": 1,
1154
+ "marker": [
1155
+ 17,
1156
+ 18
1157
+ ]
1158
+ },
1159
+ "source": {
1160
+ "commands": [],
1161
+ "getter_calls": 1,
1162
+ "marker": [
1163
+ 17,
1164
+ 18
1165
+ ]
1166
+ }
1167
+ },
1168
+ {
1169
+ "rust": {
1170
+ "commands": [
1171
+ {
1172
+ "slot": 2,
1173
+ "text": "727361792032202d312037202222"
1174
+ }
1175
+ ],
1176
+ "getter_calls": 1,
1177
+ "marker": [
1178
+ 13500,
1179
+ 1
1180
+ ]
1181
+ },
1182
+ "source": {
1183
+ "commands": [
1184
+ {
1185
+ "slot": 2,
1186
+ "text": "727361792032202d312037202222"
1187
+ }
1188
+ ],
1189
+ "getter_calls": 1,
1190
+ "marker": [
1191
+ 13500,
1192
+ 1
1193
+ ]
1194
+ }
1195
+ },
1196
+ {
1197
+ "rust": {
1198
+ "commands": [
1199
+ {
1200
+ "slot": 2,
1201
+ "text": "727361792032202d3120372022426f6d62207369746522"
1202
+ }
1203
+ ],
1204
+ "getter_calls": 1,
1205
+ "marker": [
1206
+ 13500,
1207
+ 1
1208
+ ]
1209
+ },
1210
+ "source": {
1211
+ "commands": [
1212
+ {
1213
+ "slot": 2,
1214
+ "text": "727361792032202d3120372022426f6d62207369746522"
1215
+ }
1216
+ ],
1217
+ "getter_calls": 1,
1218
+ "marker": [
1219
+ 13500,
1220
+ 1
1221
+ ]
1222
+ }
1223
+ },
1224
+ {
1225
+ "rust": {
1226
+ "commands": [
1227
+ {
1228
+ "slot": 0,
1229
+ "text": "727361792032202d312037202222"
1230
+ },
1231
+ {
1232
+ "slot": 2,
1233
+ "text": "727361792032202d312037202222"
1234
+ }
1235
+ ],
1236
+ "getter_calls": 1,
1237
+ "marker": [
1238
+ 17,
1239
+ 18
1240
+ ]
1241
+ },
1242
+ "source": {
1243
+ "commands": [
1244
+ {
1245
+ "slot": 0,
1246
+ "text": "727361792032202d312037202222"
1247
+ },
1248
+ {
1249
+ "slot": 2,
1250
+ "text": "727361792032202d312037202222"
1251
+ }
1252
+ ],
1253
+ "getter_calls": 1,
1254
+ "marker": [
1255
+ 17,
1256
+ 18
1257
+ ]
1258
+ }
1259
+ },
1260
+ {
1261
+ "rust": {
1262
+ "commands": [
1263
+ {
1264
+ "slot": 0,
1265
+ "text": "727361792032202d312037202250227122"
1266
+ },
1267
+ {
1268
+ "slot": 2,
1269
+ "text": "727361792032202d312037202250227122"
1270
+ }
1271
+ ],
1272
+ "getter_calls": 1,
1273
+ "marker": [
1274
+ 17,
1275
+ 18
1276
+ ]
1277
+ },
1278
+ "source": {
1279
+ "commands": [
1280
+ {
1281
+ "slot": 0,
1282
+ "text": "727361792032202d312037202250227122"
1283
+ },
1284
+ {
1285
+ "slot": 2,
1286
+ "text": "727361792032202d312037202250227122"
1287
+ }
1288
+ ],
1289
+ "getter_calls": 1,
1290
+ "marker": [
1291
+ 17,
1292
+ 18
1293
+ ]
1294
+ }
1295
+ },
1296
+ {
1297
+ "rust": {
1298
+ "commands": [
1299
+ {
1300
+ "slot": 0,
1301
+ "text": "727361792032202d312037202222"
1302
+ },
1303
+ {
1304
+ "slot": 2,
1305
+ "text": "727361792032202d312037202222"
1306
+ }
1307
+ ],
1308
+ "getter_calls": 1,
1309
+ "marker": [
1310
+ 3499,
1311
+ 1
1312
+ ]
1313
+ },
1314
+ "source": {
1315
+ "commands": [
1316
+ {
1317
+ "slot": 0,
1318
+ "text": "727361792032202d312037202222"
1319
+ },
1320
+ {
1321
+ "slot": 2,
1322
+ "text": "727361792032202d312037202222"
1323
+ }
1324
+ ],
1325
+ "getter_calls": 1,
1326
+ "marker": [
1327
+ 3499,
1328
+ 1
1329
+ ]
1330
+ }
1331
+ },
1332
+ {
1333
+ "rust": {
1334
+ "commands": [
1335
+ {
1336
+ "slot": 0,
1337
+ "text": "727361792032202d3120372022426f6d62207369746522"
1338
+ },
1339
+ {
1340
+ "slot": 2,
1341
+ "text": "727361792032202d3120372022426f6d62207369746522"
1342
+ }
1343
+ ],
1344
+ "getter_calls": 1,
1345
+ "marker": [
1346
+ 3499,
1347
+ 1
1348
+ ]
1349
+ },
1350
+ "source": {
1351
+ "commands": [
1352
+ {
1353
+ "slot": 0,
1354
+ "text": "727361792032202d3120372022426f6d62207369746522"
1355
+ },
1356
+ {
1357
+ "slot": 2,
1358
+ "text": "727361792032202d3120372022426f6d62207369746522"
1359
+ }
1360
+ ],
1361
+ "getter_calls": 1,
1362
+ "marker": [
1363
+ 3499,
1364
+ 1
1365
+ ]
1366
+ }
1367
+ }
1368
+ ],
1369
+ "source_report": "docs/research/qvm-effect-radio.json",
1370
+ "source_report_sha256": "e2d0c0ee9ac702efeccb9507573a48070963016e925a0f96987002ec6bda0da4"
1371
+ }
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 281,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
 
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
+ "rust_unit_tests": 283,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
scripts/analyze_rust_effect_radio.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Compare recovered Rust policy with original QVM fixtures."""
2
+ import hashlib,json,os,subprocess
3
+ from pathlib import Path
4
+ from analyze_qvm import write_json
5
+ from rust_lifecycle_support import result
6
+
7
+ def main():
8
+ subprocess.run(['cargo','build','--offline','--package','urt-gameplay','--bin','urt-effect-feedback'],check=True,capture_output=True)
9
+ binary=Path(os.environ.get('CARGO_TARGET_DIR','target'))/'debug'/'urt-effect-feedback'
10
+ path=Path('docs/research/qvm-effect-radio.json');data=path.read_bytes();probes=[]
11
+ for p in json.loads(data)['probes']:
12
+ probes.append(dict(source={k:p[k] for k in ['commands', 'getter_calls', 'marker']},rust=result(binary,'radio',encode(p['input']))))
13
+ write_json(Path('docs/research/rust-effect-radio.json'),dict(source_report=str(path),source_report_sha256=hashlib.sha256(data).hexdigest(),probes=probes,limits='Finite source/Rust contract parity; native time/file/network replies remain supplied or captured.'))
14
+
15
+ from qvm_effect_feedback_support import radio_clients
16
+ def encode(a):
17
+ payload=bytes.fromhex(a['payload']);clients=radio_clients(a);clients[2][1]=a['team']
18
+ return [a['mode'],a['follow'],a['health'],a['team'],a['count'],a['disconnected'],a['other_only'],a['marker'],a['tick'],a['code'],a['success'],0,len(payload),*payload,*[v for c in clients for v in c]]
19
+ if __name__=='__main__':main()
scripts/test_rust_effect_radio.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import hashlib,json,unittest
2
+ from pathlib import Path
3
+ class PortTests(unittest.TestCase):
4
+ def test_original_parity(self):
5
+ r=json.loads(Path('docs/research/rust-effect-radio.json').read_text());self.assertGreaterEqual(len(r['probes']),12)
6
+ for p in r['probes']:self.assertEqual(p['source'],p['rust'])
7
+ def test_identity(self):
8
+ r=json.loads(Path('docs/research/rust-effect-radio.json').read_text());self.assertEqual(hashlib.sha256(Path(r['source_report']).read_bytes()).hexdigest(),r['source_report_sha256'])
9
+ if __name__=='__main__':unittest.main()
xtask/checks.tsv CHANGED
@@ -4360,3 +4360,39 @@ report scripts/analyze_qvm_effect_radio.py docs/research/qvm-effect-radio.json
4360
  edge docs/research/qvm-effect-radio.json scripts/test_qvm_effect_radio.py
4361
  group qvm-effect-radio scripts/analyze_qvm_effect_radio.py
4362
  edge scripts/analyze_qvm_effect_radio.py scripts/analyze_qvm_resumer_audit.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4360
  edge docs/research/qvm-effect-radio.json scripts/test_qvm_effect_radio.py
4361
  group qvm-effect-radio scripts/analyze_qvm_effect_radio.py
4362
  edge scripts/analyze_qvm_effect_radio.py scripts/analyze_qvm_resumer_audit.py
4363
+ report scripts/analyze_rust_effect_radio.py docs/research/rust-effect-radio.json
4364
+ edge docs/research/rust-effect-radio.json scripts/test_rust_effect_radio.py
4365
+ group rust-effect-radio scripts/analyze_rust_effect_radio.py
4366
+ edge scripts/analyze_rust_effect_radio.py scripts/analyze_qvm_resumer_audit.py
4367
+ edge Cargo.toml scripts/analyze_rust_effect_radio.py
4368
+ edge Cargo.lock scripts/analyze_rust_effect_radio.py
4369
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_effect_radio.py
4370
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_effect_radio.py
4371
+ edge crates/urt-gameplay/src/filter_loading.rs scripts/analyze_rust_effect_radio.py
4372
+ edge crates/urt-gameplay/src/filter_lifecycle.rs scripts/analyze_rust_effect_radio.py
4373
+ edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_effect_radio.py
4374
+ edge crates/urt-gameplay/src/bin/urt-filter-loading.rs scripts/analyze_rust_effect_radio.py
4375
+ edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_effect_radio.py
4376
+ edge docs/research/qvm-effect-radio.json scripts/analyze_rust_effect_radio.py
4377
+ group rust-effect-radio scripts/analyze_rust_health_impulse.py
4378
+ group gameplay scripts/analyze_rust_effect_radio.py
4379
+ edge crates/urt-gameplay/src/filter_commands.rs scripts/analyze_rust_effect_radio.py
4380
+ edge crates/urt-gameplay/src/bin/urt-filter-commands.rs scripts/analyze_rust_effect_radio.py
4381
+ edge crates/urt-gameplay/src/client_timer.rs scripts/analyze_rust_effect_radio.py
4382
+ edge crates/urt-gameplay/src/bin/urt-client-timer.rs scripts/analyze_rust_effect_radio.py
4383
+ edge crates/urt-gameplay/src/client_processing.rs scripts/analyze_rust_effect_radio.py
4384
+ edge crates/urt-gameplay/src/bin/urt-client-processing.rs scripts/analyze_rust_effect_radio.py
4385
+ edge crates/urt-gameplay/src/client_move_context.rs scripts/analyze_rust_effect_radio.py
4386
+ edge crates/urt-gameplay/src/bin/urt-client-move-context.rs scripts/analyze_rust_effect_radio.py
4387
+ edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_effect_radio.py
4388
+ edge crates/urt-gameplay/src/bin/urt-move-callbacks.rs scripts/analyze_rust_effect_radio.py
4389
+ edge crates/urt-gameplay/src/assistance.rs scripts/analyze_rust_effect_radio.py
4390
+ edge crates/urt-gameplay/src/bin/urt-assistance.rs scripts/analyze_rust_effect_radio.py
4391
+ edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_effect_radio.py
4392
+ edge crates/urt-gameplay/src/defuse.rs scripts/analyze_rust_effect_radio.py
4393
+ edge crates/urt-gameplay/src/bin/urt-defuse.rs scripts/analyze_rust_effect_radio.py
4394
+ edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_effect_radio.py
4395
+ edge crates/urt-gameplay/src/effect_feedback.rs scripts/analyze_rust_effect_radio.py
4396
+ edge crates/urt-gameplay/src/bin/urt-effect-feedback.rs scripts/analyze_rust_effect_radio.py
4397
+ edge crates/urt-gameplay/src/score.rs scripts/analyze_rust_effect_radio.py
4398
+ edge crates/urt-gameplay/src/transition.rs scripts/analyze_rust_effect_radio.py
xtask/src/lib.rs CHANGED
@@ -1165,6 +1165,9 @@ mod integration_tests {
1165
  ("effect_feedback", "effect_counter"),
1166
  ("score", "effect_counter"),
1167
  ("transition", "effect_counter"),
 
 
 
1168
  ("client_move_context", "client_move_scratch"),
1169
  ("client_processing", "client_routing"),
1170
  ("client_timer", "client_routing"),
@@ -1399,6 +1402,7 @@ mod integration_tests {
1399
  ("qvm-defuse-complete", "defuse_complete"),
1400
  ("qvm-defuse-sequence", "defuse_sequence"),
1401
  ("qvm-effect-counter", "effect_counter"),
 
1402
  ("qvm-client-move-scratch", "client_move_scratch"),
1403
  ("qvm-client-routing", "client_routing"),
1404
  ("qvm-client-command-rewrite", "client_command_rewrite"),
 
1165
  ("effect_feedback", "effect_counter"),
1166
  ("score", "effect_counter"),
1167
  ("transition", "effect_counter"),
1168
+ ("effect_feedback", "effect_radio"),
1169
+ ("score", "effect_radio"),
1170
+ ("transition", "effect_radio"),
1171
  ("client_move_context", "client_move_scratch"),
1172
  ("client_processing", "client_routing"),
1173
  ("client_timer", "client_routing"),
 
1402
  ("qvm-defuse-complete", "defuse_complete"),
1403
  ("qvm-defuse-sequence", "defuse_sequence"),
1404
  ("qvm-effect-counter", "effect_counter"),
1405
+ ("qvm-effect-radio", "effect_radio"),
1406
  ("qvm-client-move-scratch", "client_move_scratch"),
1407
  ("qvm-client-routing", "client_routing"),
1408
  ("qvm-client-command-rewrite", "client_command_rewrite"),