nmarshall commited on
Commit
71f6200
·
1 Parent(s): 63d4cac

gameplay: port timed self-recovery policy

Browse files
crates/urt-gameplay/src/bin/urt-move-callbacks.rs CHANGED
@@ -68,6 +68,41 @@ fn main() {
68
  .unwrap();
69
  println!("{{{}}}", fields(s, &e));
70
  }
 
71
  _ => panic!("unknown policy"),
72
  }
73
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  .unwrap();
69
  println!("{{{}}}", fields(s, &e));
70
  }
71
+ "self" => println!("{}", self_recovery(&w)),
72
  _ => panic!("unknown policy"),
73
  }
74
  }
75
+
76
+ fn self_recovery(w: &[u32]) -> String {
77
+ assert_eq!(w.len(), 16);
78
+ let mut s = SelfRecoveryState {
79
+ meter: MeterState {
80
+ meter: w[10],
81
+ carry: w[11],
82
+ flags220: w[6],
83
+ flags104: w[7],
84
+ pm_type: w[8],
85
+ receiver: 999,
86
+ event_entity: [7, 0x80000001],
87
+ },
88
+ last: w[13],
89
+ };
90
+ let e = self_recover(
91
+ &mut s,
92
+ SelfRecoveryInput {
93
+ entity: w[0] != 0,
94
+ client: w[1] != 0,
95
+ mode: w[2],
96
+ connection: w[3],
97
+ health: w[4],
98
+ follow: w[5],
99
+ seconds: w[9],
100
+ tick: w[12],
101
+ slot: 2,
102
+ owner: 0x12345678,
103
+ },
104
+ )
105
+ .unwrap();
106
+ assert_eq!(&w[14..], &[1, 0]);
107
+ format!("{{{},\"last\":{}}}", fields(s.meter, &e), s.last)
108
+ }
crates/urt-gameplay/src/move_callbacks.rs CHANGED
@@ -148,3 +148,141 @@ mod meter_tests {
148
  assert_eq!(s, bad);
149
  }
150
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  assert_eq!(s, bad);
149
  }
150
  }
151
+
152
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
153
+ pub struct SelfRecoveryState {
154
+ pub meter: MeterState,
155
+ pub last: u32,
156
+ }
157
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
158
+ pub struct SelfRecoveryInput {
159
+ pub entity: bool,
160
+ pub client: bool,
161
+ pub mode: u32,
162
+ pub connection: u32,
163
+ pub health: u32,
164
+ pub follow: u32,
165
+ pub seconds: u32,
166
+ pub tick: u32,
167
+ pub slot: i32,
168
+ pub owner: u32,
169
+ }
170
+ /// Original152673 with actual meter policy. Admission exits do not evaluate
171
+ /// unused floating inputs. State/effect plans commit together on success.
172
+ pub fn self_recover(
173
+ state: &mut SelfRecoveryState,
174
+ input: SelfRecoveryInput,
175
+ ) -> Result<Vec<CallbackEffect>, Error> {
176
+ if !input.entity
177
+ || !input.client
178
+ || input.mode != 10
179
+ || input.connection != 2
180
+ || input.health as i32 <= 0
181
+ || input.follow != 0
182
+ || state.meter.flags220 & 16384 == 0
183
+ {
184
+ return Ok(vec![]);
185
+ }
186
+ let seconds = f32::from_bits(input.seconds);
187
+ if !seconds.is_finite() {
188
+ return Err(Error::NonFinite);
189
+ }
190
+ if seconds == 0. {
191
+ return Err(Error::InvalidInput);
192
+ }
193
+ let mut next = *state;
194
+ let increment =
195
+ 32000.0 / (seconds * 1000.0) * (input.tick.wrapping_sub(next.last) as i32 as f32);
196
+ let carry = f32::from_bits(next.meter.carry) + increment;
197
+ if !increment.is_finite() || !carry.is_finite() {
198
+ return Err(Error::NonFinite);
199
+ }
200
+ next.meter.carry = carry.to_bits();
201
+ next.last = input.tick;
202
+ let out = finish_meter(
203
+ &mut next.meter,
204
+ MeterInput {
205
+ melt: true,
206
+ mirror: false,
207
+ slot: input.slot,
208
+ other_slot: 0,
209
+ owner: input.owner,
210
+ },
211
+ )?;
212
+ *state = next;
213
+ Ok(out)
214
+ }
215
+ #[cfg(test)]
216
+ mod recovery_tests {
217
+ use super::*;
218
+ fn state() -> SelfRecoveryState {
219
+ SelfRecoveryState {
220
+ meter: MeterState {
221
+ meter: 0,
222
+ carry: 0.5f32.to_bits(),
223
+ flags220: 16384,
224
+ flags104: 16,
225
+ pm_type: 4,
226
+ receiver: 999,
227
+ event_entity: [7, 1],
228
+ },
229
+ last: u32::MAX - 15,
230
+ }
231
+ }
232
+ fn input() -> SelfRecoveryInput {
233
+ SelfRecoveryInput {
234
+ entity: true,
235
+ client: true,
236
+ mode: 10,
237
+ connection: 2,
238
+ health: 1,
239
+ follow: 0,
240
+ seconds: 2f32.to_bits(),
241
+ tick: 10,
242
+ slot: 2,
243
+ owner: 9,
244
+ }
245
+ }
246
+ #[test]
247
+ fn wrapped_delta_and_early_exit_preservation() {
248
+ let mut s = state();
249
+ self_recover(&mut s, input()).unwrap();
250
+ assert_eq!(s.meter.meter, 416);
251
+ assert_eq!(s.last, 10);
252
+ assert_eq!(s.meter.carry, 0);
253
+ let old = s;
254
+ assert!(
255
+ self_recover(
256
+ &mut s,
257
+ SelfRecoveryInput {
258
+ mode: 9,
259
+ seconds: f32::NAN.to_bits(),
260
+ ..input()
261
+ }
262
+ )
263
+ .unwrap()
264
+ .is_empty()
265
+ );
266
+ assert_eq!(s, old);
267
+ }
268
+ #[test]
269
+ fn invalid_duration_and_late_conversion_roll_back_clock() {
270
+ let mut s = state();
271
+ let old = s;
272
+ assert!(
273
+ self_recover(
274
+ &mut s,
275
+ SelfRecoveryInput {
276
+ seconds: 0,
277
+ ..input()
278
+ }
279
+ )
280
+ .is_err()
281
+ );
282
+ assert_eq!(s, old);
283
+ s.meter.carry = f32::MAX.to_bits();
284
+ let old = s;
285
+ assert!(self_recover(&mut s, input()).is_err());
286
+ assert_eq!(s, old);
287
+ }
288
+ }
docs/FINDINGS.md CHANGED
@@ -1927,3 +1927,5 @@ RE-994: 90 original-QVM fixtures execute152386: signed integer meter converts to
1927
  RE-995: Rust ports meter f32 conversion, truncation, clamping, completion masks, event ownership and optional receiver mirroring across ninety source cases. Completion effects preserve source ordering. Nonfinite/out-of-range conversion, invalid client indices and assisted completion without a receiver reject before state mutation. Teleport/reset/log/event allocation remain effect plans and supplied event state rather than native execution. [Evidence](research/RUST_MOVE_METER.md).
1928
 
1929
  RE-996: Thirty-six original-QVM cases execute152673 with actual meter child152386. Entity/client existence, mode10, connection2, positive signed health, zero follow and client mask16384 gate processing. Progress uses staged f32 operations32000/(seconds*1000)*signed wrapped elapsed, adds carry, advances clock6324, then runs self-melt completion. Negative elapsed/duration, wrapped ticks, fractional carry and all admission exits are covered. Early exits preserve clock and carry; event/log effects remain captured. [Evidence](research/QVM_MOVE_SELF_RECOVERY.md).
 
 
 
1927
  RE-995: Rust ports meter f32 conversion, truncation, clamping, completion masks, event ownership and optional receiver mirroring across ninety source cases. Completion effects preserve source ordering. Nonfinite/out-of-range conversion, invalid client indices and assisted completion without a receiver reject before state mutation. Teleport/reset/log/event allocation remain effect plans and supplied event state rather than native execution. [Evidence](research/RUST_MOVE_METER.md).
1928
 
1929
  RE-996: Thirty-six original-QVM cases execute152673 with actual meter child152386. Entity/client existence, mode10, connection2, positive signed health, zero follow and client mask16384 gate processing. Progress uses staged f32 operations32000/(seconds*1000)*signed wrapped elapsed, adds carry, advances clock6324, then runs self-melt completion. Negative elapsed/duration, wrapped ticks, fractional carry and all admission exits are covered. Early exits preserve clock and carry; event/log effects remain captured. [Evidence](research/QVM_MOVE_SELF_RECOVERY.md).
1930
+
1931
+ RE-997: Rust ports actual self-recovery gates, wrapped signed elapsed time, staged f32 progress and the meter child across36 source cases. Admission exits preserve state without reading unused float configuration. Active invalid duration, nonfinite progress or unsupported conversion reject without advancing clock or committing meter/event changes. Unit tests cover wrapped elapsed time, inactive NaN preservation and late-error rollback. [Evidence](research/RUST_MOVE_SELF_RECOVERY.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -1984,3 +1984,5 @@ RE-974–983 completed routing, command rewrite, inactivity, movement-parameter
1984
  - [x] RE-995 Port meter completion and captured thaw effects ([evidence](research/RUST_MOVE_METER.md)).
1985
 
1986
  - [x] RE-996 Recover timed mode10 self-recovery ([evidence](research/QVM_MOVE_SELF_RECOVERY.md)).
 
 
 
1984
  - [x] RE-995 Port meter completion and captured thaw effects ([evidence](research/RUST_MOVE_METER.md)).
1985
 
1986
  - [x] RE-996 Recover timed mode10 self-recovery ([evidence](research/QVM_MOVE_SELF_RECOVERY.md)).
1987
+
1988
+ - [x] RE-997 Port timed self-recovery with atomic state updates ([evidence](research/RUST_MOVE_SELF_RECOVERY.md)).
docs/RESEARCH_LEDGER.md CHANGED
@@ -2659,3 +2659,7 @@ Rust ports meter f32 conversion, truncation, clamping, completion masks, event o
2659
  ## 2026-10-29 — RE-996 Recover timed mode10 self-recovery
2660
 
2661
  Thirty-six original-QVM cases execute152673 with actual meter child152386. Entity/client existence, mode10, connection2, positive signed health, zero follow and client mask16384 gate processing. Progress uses staged f32 operations32000/(seconds*1000)*signed wrapped elapsed, adds carry, advances clock6324, then runs self-melt completion. Negative elapsed/duration, wrapped ticks, fractional carry and all admission exits are covered. Early exits preserve clock and carry; event/log effects remain captured. Focused `cargo xtask test-group qvm-move-self-recovery` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
 
 
 
 
 
2659
  ## 2026-10-29 — RE-996 Recover timed mode10 self-recovery
2660
 
2661
  Thirty-six original-QVM cases execute152673 with actual meter child152386. Entity/client existence, mode10, connection2, positive signed health, zero follow and client mask16384 gate processing. Progress uses staged f32 operations32000/(seconds*1000)*signed wrapped elapsed, adds carry, advances clock6324, then runs self-melt completion. Negative elapsed/duration, wrapped ticks, fractional carry and all admission exits are covered. Early exits preserve clock and carry; event/log effects remain captured. Focused `cargo xtask test-group qvm-move-self-recovery` passes with deterministic report regeneration and selected regressions. Full suite deferred to task ten. Original assets unchanged; Python uses the flake-declared Nix runtime.
2662
+
2663
+ ## 2026-10-29 — RE-997 Port timed self-recovery with atomic state updates
2664
+
2665
+ Rust ports actual self-recovery gates, wrapped signed elapsed time, staged f32 progress and the meter child across36 source cases. Admission exits preserve state without reading unused float configuration. Active invalid duration, nonfinite progress or unsupported conversion reject without advancing clock or committing meter/event changes. Unit tests cover wrapped elapsed time, inactive NaN preservation and late-error rollback. Focused `cargo xtask test-group rust-move-self-recovery` 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
@@ -2021,3 +2021,5 @@ RE-974–983 recover routing, command rewriting, inactivity and composed setup t
2021
  - [x] RE-995 Port meter completion and captured thaw effects ([evidence](research/RUST_MOVE_METER.md)).
2022
 
2023
  - [x] RE-996 Recover timed mode10 self-recovery ([evidence](research/QVM_MOVE_SELF_RECOVERY.md)).
 
 
 
2021
  - [x] RE-995 Port meter completion and captured thaw effects ([evidence](research/RUST_MOVE_METER.md)).
2022
 
2023
  - [x] RE-996 Recover timed mode10 self-recovery ([evidence](research/QVM_MOVE_SELF_RECOVERY.md)).
2024
+
2025
+ - [x] RE-997 Port timed self-recovery with atomic state updates ([evidence](research/RUST_MOVE_SELF_RECOVERY.md)).
docs/research/README.md CHANGED
@@ -1555,3 +1555,5 @@ The extension collector adds five focused tests for native tail calls, command-r
1555
  - [RE-995: Port meter completion and captured thaw effects](RUST_MOVE_METER.md).
1556
 
1557
  - [RE-996: Recover timed mode10 self-recovery](QVM_MOVE_SELF_RECOVERY.md).
 
 
 
1555
  - [RE-995: Port meter completion and captured thaw effects](RUST_MOVE_METER.md).
1556
 
1557
  - [RE-996: Recover timed mode10 self-recovery](QVM_MOVE_SELF_RECOVERY.md).
1558
+
1559
+ - [RE-997: Port timed self-recovery with atomic state updates](RUST_MOVE_SELF_RECOVERY.md).
docs/research/RUST_MOVE_SELF_RECOVERY.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Port timed self-recovery with atomic state updates
2
+
3
+ RE-997. Focused validation: `cargo xtask test-group rust-move-self-recovery`. [Machine report](rust-move-self-recovery.json).
4
+
5
+ Rust ports actual self-recovery gates, wrapped signed elapsed time, staged f32 progress and the meter child across36 source cases. Admission exits preserve state without reading unused float configuration. Active invalid duration, nonfinite progress or unsupported conversion reject without advancing clock or committing meter/event changes. Unit tests cover wrapped elapsed time, inactive NaN preservation and late-error rollback.
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 251,
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": 253,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
docs/research/rust-move-self-recovery.json ADDED
@@ -0,0 +1,1159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "limits": "Finite source/Rust contract parity; native time/file/network replies remain supplied or captured.",
3
+ "probes": [
4
+ {
5
+ "rust": {
6
+ "carry_bits": 0,
7
+ "event_entity": [
8
+ 7,
9
+ 2147483649
10
+ ],
11
+ "events": [],
12
+ "flags104": 2147483666,
13
+ "flags220": 2147508226,
14
+ "last": 10000,
15
+ "meter": 6400,
16
+ "pm_type": 4,
17
+ "receiver": 999
18
+ },
19
+ "source": {
20
+ "carry_bits": 0,
21
+ "event_entity": [
22
+ 7,
23
+ 2147483649
24
+ ],
25
+ "events": [],
26
+ "flags104": 2147483666,
27
+ "flags220": 2147508226,
28
+ "last": 10000,
29
+ "meter": 6400,
30
+ "pm_type": 4,
31
+ "receiver": 999
32
+ }
33
+ },
34
+ {
35
+ "rust": {
36
+ "carry_bits": 0,
37
+ "event_entity": [
38
+ 7,
39
+ 2147483649
40
+ ],
41
+ "events": [],
42
+ "flags104": 2147483666,
43
+ "flags220": 2147508226,
44
+ "last": 10000,
45
+ "meter": 1600,
46
+ "pm_type": 4,
47
+ "receiver": 999
48
+ },
49
+ "source": {
50
+ "carry_bits": 0,
51
+ "event_entity": [
52
+ 7,
53
+ 2147483649
54
+ ],
55
+ "events": [],
56
+ "flags104": 2147483666,
57
+ "flags220": 2147508226,
58
+ "last": 10000,
59
+ "meter": 1600,
60
+ "pm_type": 4,
61
+ "receiver": 999
62
+ }
63
+ },
64
+ {
65
+ "rust": {
66
+ "carry_bits": 0,
67
+ "event_entity": [
68
+ 7,
69
+ 2147483649
70
+ ],
71
+ "events": [],
72
+ "flags104": 2147483666,
73
+ "flags220": 2147508226,
74
+ "last": 10000,
75
+ "meter": 0,
76
+ "pm_type": 4,
77
+ "receiver": 999
78
+ },
79
+ "source": {
80
+ "carry_bits": 0,
81
+ "event_entity": [
82
+ 7,
83
+ 2147483649
84
+ ],
85
+ "events": [],
86
+ "flags104": 2147483666,
87
+ "flags220": 2147508226,
88
+ "last": 10000,
89
+ "meter": 0,
90
+ "pm_type": 4,
91
+ "receiver": 999
92
+ }
93
+ },
94
+ {
95
+ "rust": {
96
+ "carry_bits": 1056964608,
97
+ "event_entity": [
98
+ 7,
99
+ 2147483649
100
+ ],
101
+ "events": [],
102
+ "flags104": 2147483666,
103
+ "flags220": 2147508226,
104
+ "last": 9900,
105
+ "meter": 0,
106
+ "pm_type": 4,
107
+ "receiver": 999
108
+ },
109
+ "source": {
110
+ "carry_bits": 1056964608,
111
+ "event_entity": [
112
+ 7,
113
+ 2147483649
114
+ ],
115
+ "events": [],
116
+ "flags104": 2147483666,
117
+ "flags220": 2147508226,
118
+ "last": 9900,
119
+ "meter": 0,
120
+ "pm_type": 4,
121
+ "receiver": 999
122
+ }
123
+ },
124
+ {
125
+ "rust": {
126
+ "carry_bits": 1056964608,
127
+ "event_entity": [
128
+ 7,
129
+ 2147483649
130
+ ],
131
+ "events": [],
132
+ "flags104": 2147483666,
133
+ "flags220": 2147508226,
134
+ "last": 9900,
135
+ "meter": 0,
136
+ "pm_type": 4,
137
+ "receiver": 999
138
+ },
139
+ "source": {
140
+ "carry_bits": 1056964608,
141
+ "event_entity": [
142
+ 7,
143
+ 2147483649
144
+ ],
145
+ "events": [],
146
+ "flags104": 2147483666,
147
+ "flags220": 2147508226,
148
+ "last": 9900,
149
+ "meter": 0,
150
+ "pm_type": 4,
151
+ "receiver": 999
152
+ }
153
+ },
154
+ {
155
+ "rust": {
156
+ "carry_bits": 1056964608,
157
+ "event_entity": [
158
+ 7,
159
+ 2147483649
160
+ ],
161
+ "events": [],
162
+ "flags104": 2147483666,
163
+ "flags220": 2147508226,
164
+ "last": 9900,
165
+ "meter": 0,
166
+ "pm_type": 4,
167
+ "receiver": 999
168
+ },
169
+ "source": {
170
+ "carry_bits": 1056964608,
171
+ "event_entity": [
172
+ 7,
173
+ 2147483649
174
+ ],
175
+ "events": [],
176
+ "flags104": 2147483666,
177
+ "flags220": 2147508226,
178
+ "last": 9900,
179
+ "meter": 0,
180
+ "pm_type": 4,
181
+ "receiver": 999
182
+ }
183
+ },
184
+ {
185
+ "rust": {
186
+ "carry_bits": 1056964608,
187
+ "event_entity": [
188
+ 7,
189
+ 2147483649
190
+ ],
191
+ "events": [],
192
+ "flags104": 2147483666,
193
+ "flags220": 2147508226,
194
+ "last": 9900,
195
+ "meter": 0,
196
+ "pm_type": 4,
197
+ "receiver": 999
198
+ },
199
+ "source": {
200
+ "carry_bits": 1056964608,
201
+ "event_entity": [
202
+ 7,
203
+ 2147483649
204
+ ],
205
+ "events": [],
206
+ "flags104": 2147483666,
207
+ "flags220": 2147508226,
208
+ "last": 9900,
209
+ "meter": 0,
210
+ "pm_type": 4,
211
+ "receiver": 999
212
+ }
213
+ },
214
+ {
215
+ "rust": {
216
+ "carry_bits": 1056964608,
217
+ "event_entity": [
218
+ 7,
219
+ 2147483649
220
+ ],
221
+ "events": [],
222
+ "flags104": 2147483666,
223
+ "flags220": 2147508226,
224
+ "last": 9900,
225
+ "meter": 0,
226
+ "pm_type": 4,
227
+ "receiver": 999
228
+ },
229
+ "source": {
230
+ "carry_bits": 1056964608,
231
+ "event_entity": [
232
+ 7,
233
+ 2147483649
234
+ ],
235
+ "events": [],
236
+ "flags104": 2147483666,
237
+ "flags220": 2147508226,
238
+ "last": 9900,
239
+ "meter": 0,
240
+ "pm_type": 4,
241
+ "receiver": 999
242
+ }
243
+ },
244
+ {
245
+ "rust": {
246
+ "carry_bits": 1056964608,
247
+ "event_entity": [
248
+ 7,
249
+ 2147483649
250
+ ],
251
+ "events": [],
252
+ "flags104": 2147483666,
253
+ "flags220": 2147508226,
254
+ "last": 9900,
255
+ "meter": 0,
256
+ "pm_type": 4,
257
+ "receiver": 999
258
+ },
259
+ "source": {
260
+ "carry_bits": 1056964608,
261
+ "event_entity": [
262
+ 7,
263
+ 2147483649
264
+ ],
265
+ "events": [],
266
+ "flags104": 2147483666,
267
+ "flags220": 2147508226,
268
+ "last": 9900,
269
+ "meter": 0,
270
+ "pm_type": 4,
271
+ "receiver": 999
272
+ }
273
+ },
274
+ {
275
+ "rust": {
276
+ "carry_bits": 1056964608,
277
+ "event_entity": [
278
+ 7,
279
+ 2147483649
280
+ ],
281
+ "events": [],
282
+ "flags104": 2147483666,
283
+ "flags220": 2147508226,
284
+ "last": 9900,
285
+ "meter": 0,
286
+ "pm_type": 4,
287
+ "receiver": 999
288
+ },
289
+ "source": {
290
+ "carry_bits": 1056964608,
291
+ "event_entity": [
292
+ 7,
293
+ 2147483649
294
+ ],
295
+ "events": [],
296
+ "flags104": 2147483666,
297
+ "flags220": 2147508226,
298
+ "last": 9900,
299
+ "meter": 0,
300
+ "pm_type": 4,
301
+ "receiver": 999
302
+ }
303
+ },
304
+ {
305
+ "rust": {
306
+ "carry_bits": 1056964608,
307
+ "event_entity": [
308
+ 7,
309
+ 2147483649
310
+ ],
311
+ "events": [],
312
+ "flags104": 2147483666,
313
+ "flags220": 2147508226,
314
+ "last": 9900,
315
+ "meter": 0,
316
+ "pm_type": 4,
317
+ "receiver": 999
318
+ },
319
+ "source": {
320
+ "carry_bits": 1056964608,
321
+ "event_entity": [
322
+ 7,
323
+ 2147483649
324
+ ],
325
+ "events": [],
326
+ "flags104": 2147483666,
327
+ "flags220": 2147508226,
328
+ "last": 9900,
329
+ "meter": 0,
330
+ "pm_type": 4,
331
+ "receiver": 999
332
+ }
333
+ },
334
+ {
335
+ "rust": {
336
+ "carry_bits": 1056964608,
337
+ "event_entity": [
338
+ 7,
339
+ 2147483649
340
+ ],
341
+ "events": [],
342
+ "flags104": 2147483666,
343
+ "flags220": 2147508226,
344
+ "last": 9900,
345
+ "meter": 0,
346
+ "pm_type": 4,
347
+ "receiver": 999
348
+ },
349
+ "source": {
350
+ "carry_bits": 1056964608,
351
+ "event_entity": [
352
+ 7,
353
+ 2147483649
354
+ ],
355
+ "events": [],
356
+ "flags104": 2147483666,
357
+ "flags220": 2147508226,
358
+ "last": 9900,
359
+ "meter": 0,
360
+ "pm_type": 4,
361
+ "receiver": 999
362
+ }
363
+ },
364
+ {
365
+ "rust": {
366
+ "carry_bits": 1056964608,
367
+ "event_entity": [
368
+ 7,
369
+ 2147483649
370
+ ],
371
+ "events": [],
372
+ "flags104": 2147483666,
373
+ "flags220": 2147508226,
374
+ "last": 9900,
375
+ "meter": 0,
376
+ "pm_type": 4,
377
+ "receiver": 999
378
+ },
379
+ "source": {
380
+ "carry_bits": 1056964608,
381
+ "event_entity": [
382
+ 7,
383
+ 2147483649
384
+ ],
385
+ "events": [],
386
+ "flags104": 2147483666,
387
+ "flags220": 2147508226,
388
+ "last": 9900,
389
+ "meter": 0,
390
+ "pm_type": 4,
391
+ "receiver": 999
392
+ }
393
+ },
394
+ {
395
+ "rust": {
396
+ "carry_bits": 1056964608,
397
+ "event_entity": [
398
+ 7,
399
+ 2147483649
400
+ ],
401
+ "events": [],
402
+ "flags104": 2147483666,
403
+ "flags220": 2147508226,
404
+ "last": 9900,
405
+ "meter": 0,
406
+ "pm_type": 4,
407
+ "receiver": 999
408
+ },
409
+ "source": {
410
+ "carry_bits": 1056964608,
411
+ "event_entity": [
412
+ 7,
413
+ 2147483649
414
+ ],
415
+ "events": [],
416
+ "flags104": 2147483666,
417
+ "flags220": 2147508226,
418
+ "last": 9900,
419
+ "meter": 0,
420
+ "pm_type": 4,
421
+ "receiver": 999
422
+ }
423
+ },
424
+ {
425
+ "rust": {
426
+ "carry_bits": 1056964608,
427
+ "event_entity": [
428
+ 7,
429
+ 2147483649
430
+ ],
431
+ "events": [],
432
+ "flags104": 2147483666,
433
+ "flags220": 2147508226,
434
+ "last": 9900,
435
+ "meter": 0,
436
+ "pm_type": 4,
437
+ "receiver": 999
438
+ },
439
+ "source": {
440
+ "carry_bits": 1056964608,
441
+ "event_entity": [
442
+ 7,
443
+ 2147483649
444
+ ],
445
+ "events": [],
446
+ "flags104": 2147483666,
447
+ "flags220": 2147508226,
448
+ "last": 9900,
449
+ "meter": 0,
450
+ "pm_type": 4,
451
+ "receiver": 999
452
+ }
453
+ },
454
+ {
455
+ "rust": {
456
+ "carry_bits": 1056964608,
457
+ "event_entity": [
458
+ 7,
459
+ 2147483649
460
+ ],
461
+ "events": [],
462
+ "flags104": 2147483666,
463
+ "flags220": 2147508226,
464
+ "last": 9900,
465
+ "meter": 0,
466
+ "pm_type": 4,
467
+ "receiver": 999
468
+ },
469
+ "source": {
470
+ "carry_bits": 1056964608,
471
+ "event_entity": [
472
+ 7,
473
+ 2147483649
474
+ ],
475
+ "events": [],
476
+ "flags104": 2147483666,
477
+ "flags220": 2147508226,
478
+ "last": 9900,
479
+ "meter": 0,
480
+ "pm_type": 4,
481
+ "receiver": 999
482
+ }
483
+ },
484
+ {
485
+ "rust": {
486
+ "carry_bits": 1056964608,
487
+ "event_entity": [
488
+ 7,
489
+ 2147483649
490
+ ],
491
+ "events": [],
492
+ "flags104": 2147483666,
493
+ "flags220": 2147508226,
494
+ "last": 9900,
495
+ "meter": 0,
496
+ "pm_type": 4,
497
+ "receiver": 999
498
+ },
499
+ "source": {
500
+ "carry_bits": 1056964608,
501
+ "event_entity": [
502
+ 7,
503
+ 2147483649
504
+ ],
505
+ "events": [],
506
+ "flags104": 2147483666,
507
+ "flags220": 2147508226,
508
+ "last": 9900,
509
+ "meter": 0,
510
+ "pm_type": 4,
511
+ "receiver": 999
512
+ }
513
+ },
514
+ {
515
+ "rust": {
516
+ "carry_bits": 1056964608,
517
+ "event_entity": [
518
+ 7,
519
+ 2147483649
520
+ ],
521
+ "events": [],
522
+ "flags104": 2147483666,
523
+ "flags220": 2147508226,
524
+ "last": 9900,
525
+ "meter": 0,
526
+ "pm_type": 4,
527
+ "receiver": 999
528
+ },
529
+ "source": {
530
+ "carry_bits": 1056964608,
531
+ "event_entity": [
532
+ 7,
533
+ 2147483649
534
+ ],
535
+ "events": [],
536
+ "flags104": 2147483666,
537
+ "flags220": 2147508226,
538
+ "last": 9900,
539
+ "meter": 0,
540
+ "pm_type": 4,
541
+ "receiver": 999
542
+ }
543
+ },
544
+ {
545
+ "rust": {
546
+ "carry_bits": 1056964608,
547
+ "event_entity": [
548
+ 7,
549
+ 2147483649
550
+ ],
551
+ "events": [],
552
+ "flags104": 2147483666,
553
+ "flags220": 2147508226,
554
+ "last": 9900,
555
+ "meter": 0,
556
+ "pm_type": 4,
557
+ "receiver": 999
558
+ },
559
+ "source": {
560
+ "carry_bits": 1056964608,
561
+ "event_entity": [
562
+ 7,
563
+ 2147483649
564
+ ],
565
+ "events": [],
566
+ "flags104": 2147483666,
567
+ "flags220": 2147508226,
568
+ "last": 9900,
569
+ "meter": 0,
570
+ "pm_type": 4,
571
+ "receiver": 999
572
+ }
573
+ },
574
+ {
575
+ "rust": {
576
+ "carry_bits": 1056964608,
577
+ "event_entity": [
578
+ 7,
579
+ 2147483649
580
+ ],
581
+ "events": [],
582
+ "flags104": 2147483666,
583
+ "flags220": 2147508226,
584
+ "last": 9900,
585
+ "meter": 0,
586
+ "pm_type": 4,
587
+ "receiver": 999
588
+ },
589
+ "source": {
590
+ "carry_bits": 1056964608,
591
+ "event_entity": [
592
+ 7,
593
+ 2147483649
594
+ ],
595
+ "events": [],
596
+ "flags104": 2147483666,
597
+ "flags220": 2147508226,
598
+ "last": 9900,
599
+ "meter": 0,
600
+ "pm_type": 4,
601
+ "receiver": 999
602
+ }
603
+ },
604
+ {
605
+ "rust": {
606
+ "carry_bits": 1056964608,
607
+ "event_entity": [
608
+ 7,
609
+ 2147483649
610
+ ],
611
+ "events": [],
612
+ "flags104": 2147483666,
613
+ "flags220": 2147508226,
614
+ "last": 9900,
615
+ "meter": 0,
616
+ "pm_type": 4,
617
+ "receiver": 999
618
+ },
619
+ "source": {
620
+ "carry_bits": 1056964608,
621
+ "event_entity": [
622
+ 7,
623
+ 2147483649
624
+ ],
625
+ "events": [],
626
+ "flags104": 2147483666,
627
+ "flags220": 2147508226,
628
+ "last": 9900,
629
+ "meter": 0,
630
+ "pm_type": 4,
631
+ "receiver": 999
632
+ }
633
+ },
634
+ {
635
+ "rust": {
636
+ "carry_bits": 1056964608,
637
+ "event_entity": [
638
+ 7,
639
+ 2147483649
640
+ ],
641
+ "events": [],
642
+ "flags104": 2147483666,
643
+ "flags220": 8192,
644
+ "last": 9900,
645
+ "meter": 0,
646
+ "pm_type": 4,
647
+ "receiver": 999
648
+ },
649
+ "source": {
650
+ "carry_bits": 1056964608,
651
+ "event_entity": [
652
+ 7,
653
+ 2147483649
654
+ ],
655
+ "events": [],
656
+ "flags104": 2147483666,
657
+ "flags220": 8192,
658
+ "last": 9900,
659
+ "meter": 0,
660
+ "pm_type": 4,
661
+ "receiver": 999
662
+ }
663
+ },
664
+ {
665
+ "rust": {
666
+ "carry_bits": 1056964608,
667
+ "event_entity": [
668
+ 7,
669
+ 2147483649
670
+ ],
671
+ "events": [],
672
+ "flags104": 2147483666,
673
+ "flags220": 8192,
674
+ "last": 9900,
675
+ "meter": 0,
676
+ "pm_type": 4,
677
+ "receiver": 999
678
+ },
679
+ "source": {
680
+ "carry_bits": 1056964608,
681
+ "event_entity": [
682
+ 7,
683
+ 2147483649
684
+ ],
685
+ "events": [],
686
+ "flags104": 2147483666,
687
+ "flags220": 8192,
688
+ "last": 9900,
689
+ "meter": 0,
690
+ "pm_type": 4,
691
+ "receiver": 999
692
+ }
693
+ },
694
+ {
695
+ "rust": {
696
+ "carry_bits": 1056964608,
697
+ "event_entity": [
698
+ 7,
699
+ 2147483649
700
+ ],
701
+ "events": [],
702
+ "flags104": 2147483666,
703
+ "flags220": 8192,
704
+ "last": 9900,
705
+ "meter": 0,
706
+ "pm_type": 4,
707
+ "receiver": 999
708
+ },
709
+ "source": {
710
+ "carry_bits": 1056964608,
711
+ "event_entity": [
712
+ 7,
713
+ 2147483649
714
+ ],
715
+ "events": [],
716
+ "flags104": 2147483666,
717
+ "flags220": 8192,
718
+ "last": 9900,
719
+ "meter": 0,
720
+ "pm_type": 4,
721
+ "receiver": 999
722
+ }
723
+ },
724
+ {
725
+ "rust": {
726
+ "carry_bits": 0,
727
+ "event_entity": [
728
+ 7,
729
+ 2147483649
730
+ ],
731
+ "events": [],
732
+ "flags104": 2147483666,
733
+ "flags220": 2147508226,
734
+ "last": 9900,
735
+ "meter": 0,
736
+ "pm_type": 4,
737
+ "receiver": 999
738
+ },
739
+ "source": {
740
+ "carry_bits": 0,
741
+ "event_entity": [
742
+ 7,
743
+ 2147483649
744
+ ],
745
+ "events": [],
746
+ "flags104": 2147483666,
747
+ "flags220": 2147508226,
748
+ "last": 9900,
749
+ "meter": 0,
750
+ "pm_type": 4,
751
+ "receiver": 999
752
+ }
753
+ },
754
+ {
755
+ "rust": {
756
+ "carry_bits": 0,
757
+ "event_entity": [
758
+ 7,
759
+ 2147483649
760
+ ],
761
+ "events": [],
762
+ "flags104": 2147483666,
763
+ "flags220": 2147508226,
764
+ "last": 9900,
765
+ "meter": 0,
766
+ "pm_type": 4,
767
+ "receiver": 999
768
+ },
769
+ "source": {
770
+ "carry_bits": 0,
771
+ "event_entity": [
772
+ 7,
773
+ 2147483649
774
+ ],
775
+ "events": [],
776
+ "flags104": 2147483666,
777
+ "flags220": 2147508226,
778
+ "last": 9900,
779
+ "meter": 0,
780
+ "pm_type": 4,
781
+ "receiver": 999
782
+ }
783
+ },
784
+ {
785
+ "rust": {
786
+ "carry_bits": 0,
787
+ "event_entity": [
788
+ 7,
789
+ 2147483649
790
+ ],
791
+ "events": [],
792
+ "flags104": 2147483666,
793
+ "flags220": 2147508226,
794
+ "last": 9900,
795
+ "meter": 1700,
796
+ "pm_type": 4,
797
+ "receiver": 999
798
+ },
799
+ "source": {
800
+ "carry_bits": 0,
801
+ "event_entity": [
802
+ 7,
803
+ 2147483649
804
+ ],
805
+ "events": [],
806
+ "flags104": 2147483666,
807
+ "flags220": 2147508226,
808
+ "last": 9900,
809
+ "meter": 1700,
810
+ "pm_type": 4,
811
+ "receiver": 999
812
+ }
813
+ },
814
+ {
815
+ "rust": {
816
+ "carry_bits": 0,
817
+ "event_entity": [
818
+ 7,
819
+ 2147483649
820
+ ],
821
+ "events": [],
822
+ "flags104": 2147483666,
823
+ "flags220": 2147508226,
824
+ "last": 10,
825
+ "meter": 1664,
826
+ "pm_type": 4,
827
+ "receiver": 999
828
+ },
829
+ "source": {
830
+ "carry_bits": 0,
831
+ "event_entity": [
832
+ 7,
833
+ 2147483649
834
+ ],
835
+ "events": [],
836
+ "flags104": 2147483666,
837
+ "flags220": 2147508226,
838
+ "last": 10,
839
+ "meter": 1664,
840
+ "pm_type": 4,
841
+ "receiver": 999
842
+ }
843
+ },
844
+ {
845
+ "rust": {
846
+ "carry_bits": 0,
847
+ "event_entity": [
848
+ 7,
849
+ 2147483649
850
+ ],
851
+ "events": [],
852
+ "flags104": 2147483666,
853
+ "flags220": 2147508226,
854
+ "last": 10,
855
+ "meter": 416,
856
+ "pm_type": 4,
857
+ "receiver": 999
858
+ },
859
+ "source": {
860
+ "carry_bits": 0,
861
+ "event_entity": [
862
+ 7,
863
+ 2147483649
864
+ ],
865
+ "events": [],
866
+ "flags104": 2147483666,
867
+ "flags220": 2147508226,
868
+ "last": 10,
869
+ "meter": 416,
870
+ "pm_type": 4,
871
+ "receiver": 999
872
+ }
873
+ },
874
+ {
875
+ "rust": {
876
+ "carry_bits": 0,
877
+ "event_entity": [
878
+ 7,
879
+ 2147483649
880
+ ],
881
+ "events": [],
882
+ "flags104": 2147483666,
883
+ "flags220": 2147508226,
884
+ "last": 10,
885
+ "meter": 0,
886
+ "pm_type": 4,
887
+ "receiver": 999
888
+ },
889
+ "source": {
890
+ "carry_bits": 0,
891
+ "event_entity": [
892
+ 7,
893
+ 2147483649
894
+ ],
895
+ "events": [],
896
+ "flags104": 2147483666,
897
+ "flags220": 2147508226,
898
+ "last": 10,
899
+ "meter": 0,
900
+ "pm_type": 4,
901
+ "receiver": 999
902
+ }
903
+ },
904
+ {
905
+ "rust": {
906
+ "carry_bits": 0,
907
+ "event_entity": [
908
+ 7,
909
+ 2147483649
910
+ ],
911
+ "events": [],
912
+ "flags104": 2147483666,
913
+ "flags220": 2147508226,
914
+ "last": 10000,
915
+ "meter": 31999,
916
+ "pm_type": 4,
917
+ "receiver": 999
918
+ },
919
+ "source": {
920
+ "carry_bits": 0,
921
+ "event_entity": [
922
+ 7,
923
+ 2147483649
924
+ ],
925
+ "events": [],
926
+ "flags104": 2147483666,
927
+ "flags220": 2147508226,
928
+ "last": 10000,
929
+ "meter": 31999,
930
+ "pm_type": 4,
931
+ "receiver": 999
932
+ }
933
+ },
934
+ {
935
+ "rust": {
936
+ "carry_bits": 0,
937
+ "event_entity": [
938
+ 7,
939
+ 2147483649
940
+ ],
941
+ "events": [],
942
+ "flags104": 2147483666,
943
+ "flags220": 2147508226,
944
+ "last": 10000,
945
+ "meter": 31999,
946
+ "pm_type": 4,
947
+ "receiver": 999
948
+ },
949
+ "source": {
950
+ "carry_bits": 0,
951
+ "event_entity": [
952
+ 7,
953
+ 2147483649
954
+ ],
955
+ "events": [],
956
+ "flags104": 2147483666,
957
+ "flags220": 2147508226,
958
+ "last": 10000,
959
+ "meter": 31999,
960
+ "pm_type": 4,
961
+ "receiver": 999
962
+ }
963
+ },
964
+ {
965
+ "rust": {
966
+ "carry_bits": 0,
967
+ "event_entity": [
968
+ 7,
969
+ 2147483649
970
+ ],
971
+ "events": [],
972
+ "flags104": 2147483666,
973
+ "flags220": 2147508226,
974
+ "last": 10000,
975
+ "meter": 31999,
976
+ "pm_type": 4,
977
+ "receiver": 999
978
+ },
979
+ "source": {
980
+ "carry_bits": 0,
981
+ "event_entity": [
982
+ 7,
983
+ 2147483649
984
+ ],
985
+ "events": [],
986
+ "flags104": 2147483666,
987
+ "flags220": 2147508226,
988
+ "last": 10000,
989
+ "meter": 31999,
990
+ "pm_type": 4,
991
+ "receiver": 999
992
+ }
993
+ },
994
+ {
995
+ "rust": {
996
+ "carry_bits": 0,
997
+ "event_entity": [
998
+ 305419896,
999
+ 2147483681
1000
+ ],
1001
+ "events": [
1002
+ {
1003
+ "event": 107,
1004
+ "op": "event"
1005
+ },
1006
+ {
1007
+ "format": "436c69656e744d656c7465643a2025690a",
1008
+ "op": "log",
1009
+ "slots": [
1010
+ 2
1011
+ ]
1012
+ }
1013
+ ],
1014
+ "flags104": 2147483650,
1015
+ "flags220": 2147491842,
1016
+ "last": 10000,
1017
+ "meter": 0,
1018
+ "pm_type": 0,
1019
+ "receiver": 999
1020
+ },
1021
+ "source": {
1022
+ "carry_bits": 0,
1023
+ "event_entity": [
1024
+ 305419896,
1025
+ 2147483681
1026
+ ],
1027
+ "events": [
1028
+ {
1029
+ "event": 107,
1030
+ "op": "event"
1031
+ },
1032
+ {
1033
+ "format": "436c69656e744d656c7465643a2025690a",
1034
+ "op": "log",
1035
+ "slots": [
1036
+ 2
1037
+ ]
1038
+ }
1039
+ ],
1040
+ "flags104": 2147483650,
1041
+ "flags220": 2147491842,
1042
+ "last": 10000,
1043
+ "meter": 0,
1044
+ "pm_type": 0,
1045
+ "receiver": 999
1046
+ }
1047
+ },
1048
+ {
1049
+ "rust": {
1050
+ "carry_bits": 0,
1051
+ "event_entity": [
1052
+ 305419896,
1053
+ 2147483681
1054
+ ],
1055
+ "events": [
1056
+ {
1057
+ "event": 107,
1058
+ "op": "event"
1059
+ },
1060
+ {
1061
+ "format": "436c69656e744d656c7465643a2025690a",
1062
+ "op": "log",
1063
+ "slots": [
1064
+ 2
1065
+ ]
1066
+ }
1067
+ ],
1068
+ "flags104": 2147483650,
1069
+ "flags220": 2147491842,
1070
+ "last": 10000,
1071
+ "meter": 0,
1072
+ "pm_type": 0,
1073
+ "receiver": 999
1074
+ },
1075
+ "source": {
1076
+ "carry_bits": 0,
1077
+ "event_entity": [
1078
+ 305419896,
1079
+ 2147483681
1080
+ ],
1081
+ "events": [
1082
+ {
1083
+ "event": 107,
1084
+ "op": "event"
1085
+ },
1086
+ {
1087
+ "format": "436c69656e744d656c7465643a2025690a",
1088
+ "op": "log",
1089
+ "slots": [
1090
+ 2
1091
+ ]
1092
+ }
1093
+ ],
1094
+ "flags104": 2147483650,
1095
+ "flags220": 2147491842,
1096
+ "last": 10000,
1097
+ "meter": 0,
1098
+ "pm_type": 0,
1099
+ "receiver": 999
1100
+ }
1101
+ },
1102
+ {
1103
+ "rust": {
1104
+ "carry_bits": 0,
1105
+ "event_entity": [
1106
+ 305419896,
1107
+ 2147483681
1108
+ ],
1109
+ "events": [
1110
+ {
1111
+ "event": 107,
1112
+ "op": "event"
1113
+ },
1114
+ {
1115
+ "format": "436c69656e744d656c7465643a2025690a",
1116
+ "op": "log",
1117
+ "slots": [
1118
+ 2
1119
+ ]
1120
+ }
1121
+ ],
1122
+ "flags104": 2147483650,
1123
+ "flags220": 2147491842,
1124
+ "last": 10000,
1125
+ "meter": 0,
1126
+ "pm_type": 0,
1127
+ "receiver": 999
1128
+ },
1129
+ "source": {
1130
+ "carry_bits": 0,
1131
+ "event_entity": [
1132
+ 305419896,
1133
+ 2147483681
1134
+ ],
1135
+ "events": [
1136
+ {
1137
+ "event": 107,
1138
+ "op": "event"
1139
+ },
1140
+ {
1141
+ "format": "436c69656e744d656c7465643a2025690a",
1142
+ "op": "log",
1143
+ "slots": [
1144
+ 2
1145
+ ]
1146
+ }
1147
+ ],
1148
+ "flags104": 2147483650,
1149
+ "flags220": 2147491842,
1150
+ "last": 10000,
1151
+ "meter": 0,
1152
+ "pm_type": 0,
1153
+ "receiver": 999
1154
+ }
1155
+ }
1156
+ ],
1157
+ "source_report": "docs/research/qvm-move-self-recovery.json",
1158
+ "source_report_sha256": "118327982d7e3a2ef47541b42879ed0c53319931df4cfb526ac6f045ca8b6b59"
1159
+ }
scripts/analyze_rust_move_self_recovery.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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-move-callbacks'],check=True,capture_output=True)
9
+ binary=Path(os.environ.get('CARGO_TARGET_DIR','target'))/'debug'/'urt-move-callbacks'
10
+ path=Path('docs/research/qvm-move-self-recovery.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 ['meter', 'carry_bits', 'flags220', 'flags104', 'pm_type', 'receiver', 'event_entity', 'events', 'last']},rust=result(binary,'self',encode(p['input']))))
13
+ write_json(Path('docs/research/rust-move-self-recovery.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
+ def encode(a):
16
+ from analyze_qvm_acceleration import word
17
+ return [a['entity'],a['client'],a['mode'],a['connection'],a['health'],a['follow'],a['flags220'],a['flags104'],a['pm_type'],word(a['seconds']),a['meter'],word(a['carry']),a['tick'],a['last'],1,0]
18
+ if __name__=='__main__':main()
scripts/test_rust_move_self_recovery.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-move-self-recovery.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-move-self-recovery.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
@@ -3848,3 +3848,29 @@ report scripts/analyze_qvm_move_self_recovery.py docs/research/qvm-move-self-rec
3848
  edge docs/research/qvm-move-self-recovery.json scripts/test_qvm_move_self_recovery.py
3849
  group qvm-move-self-recovery scripts/analyze_qvm_move_self_recovery.py
3850
  edge scripts/analyze_qvm_move_self_recovery.py scripts/analyze_qvm_resumer_audit.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3848
  edge docs/research/qvm-move-self-recovery.json scripts/test_qvm_move_self_recovery.py
3849
  group qvm-move-self-recovery scripts/analyze_qvm_move_self_recovery.py
3850
  edge scripts/analyze_qvm_move_self_recovery.py scripts/analyze_qvm_resumer_audit.py
3851
+ report scripts/analyze_rust_move_self_recovery.py docs/research/rust-move-self-recovery.json
3852
+ edge docs/research/rust-move-self-recovery.json scripts/test_rust_move_self_recovery.py
3853
+ group rust-move-self-recovery scripts/analyze_rust_move_self_recovery.py
3854
+ edge scripts/analyze_rust_move_self_recovery.py scripts/analyze_qvm_resumer_audit.py
3855
+ edge Cargo.toml scripts/analyze_rust_move_self_recovery.py
3856
+ edge Cargo.lock scripts/analyze_rust_move_self_recovery.py
3857
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_move_self_recovery.py
3858
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_move_self_recovery.py
3859
+ edge crates/urt-gameplay/src/filter_loading.rs scripts/analyze_rust_move_self_recovery.py
3860
+ edge crates/urt-gameplay/src/filter_lifecycle.rs scripts/analyze_rust_move_self_recovery.py
3861
+ edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_move_self_recovery.py
3862
+ edge crates/urt-gameplay/src/bin/urt-filter-loading.rs scripts/analyze_rust_move_self_recovery.py
3863
+ edge crates/urt-gameplay/src/qvm_format.rs scripts/analyze_rust_move_self_recovery.py
3864
+ edge docs/research/qvm-move-self-recovery.json scripts/analyze_rust_move_self_recovery.py
3865
+ group rust-move-self-recovery scripts/analyze_rust_health_impulse.py
3866
+ group gameplay scripts/analyze_rust_move_self_recovery.py
3867
+ edge crates/urt-gameplay/src/filter_commands.rs scripts/analyze_rust_move_self_recovery.py
3868
+ edge crates/urt-gameplay/src/bin/urt-filter-commands.rs scripts/analyze_rust_move_self_recovery.py
3869
+ edge crates/urt-gameplay/src/client_timer.rs scripts/analyze_rust_move_self_recovery.py
3870
+ edge crates/urt-gameplay/src/bin/urt-client-timer.rs scripts/analyze_rust_move_self_recovery.py
3871
+ edge crates/urt-gameplay/src/client_processing.rs scripts/analyze_rust_move_self_recovery.py
3872
+ edge crates/urt-gameplay/src/bin/urt-client-processing.rs scripts/analyze_rust_move_self_recovery.py
3873
+ edge crates/urt-gameplay/src/client_move_context.rs scripts/analyze_rust_move_self_recovery.py
3874
+ edge crates/urt-gameplay/src/bin/urt-client-move-context.rs scripts/analyze_rust_move_self_recovery.py
3875
+ edge crates/urt-gameplay/src/move_callbacks.rs scripts/analyze_rust_move_self_recovery.py
3876
+ edge crates/urt-gameplay/src/bin/urt-move-callbacks.rs scripts/analyze_rust_move_self_recovery.py
xtask/src/lib.rs CHANGED
@@ -1137,6 +1137,7 @@ mod integration_tests {
1137
  ("client_move_context", "client_move_context"),
1138
  ("client_move_context", "client_move_assembly"),
1139
  ("move_callbacks", "move_meter"),
 
1140
  ("client_move_context", "client_move_scratch"),
1141
  ("client_processing", "client_routing"),
1142
  ("client_timer", "client_routing"),
@@ -1356,6 +1357,7 @@ mod integration_tests {
1356
  ("qvm-client-move-context", "client_move_context"),
1357
  ("qvm-client-move-assembly", "client_move_assembly"),
1358
  ("qvm-move-meter", "move_meter"),
 
1359
  ("qvm-client-move-scratch", "client_move_scratch"),
1360
  ("qvm-client-routing", "client_routing"),
1361
  ("qvm-client-command-rewrite", "client_command_rewrite"),
 
1137
  ("client_move_context", "client_move_context"),
1138
  ("client_move_context", "client_move_assembly"),
1139
  ("move_callbacks", "move_meter"),
1140
+ ("move_callbacks", "move_self_recovery"),
1141
  ("client_move_context", "client_move_scratch"),
1142
  ("client_processing", "client_routing"),
1143
  ("client_timer", "client_routing"),
 
1357
  ("qvm-client-move-context", "client_move_context"),
1358
  ("qvm-client-move-assembly", "client_move_assembly"),
1359
  ("qvm-move-meter", "move_meter"),
1360
+ ("qvm-move-self-recovery", "move_self_recovery"),
1361
  ("qvm-client-move-scratch", "client_move_scratch"),
1362
  ("qvm-client-routing", "client_routing"),
1363
  ("qvm-client-command-rewrite", "client_command_rewrite"),